Подтвердить что ты не робот

Как работает PHP `mail`?

Функция PHP mail, кажется, доставляет почту в чистую систему, без видимой конфигурации, выполненной администратором или веб-мастером (без конфигурации SMTP в php.ini и т.д.). Как функция mail доставляет почту на удаленный сервер?

4b9b3361

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