PHP的`mail`如何工作?

Tom*_*nal 36 php email

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

Ign*_*ams 25

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

  • @Tom:人们已经注意到了措辞而不是问题. (5认同)
  • 谢谢你回答我问的问题.我不确定PHP是否正在联系远程服务器本身并处理SMTP,或者是否将该任务移交给本地服务器上的MTA.另外,你知道为什么这个问题被投票了吗?我想很多人都误解了它.它似乎符合网站的范围(由[FAQ](http://stackoverflow.com/faq)定义). (2认同)

Apo*_*tle 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
Run Code Online (Sandbox Code Playgroud)

从上面命令的结果可以看出该popen()函数打开了进程/usr/sbin/sendmail -t -i.

$ ls -l /usr/sbin/sendmail
... /usr/sbin/sendmail -> exim4
Run Code Online (Sandbox Code Playgroud)

因此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.
Run Code Online (Sandbox Code Playgroud)

第二种方法

安装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
Run Code Online (Sandbox Code Playgroud)

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


小智 6

mail() 使用 sendmail,它使用 DNS 查找目标域的 MX 记录并直接发送到那里。就是这样。

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

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


Dav*_*vid 5

事实上,除非底层sendmail或某些东西配置正确,否则它实际上并不那么可靠。

Amazon SES 拥有比您使用的任何服务器更好的服务器,并且比mail().

您不应该使用的真正原因mail()是,您的服务器的 IP 地址可能对于 GMail、Yahoo 等邮件服务完全未知,并且更有可能被标记为垃圾邮件。为什么它会被标记为垃圾邮件?因为mail()很容易被利用来发送垃圾邮件。

  • 这并没有真正回答问题,即它是如何工作的。我使用 SES 来做其他事情。这只是想知道它在没有配置的全新安装中如何工作,而不是为什么它被标记为垃圾邮件或我应该使用什么。不过还是谢谢你的回答。 (3认同)