Функция PHP mail
, кажется, доставляет почту в чистую систему, без видимой конфигурации, выполненной администратором или веб-мастером (без конфигурации SMTP в php.ini
и т.д.). Как функция mail
доставляет почту на удаленный сервер?
Как работает PHP `mail`?
Ответ 1
В * nix он вызывает двоичный файл sendmail
, который затем использует конфигурацию почты для маршрутизации электронной почты. В Windows он отправляется на SMTP-сервер. В обоих случаях sysadmin устанавливает почтовую систему.
Ответ 2
Вы можете определить, как это работает, как показано ниже.
Первый метод
$ ltrace php -r "mail('[email protected]', '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('[email protected]', '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
Результаты приведенной выше команды показывают последовательность выполняемых команд.
Ответ 3
На самом деле это не так надежно, если только базовый sendmail
или что-то не настроено правильно.
Amazon SES имеет лучшие серверы, чем любой сервер, который вы используете, и получает почту там больше, чем с mail()
.
Настоящая причина, по которой вы не должны использовать mail()
, заключается в том, что ваш IP-адрес сервера, вероятно, полностью неизвестен почтовым службам, таким как GMail, Yahoo и т.д., и есть более высокий шанс, что он будет отмечен как спам. Почему он становится помеченным как спам? Потому что mail()
очень легко и просто использовать для спама.
Ответ 4
mail() использует sendmail, который использует DNS для поиска записи MX целевого домена и отправляет туда напрямую. это оно.
и поскольку сервер назначения, вероятно, не знает ваш IP-адрес, особенно если он NAT, он может быть помечен как спам.
вы можете изменить свою конфигурацию, чтобы использовать другой (легированный ad) smtp-сервер, чтобы действовать как посредник.