Postfix + Php Mail() VS Postfix + SMTP

Postfix + Php Mail() VS Postfix + SMTP

大多数 CMS(例如 Joomla)php mail()都默认提供,并且可以根据SMTP需要进行更改。我将在 Debian 7 上的同一 VPS 中设置 Web 服务器和邮件服务器(Postfix)。我想了解的是:

  1. 送货信誉:使用 php mail() 与 SMTP 会对投递率产生影响吗?据我所知,Postfix 在发送电子邮件时将使用 SMTP 协议与互联网上的其他服务器进行通信,因此是否可以安全地假设电子邮件是通过 php mail 还是从本地主机 smpt 发送到 postfix 无关紧要?这两种方法中的任何一种是否会以任何方式影响电子邮件信誉,哪怕只是轻微的影响?

  2. 性能负荷:发送电子邮件时,php mail 和 SMTP 之间是否存在性能差异?比如说,如果我要发送 10,000 封电子邮件,哪种方法会占用最多的资源(或时间)?我的假设是,两者都需要一些时间,例如:php mail 用于编译带有标题的电子邮件等,而 SMTP 用于每次建立连接。哪一个消耗最多的服务器资源?

  3. 安全问题:当我搜索两者之间的区别时,许多网站都提到了 php 邮件的安全问题,因为黑客可以上传 php 脚本来发送垃圾邮件。但我还看到 SMTP 的另一个安全问题,因为 SMTP 用户名和密码以文本形式存储在配置文件中,这也不安全。既然这两种方法都存在安全问题,那么哪种方法在任何方面都比另一种更好吗?

  4. 偏爱:如果我能够在服务器上同时设置 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 将检查电子邮件是否允许。如果电子邮件允许,它将把它传递给清理守护进程。

来源:Postfix 的官方文档


安全问题:当我搜索两者之间的区别时,许多网站都提到了 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。

相关内容