操作javamail收取Hotmail的退信
Hotmail是我最常用的Email Client。固然时下hotmail的容量是小了些,速度也经常慢得让人不禁问候盖茨的母亲。但不行否定,它成果相当富厚,也较量不变。尤其它的页面设计更是我等web编程人员的重要参照。
不象许多的POP3处事器,hotmail 实现了邮件传送状态通知(multipart/report)。我以前写的邮件客户端只支持收取 multipart/related、multipart/alternative和multipart/mixed 等多媒体范例的邮件,其他的因为不常见,我都忽略了。
客户不承诺了,那尚有什么好说的,尚有什么比让客户满足更重要的工作呢,在没买单之前。
multipart/report 邮件范例的先容拜见 RFC1892,Sun的中文 Javamail Faq 里也有相关的说明,我摘录如下:
问. 当动静不能被传送时,就会返回一个失败动静。我如何检测这些“回弹”动静?
答:固然有一个 Internet 尺度用于陈诉这样的错误(multipart/report MIME 范例,参阅 RFC1892),但还没有遍及实现它。RFC1211 深入接头了这个问题,包罗了大量的例子。
在 Internet 电子邮件中,特定的邮箱或用户名是否存在,只能由传送动静的最终处事器抉择。动静大概通过几其中继处事器(它们不能检测错误),然后再达到最终处事器。凡是,当最终处事器检测到这一错误,它会返回一个动静给原始动静的发送人,指出失败的原因。有很多 Internet 尺度接头了这种传送状态通知 (Delivery Status Notifications),但大量处事器不支持这些新尺度,相反利用出格技能来返回这种错误动静。这使得将“回弹”动静与发生问题的原始动静彼此关联起来很是坚苦(留意,这个问题与 JavaMail 完全无关)。
有很多技能和试探法用于处理惩罚这一问题,但它们都不是完美的。一种技能是 Variable Envelope Return Paths,http://cr.yp.to/proto/verp.txt 描写了这一技能。
我修改了措施,也只是作了些简朴的处理惩罚,代码如下:
private void parseMultipart(Multipart multipart) throws Exception {
for (int i = 0, n = multipart.getCount(); i < n; i++) {
BodyPart part = multipart.getBodyPart(i);
String disposition = part.getDisposition();
if (part.isMimeType("multipart/*")) {
this.parseMultipart((Multipart) part.getContent());
} else if (part.isMimeType("text/html")) {
//处理惩罚文本内容
}
/******* 处理惩罚附件,图片等等 ********/
} else if (part.isMimeType("message/delivery-status")) {
part.setFileName("details.txt"); //模拟outlook,details.txt 内容即传送状态通知的邮件头信息
saveAttachedFile(part);
} else if (part.isMimeType("message/rfc822")) {
MimeBodyPart mbp = new MimeBodyPart(part.getInputStream());
part.setFileName(mbp.getHeader("Subject", null) + ".eml"); //模拟outlook,用退件的标题做文件名
saveAttachedFile(part);
}
}
}
假如要做得更友好,还可以做许多改造,好比按照退信找出已发送文件夹中的原件,可能引发一个通知事件等等。客户并不需要,我照旧不要自作多情了。
各人都知道,hotmail 不是用pop3协议收信,而是用webdav协议。用java收发hotmail的邮件 ,拜见《通过JavaMail会见Hotmail邮箱》。