我有一个Java应用程序,通过localhost Exim4邮件服务器发送电子邮件。使用javax.mail。*类,电子邮件发送效果很好......
我正在尝试捕获任何失败的消息 - 反弹的消息。我已经阅读了一百万篇博文和Q&在这里说这是不可能的。这显然是可能的,因为我的银行等网站可以检测到由于我的邮件服务器停机而他们的某封电子邮件没有发送到我的地址。
我可以在Exim日志中看到电子邮件已经退回 - 例如我使用asdf@asdf.com - 我想要那些信息。我了解Exim(和大多数邮件服务器)如何接受该消息,然后将其添加到队列中以在客户端断开连接后发送很长时间。一种选择当然是观看日志。我不愿意这样做,因为必须有更好的方法。
我不受技术选择的限制,除了需要GPL-esq之外,Java需要发送和处理失败(因为详细信息写入了DB)。
我已经尝试过Aspirin,但我发现文档缺乏并且努力让听众以我想要的方式工作。
有没有人有任何想法?你能为我指出正确的方向吗?
//编辑
我只想澄清一下我的成功意义 - 我很欣赏有些服务器可能接受邮件,但由于各种原因(例如垃圾邮件)可能永远不会将其发送到用户收件箱,我意识到我无法检测到那。我想要检测的是邮件服务器明显拒绝了电子邮件。
我正在考虑为我的Exim服务器上的退回电子邮件设置全部捕获并且每N分钟轮询一次以检查是否有故障。看起来我可以在邮件头中隐藏ID以使其更加方便程序。也许我需要再次研究阿司匹林......
//回答
要回答这个问题,我选择了......
我最终使用了Aspirin for Java ...它有一个例外 - 我似乎无法消除排队电子邮件发送之间的60秒延迟,并且它实际上正在发送。
我在'启动阿斯匹林课'
中使用了这段代码MailComplete mc = new MailComplete();
AspirinInternal.addListener(mc);
此课程用于完成“邮件已完成”工作。
import org.masukomi.aspirin.core.listener.AspirinListener;
import org.masukomi.aspirin.core.listener.ResultState;
public class MailComplete implements AspirinListener{
@Override
public void delivered(String string, String string1, ResultState rs, String string2) {
// Code here
}
}
请注意,仅当发送完成的邮件时才会触发此侦听器。 ResultState似乎主要是NULL,这有点无用。基本上,如果此类触发,则很可能是电子邮件已发送。
到目前为止它似乎已经在我的基本测试中工作,但它并不理想,代码似乎与NULL业务有点矛盾。正如我所说,它似乎有效,但由于缺乏关于此事的文档,很难说这是否是最好的。
如果有人偶然发现这个,并且有更好的想法或更好的代码,我会非常感兴趣。
干杯。