smtpd_recipient_restrictions работает, но не всегда
Я имею POSTFIX
настроить фильтрацию определенных адресов электронной почты. main.cf
файл содержит:
smtpd_recipient_restrictions =
check_recipient_access hash:/etc/postfix/blacklist,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
permit
Когда я пытаюсь отправить электронное письмо на один из адресов в черном списке, я получаю сообщение об ошибке 554 5.7.1 Access denied.
как и должно быть. Также, когда я пытаюсь отправить через telnet, сообщение блокируется. Однако на этом сервере установлено почтовое программное обеспечение, которое php
на основе и использует swiftmailer для отправки сообщений. Когда я пытаюсь отправить сообщение с помощью этого программного обеспечения, любое сообщение на один из заблокированных адресов проходит.
Что может быть причиной этого? Как я могу отследить это и отладить это?
2 ответа
Существует два способа отправки почты, если на локальном компьютере запущен SMTP-сервер.
Вы можете использовать протокол SMTP (как и любой другой удаленный клиент), подключиться к порту 25 локального хоста и выполнить весь SMTP-разговор. В этом случае применяются ограничения клиента smtpd.
Или вы просто запускаете sendmail
двоичный файл с соответствующими аргументами. В этом случае вы не используете протокол SMTP, следовательно, ограничения не применяются.
Например, функция php mail() в linux будет использовать второй метод, используя по умолчанию sendmail -t -i
команда, или что-то настроено в php.ini
как sendmail_path
Swiftmailer поддерживает оба метода, поэтому вы можете изменить код для использования smtp вместо sendmail. Смотрите здесь http://swiftmailer.org/docs/sending.html
Если бы вы добавили -v
в команды, например. smtpd
, в /etc/postfix/master.cf
а также postfix reload
, вы увидите множество деталей, как postfix проверяет вашу входящую почту.
Тем не мение, smtpd_recipient_restrictions
обычно проверяет RCPT TO
команда. И как ваше приложение PHP проходит ваш smtpd_recipient_restrictions
таким образом, это должно пройти через pickup
(sendmail-like
команда), а не через SMTP.
ИМО дает mail()
Функция в PHP напрашивается на неприятности. Я бы порекомендовал вам отключить его (есть несколько способов...):
# env -i php-7.0 -r 'echo function_exists("mail") ? "yes\n" : "no\n";'
no
Также фильтрация по pickup
сложнее.
Я также сомневаюсь, что тема ясна. Мне кажется, что вы пытаетесь ограничить отправку самого приложения PHP, поэтому, вероятно, лучше использовать другие ограничения, например. Привет, отправитель или AUTH через порт отправки.