Я запускаю общий сервер для веб-сайтов моих клиентов (ubuntu 16.04). Я запускаю exim, чтобы разрешить сайтам отправлять электронную почту. Он также действует как пересылка почты и smtp-сервер для почтового программного обеспечения моих клиентов (или просто gmail), позволяя им отправлять электронную почту от своих пересылщиков.
В настоящее время я ограничиваю отправку электронных писем для удаленных пользователей, чтобы разрешить адрес "от" только в том случае, если он соответствует их имени пользователя smtp (чтобы один клиент не мог отправлять электронную почту как другой клиент). Пользователи удаленного smtp не являются пользователями системы, это просто учетные данные, хранящиеся в файле passwd. Это прекрасно работает.
Единственное электронное письмо, отправленное локальными пользователями, - это скрипты php. Каждый веб-сайт работает как отдельный пользователь. Например. example.com запускается как пользователь «example», test.com запускается как пользователь «test». Мой вопрос: как я могу ограничить учетные записи локальных пользователей, чтобы они могли отправлять электронную почту только из одного домена? Так что пользовательский "test" может отправлять сообщения с anyaddress@test.com, но не может отправлять сообщения с anyaddress@example.com?
В идеале я бы хотел, чтобы тестовый скрипт просматривал файл, например conf/env{USER}/allowed-from-domains
и протестируйте домен From:
поле, чтобы убедиться, что он был в этом файле.
Конфигурация ниже заставляет exim блокировать сообщения от пользователей example
и test
когда From
заголовок не содержит «@ example.com» или «@ test.net» соответственно.
Я использую системный фильтр для проверки From
строка заголовка, которая доступна только после того, как сообщение принято.
exim.conf:
system_filter = /etc/exim/system_filter.conf
qualify_domain = mydomain.net
system_filter.conf:
if $sender_address is "example@$qualify_domain" and not $h_from contains "@example.com"
or $sender_address is "test@$qualify_domain" and not $h_from contains "@test.net"
then
seen finish
endif
тестировать исходящую почту для локального пользователя test
test.php
#!/bin/php
<?php
mail( "me@gmail.com", "Pass Test", "My message", "From: Me <anything@test.net>" );
mail( "me@gmail.com", "Fail Test", "My message", "From: Me <anything@nottest.net>" );
?>
Примечания к веб-серверу
Все это предполагает, что php каким-то образом вызывается учетной записью пользователя. Возможно, для этого вам потребуется перенастроить ваш веб-сервер. Например, веб-сервер apache обычно запускает сценарии от имени пользователя «apache», а не «test» или «example», что нам и нужно. Apache необходимо настроить с помощью чего-то вроде mod_privileges.c или mpm-itk.
Если ваш веб-сервер настроен на использование режима CGI / FastCGI, вы можете сделать это, добавив разделы [HOST = example.com] и [HOST = test.net] в php.ini.
Ссылки: