我正在编写一个邮件发送程序。从队列中读取邮件并从队列中发送删除后。
所以过程看起来像:
- 从队列中读取一封邮件
- 发邮件
- 从队列中删除邮件
如果在第 2 步之后应用程序崩溃。由于某些编程错误或网络错误,我无法从队列中删除邮件。我最终发送了多份邮件。
有没有办法避免发送邮件的重复副本?生成唯一哈希并添加自定义标头的东西。并检查是否有任何邮件具有相同的标头值。
由于没有查询邮件系统以查找特定邮件(例如,具有特定标头或散列值)是否已发送的事情,因此实际上没有任何方法可以做到这一点。
邮件传递软件应该认为发送重复邮件比根本不发送排队邮件要好。
当然,您可以根据需要采取尽可能多的步骤来帮助您的应用程序对错误和崩溃具有健壮性,包括确保您捕获所有异常、fork()
对应用程序进行 ing 并让孩子在父母监控它的同时进行工作等。 . 基本上尽一切合理的努力unlink()
在确认发送后尽快将邮件出列(希望是一个不容易失败的简单操作,比如简单的)。
即使那样,即使您的程序没有任何错误,网络仍然可以咬您。如果您发送邮件但从未收到 SMTPDATA
命令的响应(比如因为此时网络连接中断),是否已发送电子邮件?这是不可能知道的。你应该出队吗?不。