Как работает «почта» PHP?

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