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 会处理所有可靠性问题。
我正在寻找一种存储 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 会处理所有可靠性问题。