Назад | Перейти на главную страницу

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 для отправки сообщений. Когда я пытаюсь отправить сообщение с помощью этого программного обеспечения, любое сообщение на один из заблокированных адресов проходит.

В чем может быть причина? Как я могу отследить это и отладить это?

Есть два метода отправки почты, если на локальном компьютере работает 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 через порт отправки.