у меня есть 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 для отправки сообщений. Когда я пытаюсь отправить сообщение с помощью этого программного обеспечения, любое сообщение на один из заблокированных адресов проходит.
В чем может быть причина? Как я могу отследить это и отладить это?
Есть два метода отправки почты, если на локальном компьютере работает SMTP-сервер.
Вы можете использовать протокол smtp (как и любой другой удаленный клиент), подключиться к порту 25 localhost и вести все разговоры по 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-приложения, поэтому, вероятно, лучше использовать другие ограничения, например. HELO, отправитель или AUTH через порт отправки.