Необходимо запретить отправку почты с сервера/сайта на все адреса, за исключением списка разрешенных (например, есть тестовый сервер разработки и в нем присутствуют реальные адреса клиентов, которые могут получать письма от тестового сервера, что очень нежелательно)
Особенность в том, что php-функция mail использует бинарник sendmail для отправки писем.
Например, настройки sendmail для отправки почты функции mail php в режиме работы как модуль Apache может иметь следующий вид
1 |
# nano /etc/php/5.6/apache2/php.ini |
1 2 3 |
SMTP = localhost smtp_port = 25 sendmail_path = /usr/sbin/sendmail -t -i -f www-data@mysitename.com |
При использовании бинарника sendmail нет возможности применить стандартные правила SMTP-ограничений в Postfix т.к. ограничения smtpd_*_restrictionsприменяютя только к письмам, полученным демоном smtpd через транзакцию SMTP
Сообщения, отправленные с использованием команды sendmail, помещаются в очередь maildrop командой postdrop, которая подбирается процессом pickup и передаются процессу cleanup.
Поэтому Вы не можете ограничивать отправку почты, отправленной через команду sendmail.
Как вариант, в коде необходимо использовать отправку только через smtp-соединение.
Альтернативным вариантом является использование альтернативного SMTP-клиента msmtp, который будет просто передавать полученную почту на локальный почтовый сервер Postfix, на котором уже будет настроена SMTP-ограничение на запрет отправки на любой ящик, кроме списка исключений.
1.Настройка Postfix
1 |
# nano /etc/postfix/main.cf |
1 2 3 4 5 6 |
smtpd_delay_reject = yes smtpd_client_restrictions = smtpd_helo_restrictions = smtpd_sender_restrictions = smtpd_relay_restrictions = smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/maps/access_recipients,reject_unauth_destination |
1 |
# mkdir /etc/postfix/maps |
1 |
# nano /etc/postfix/maps/access_recipients |
1 2 |
allowemail1@domain1.com OK allowemail2@domain2.com OK |
1 |
# postmap /etc/postfix/maps/access_recipients |
1 |
# postfix check && service postfix reload |
2.Установка msmtp
SMTP-клиент msmtp будет использоваться вместо бинарника sendmail
Установка зависимостей (пакет texinfo содержит необходимую для сборки утилиту makeinfo)
1 |
# apt-get install texinfo libgnutls-dev |
1 |
# cd /opt && git clone git://git.code.sf.net/p/msmtp/code msmtp |
1 |
# cd msmtp && autoreconf -i |
В Ubuntu14 поставляется gettext версии 0.18 (в отличии от Ubuntu16, где используется gettext версии 0.19), поэтому для Ubuntu14 выполняем
1 |
# nano po/Makefile.in.in |
1 |
GETTEXT_MACRO_VERSION = 0.18 |
Если оставить дефолтное значение в файле po/Makefile.in.in
1 |
GETTEXT_MACRO_VERSION = 0.19 |
То при выполнении команды ./configure получаем ошибку
1 |
*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version 0.19 but the autoconf macros are from gettext version 0.18 |
https://sourceforge.net/p/msmtp/mailman/message/33094733/
1 |
# ./configure |
1 |
# make |
1 |
# make install |
Получение базовой информации
1 |
# msmtp --version |
3.Настройка конфигурационного файла msmtprc
В данном примере отправка происходит локально(host localhost) без аутентификации(auth off) и шифрования(tls off), с указанием адреса, который будет использоваться в заголовке From:
1 |
# nano /etc/msmtprc |
1 2 3 4 5 6 7 8 |
defaults port 25 tls off account default host localhost from www-data@mysitename.com auth off |
4.Настройка PHP, работающего, как модуль Apache для использования msmtp вместо sendmail
1 |
# nano /etc/php/5.6/apache2/php.ini |
1 2 3 |
[mail function] smtp_port = 25 sendmail_path = /usr/local/bin/msmtp -C /etc/msmtprc -t -i |
1 |
# apache2ctl configtest && service apache2 restart |
5.Тестирование
Проверяем с командной строки, что отправка на адрес, который не указан в файле
1 |
/etc/postfix/maps/access_recipients |
невозможна т.к. срабатывает правило в SMTP-ограничниях Postfix
1 |
reject_unauth_destination |
1 |
# cat /root/email.txt |
1 |
Test message from Sendmail CLI |
1 |
# /usr/local/bin/msmtp -C /etc/msmtprc -t -i myemail@gmail.com < /root/email.txt |
1 2 3 |
msmtp: recipient address myemail@gmail.com not accepted by the server msmtp: server message: 554 5.7.1 < myemail@gmail.com>: Relay access denied msmtp: could not send mail (account default from /etc/msmtprc) |
При этом отправка на любой из разрешенных адресов в файле происходит успешно
1 |
/etc/postfix/maps/access_recipients |
Тестируем оправку из файла на сайте
В корне сайта создаем файл для проверки отправки с сайта
1 |
# nano testmail.php |
1 2 3 |
<?php mail ('myemail@gmail.com', "Test letter", "Test mail from php-script"); ?> |
Обращаемся к скрипту в браузере
1 |
http://mysitename.com/testmail.php |
В логах виден отказ в отправке сообщения на адрес, который отсутствует в разрешенных
1 |
NOQUEUE: reject: RCPT from localhost[127.0.0.1]: 554 5.7.1 <myemail@gmail.com>: Relay access denied; from=<www-data@mysitename.com> to=<myemail@gmail.com> proto=ESMTP helo=<localhost> |
Источник:
1.https://serverfault.com/questions/586909/configure-postfix-to-block-php-sent-mail-to-certain-recipients
2.http://msmtp.sourceforge.net/download.html