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