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 через порт отправки.

Другие вопросы по тегам