PHP的`mail`如何工作?

时间:2012-08-04 20:18:01

标签: email php

PHP的mail函数似乎在干净的系统上传递邮件,管理员或网站管理员没有明显的配置(php.ini中没有SMTP配置等)。 mail函数如何将邮件传递到远程服务器?

4 个答案:

答案 0 :(得分:25)

在* nix上,它调用sendmail二进制文件,然后使用邮件配置来路由电子邮件。在Windows上,它将发送到SMTP服务器。在这两种情况下,sysadmin都会设置邮件系统。

答案 1 :(得分:8)

您可以按照以下方式检测其工作原理。

第一种方法

$ 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

上述命令的结果显示了已执行命令的顺序。

答案 2 :(得分:4)

mail()使用sendmail,它使用DNS查找目标域的MX记录并直接在那里传递。而已。

并且由于目标服务器可能不知道您的IP地址,特别是如果它是NAT,它可能被标记为垃圾邮件。

您可以修改您的配置,以使用不同的(合法广告已知)smtp服务器充当中介。

答案 3 :(得分:3)

实际上,除非基础sendmail或其他内容已正确配置,否则实际上并不可靠。

Amazon SES拥有比您正在使用的服务器更好的服务器,并且在那里收到的邮件比mail()更多。

您不应该使用mail()的真正原因是因为您的服务器的IP地址可能完全不为GMail,Yahoo等邮件服务所知,并且它被标记为垃圾邮件的可能性更高。为什么它被标记为垃圾邮件?因为mail()非常容易且易于用于垃圾邮件目的。