PHPMailer存储成品邮件

PHPMailer store finished mail

我正在寻找一种存储 PHPMailer 生成的电子邮件的好方法, 在数据库中,而不是直接通过 SMTP 将其发送出去。 这样做的原因是,邮件是通过客户提供的邮件服务器发送的,这可能是不可靠的。所以这就是为什么我想在数据库中排队邮件而不是直接发送邮件。

显而易见的想法是存储 PHPMailers 内部的 $MIMEHeader、$MIMEBody 和类似变量,然后再将它们放回 PHPMailer 对象中。 不幸的是,这实际上是不可能的,因为大多数这些变量都设置了受保护的访问修饰符,没有任何其他方式可以访问它们。

我考虑过做类似 Reflection 的事情来将访问修饰符更改为 public,但这听起来像是一个粗略的 hack,很容易被破坏...... 另外:我真的不想修改 PHPMailer 本身,以便能够仍然更新 PHPMailer。

序列化整个 PHPMailer 对象是另一个想法,但这有点不切实际,因为我需要确保(例如)文件系统中的附件在发送邮件时仍然存在。

I'm searching for a good way to store the e-mail generated by PHPMailer

也许只存储您构建邮件内容的数据就足够了(即使是序列化数组,JSON 随便)。然后需要的时候可以重新建邮件再发送。

which will probably be unreliable

按照同样的逻辑,您的代码可能会有错误。

开个玩笑,一旦 send() 返回成功,邮件投递会发生什么就不是您的问题了。如果它会失败,那么应该修复它的不是你,因为罪魁祸首在你的代码之外。只需将 "reliable mail server" 添加到您的应用要求中即可:)

您无需发送即可获得完整的消息:

$mail->preSend();
$message = $mail->getSentMIMEMessage();

如果您想提交 pre-built 邮件,您可以自行驱动 SMTP class,但这不是特别简单 - 您最好遵循其他存储参数的建议,而不是pre-built 消息。

能够直接设置 headers 和 body 意味着 PHPMailer 包含一个完整的 MIME 解析器,而这不是它的工作。绕过受保护的访问权限也是不够的,因为调用 send 函数会导致您的所有更改被覆盖,因为消息仅在发送时构建(这就是为什么这些属性首先受到保护 - 它们是供内部使用)。简而言之,您的做法是错误的。

正如其他人所说的那样 - 你在错误的地方排队 - 这就是邮件服务器的用途,他们非常擅长,而你 真的 不不想编写自己的 MTA。这就是我所做的,我每小时发送一百万条消息没有问题 - 我的 MTA 会处理所有可靠性问题。