大多数 CMS(例如 Joomla)php mail()
都默认提供,并且可以根据SMTP
需要进行更改。我将在 Debian 7 上的同一 VPS 中设置 Web 服务器和邮件服务器(Postfix)。我想了解的是:
送货信誉:使用 php mail() 与 SMTP 会对投递率产生影响吗?据我所知,Postfix 在发送电子邮件时将使用 SMTP 协议与互联网上的其他服务器进行通信,因此是否可以安全地假设电子邮件是通过 php mail 还是从本地主机 smpt 发送到 postfix 无关紧要?这两种方法中的任何一种是否会以任何方式影响电子邮件信誉,哪怕只是轻微的影响?
性能负荷:发送电子邮件时,php mail 和 SMTP 之间是否存在性能差异?比如说,如果我要发送 10,000 封电子邮件,哪种方法会占用最多的资源(或时间)?我的假设是,两者都需要一些时间,例如:php mail 用于编译带有标题的电子邮件等,而 SMTP 用于每次建立连接。哪一个消耗最多的服务器资源?
安全问题:当我搜索两者之间的区别时,许多网站都提到了 php 邮件的安全问题,因为黑客可以上传 php 脚本来发送垃圾邮件。但我还看到 SMTP 的另一个安全问题,因为 SMTP 用户名和密码以文本形式存储在配置文件中,这也不安全。既然这两种方法都存在安全问题,那么哪种方法在任何方面都比另一种更好吗?
偏爱:如果我能够在服务器上同时设置 phpmail 和 SMTP,我是否应该出于某种原因优先使用其中一个?我的意思是,如果我可以在服务器上使用 SMTP,那么我是否应该尝试使用 SMTP 而不是 phpmail,因为上述几点中涵盖了各种原因?
背景:我的机器将成为一个简单的 Web 服务器,它使用 Postfix 仅用于从 Joomla 发送电子邮件、新闻通讯和来自各种服务的根电子邮件。
答案1
送货信誉:使用 php mail() 与 SMTP 会对投递率产生影响吗?据我所知,Postfix 在发送电子邮件时将使用 SMTP 协议与互联网上的其他服务器进行通信,因此是否可以安全地假设电子邮件是通过 php mail 还是从本地主机 smpt 发送到 postfix 无关紧要?这两种方法中的任何一种是否会以任何方式影响电子邮件信誉,哪怕只是轻微的影响?
没有相关的。Postfix 可以收到通过 mail() 和 SMTP 发送电子邮件。处理后,postfix 将发送通过 SMTP。
性能负荷:发送电子邮件时,php mail 和 SMTP 之间是否存在性能差异?比如说,如果我要发送 10,000 封电子邮件,哪种方法会占用最多的资源(或时间)?我的假设是,两者都需要一些时间,例如:php mail 用于编译带有标题的电子邮件等,而 SMTP 用于每次建立连接。哪一个消耗最多的服务器资源?
进行基准测试!我没有这方面的任何数据。
这里 mail() 和 SMTP 涉及什么过程?
在 mail() 命令中,PHP 调用 sendmail 命令,程序将您的电子邮件放在 maildrop 队列目录中的文件中。Pickup 守护进程扫描该目录,并将电子邮件移至清理守护进程。
在 SMTP 中,PHP 通过 SMTPd 建立到您的 postfix 服务器的连接。完成 SMTP 程序后,SMTPd 将检查电子邮件是否允许。如果电子邮件允许,它将把它传递给清理守护进程。
安全问题:当我搜索两者之间的区别时,许多网站都提到了 php 邮件的安全问题,因为黑客可以上传 php 脚本来发送垃圾邮件。但我还看到 SMTP 的另一个安全问题,因为 SMTP 用户名和密码以文本形式存储在配置文件中,这也不安全。既然这两种方法都存在安全问题,那么哪种方法在任何方面都比另一种更好吗?
正如@Tutul在另一个回答中所说,您可能希望某些垃圾邮件脚本使用mail()发送垃圾邮件。 是的,这是在php中阻止邮件命令的考虑因素之一。
但有一个原则是成立的:一旦有人成功将脚本放入你的网络和邮件服务器,他就可以使用 PHP 的功能通过 mail() 和 SMTP 发送电子邮件。
在 php 本身中,没有保护措施来限制垃圾邮件发送者可以调用多少个 SMTP 连接或 mail()。放置防线的一个地方是 MTA(postfix)。不幸的是,您无法限制从 mail() 命令调用的传入邮件。但是,您可以限制从 SMTP 连接发出的发送请求数量。政策或者后发可以帮助 postfix 限制它。
注意:以上解释是关于接收电子邮件时限制进程。当然,您可以在发送电子邮件时限制它。例如,您限制每分钟向 @gmail.com 发送 20 封电子邮件,以避免 GMAIL 黑名单守护程序阻止您。请参阅有关Postfix 性能调优
最后说明
恕我直言,我更喜欢通过 SMTP 发送电子邮件。您可以使用 MTA 作为防止垃圾邮件爆发的额外保护。不过,您可能必须像 @Sanmain 在另一个答案中所说的那样,在 PHP 中处理另一个邮件队列 :)
答案2
您说得对,这对其他人来说无关紧要,但对您来说肯定很重要,因为通过 SMTP 提交时,Postfix 可能会因为您无法控制的原因而拒绝接受您的消息。这意味着您必须使用自己的传递队列并添加其他膨胀代码。事实上,您将做 Postfix 的工作。
有人可能会说这mail()
也可能会失败,但它本身就像将消息写入文件一样简单。换句话说,没有什么可破坏的。
底线:除非您绝对需要使用 SMTP,否则请使用系统的邮件程序。
答案3
在许多情况下,垃圾邮件脚本是在自动扫描程序发现您的 webapp 中存在漏洞后通过自动过程上传的。这些垃圾邮件脚本几乎总是使用 phpmail()
函数而不是 SMTP。如果有人入侵您的服务器并从配置文件中获取 smtp 密码,那么您无论如何都会失去城堡。但在很多针对过时 CMS 等的自动攻击中,垃圾邮件脚本只使用mail()
。所以我建议您mail()
在 postfix 中禁用并仅使用经过身份验证的 SMTP。