为什么不推荐使用PHP的mail()函数?

32

当涉及到使用PHP发送电子邮件消息时,普遍的意见是要避免使用PHP内置的mail()函数,而是使用库。

我想知道使用mail()而不是库或扩展的实际原因和缺陷。例如,在标准的mail()调用中没有包含的常用指定头。


1
好问题。我自己倾向于使用mail()函数。对于某些人来说,它可能太低级了,并且没有针对某些事情的现成选项,比如附加文件或发送HTML。人们可能不喜欢为这些类型的事情添加自己的头文件并创建自己的类/函数。 - dqhendricks
1
我已经编写 PHP 代码超过10年了,从未听说过这个“普遍观点”。此外,我不知道邮件功能存在任何问题。我专门在 Linux 上工作,所以我不知道 Windows 上的情况,可能在 Windows 上使用 mail() 函数会有一些问题。 - Dmitri
4个回答

20

引用

PHP的mail()函数的缺点

在某些情况下,通过PHP mail()发送的邮件虽然没有出现任何错误消息,但收件人无法接收邮件。造成这种问题的最常见原因如下:

  • 电子邮件标题或内容格式不正确(例如Windows / Unix之间的行换行符差异)
  • 您的服务器未安装或配置sendmail(php.ini文件)
  • 收件人邮件服务提供商不允许通过PHP mail()发送邮件;这是常见的垃圾邮件保护措施。

标题或内容格式错误可能会导致邮件被视为垃圾邮件。在最好的情况下,此类邮件将传输到您收件箱的垃圾邮件文件夹或返回给发件人。在最坏的情况下,此类邮件将被删除而不做任何评论。如果sendmail未安装或未配置,则根本无法发送邮件。

像GMX这样的免费邮件提供商通常会拒绝通过PHP函数mail()发送的邮件。这类邮件通常会被删除而不提供任何有关收件人的信息。


7

据说PHP的mail()函数会破坏邮件头并且运行缓慢。我个人没有使用过它,因为像你一样,我也被建议不要使用它。如果您查看PHP手册中mail()条目的评论,您可以看到人们遇到的一些问题(特别是与邮件头相关的问题)。

根据手册本身的说明,它绝对不适合发送大量的电子邮件:

值得注意的是,mail()函数不适合在循环中发送大量的电子邮件。该函数为每封电子邮件打开和关闭一个SMTP套接字,这并不是非常高效的。

对于发送大量电子邮件,请参阅» PEAR::Mail和» PEAR::Mail_Queue软件包。

据我所知,无论您发送多少邮件,每个消息都打开和关闭一个套接字从性能上来说都不是首选。

基本上,它是一个能工作但并不完美的函数,并被许多更好的库所取代。


1
那些“更好”的库是什么(对于一直使用mail()的可怜人来说)? - JakeParis
@JMC,手册推荐使用Mail和Mail_Queue。实际上这取决于你问谁以及你使用的邮件服务器是什么。 - Rafe Kettler

5
重要的不仅是mail()函数,还有你所使用的smtp服务器。我用过三个不同的smtp服务器:postfix、qmail和sendmail。
在我的经验中,postfix是与php mail()最容易配合使用的,但即使是postfix也会遇到一些问题。你会遇到一些小错误,比如“to”收件人接收到正确结构的电子邮件,“bcc”收件人接收到损坏的电子邮件。你将花费很多时间来解决这些错误。而且你的修复可能会导致你的代码无法与其他smtp服务器正常工作。
问题出现在邮件头的处理上,PHP在这方面做得不好。最近我转换到了“PHP Mailer”库。在我们的网站上,我们有两个smtp服务器,一个是postfix,一个是qmail。“PHP Mailer”可以在没有额外配置的情况下与它们两个配合使用。

0
最大的原因是mail()可以直接与邮件服务器通信,如果您在对输入进行消毒时不知道自己在做什么,黑客可能会伪造您的邮件服务器,发送除您意外的邮件。大多数第三方库都具有更好的消毒(或更好的API),以帮助防止此类情况发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接