mail
функция PHP, кажется, доставляет почту в чистую систему, без видимой настройки, выполненной администратором или веб-мастером (без конфигурации SMTP в php.ini
и т. Д.). Как mail
функция доставляет почту на удаленный сервер?
В * nix он вызывает двоичный файл sendmail
, который затем использует конфигурацию почты для маршрутизации электронной почты. В Windows он отправляется на SMTP-сервер. В обоих случаях sysadmin устанавливает почтовую систему.
Вы можете определить, как это работает, как показано ниже.
$ ltrace php -r "mail('tester@127.0.0.1', 'Test', 'Hello world');" 2>&1 | grep sendmail memcpy(0x095ea168, "sendmail_from", 14) = 0x095ea168 memcpy(0x095ea1e0, "sendmail_path", 14) = 0x095ea1e0 popen("/usr/sbin/sendmail -t -i ", "w") = 0x0977c7c0
Из результатов приведенной выше команды видно, что функция popen()
открывает процесс /usr/sbin/sendmail -t -i
.
$ ls -l /usr/sbin/sendmail ... /usr/sbin/sendmail -> exim4
Таким образом, sendmail
является символической ссылкой на exim4
и, следовательно, sendmail -t -i
вызывает exim4 -t -i
.
И на странице руководства exim4
вы можете прочитать об этих параметрах -t -i
:
$ man exim4 | grep ' -t -i' -ti This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail.
Установите snoopy и запустите:
# grep snoopy /var/log/auth.log | tail ... php -r mail('tester@127.0.0.1', 'Test', 'Hello world'); ... /usr/sbin/sendmail -t -i ... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw ... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw ... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj
Результаты приведенной выше команды показывают последовательность команд, которые были выполнены.
На самом деле это не так надежно, если только основной sendmail
или что-то не настроено правильно.
Amazon SES имеет лучшие серверы, чем любой сервер, который вы используете, и получает почту там чаще, чем с помощью mail()
.
Настоящая причина, по которой вы не должны использовать mail()
заключается в том, что IP-адрес вашего сервера, вероятно, полностью неизвестен почтовым службам, таким как GMail, Yahoo и т. Д., И есть более высокий шанс, что он будет отмечен как спам. Почему он становится помеченным как спам? Поскольку mail()
очень легко и просто использовать для целей спама.
mail () использует sendmail, который использует DNS для поиска записи MX целевого домена и отправляет туда напрямую. это оно.
и поскольку сервер назначения, вероятно, не знает ваш IP-адрес, особенно если он NATAT, он может быть помечен как спам.
вы можете изменить свою конфигурацию, чтобы использовать другой (легированный ad) smtp-сервер, чтобы действовать как посредник.