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