上一篇:什么是Web Service? >>
利用javamail收取Hotmail的退信
不象很多的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邮箱》。
下一篇:通过JavaMail访问Hotmail邮箱 >>
相关文章:
- · 用javamail进行认证发信
- · Java电子邮件
- · javamail发送邮件
- · 深入Struts 1.1
- · 代码复用的规则
- · 对《Java与模式》中工厂方法模式的异议
- · 《Java与模式》前言
- · Java行业的圣经
- · Java常见问题集锦
- · 61条面向对象设计的经验原则
- · 用UML设计java事件模型
- · 走进Java 原型开发
- · 用Reflection实现Visitor模…
- · 软件工程能帮多大忙?
- · UML的现状及未来发展
- · J2EE中的设计模式之三
- · J2EE中的设计模式之二
- · J2EE中的设计模式之五
- · J2EE中的设计模式之四
- · 从Java类库看设计模式(3)
- · Java的跨平台特性是利是弊?
- · 适用于 Java 程序员的 CSP ,第 3 部分
- · 集成WebLogic Platform 8.1与Stellent Web ContentManagement系统
- · 适用于 Java 程序员的 CSP,第 1 部分
- · 简析J2EE应用程序数据库类设…
- · RMI(Remote Method Invocat…
- · JNDI(Java Naming Director…
- · JDBC Connection Pool
- · 开发完整J2EE解决方案的八个…
- · JAR文件包及jar命令详解
- · JAR 文件揭密
- · 简化范式匹配
- · J2SE 1.5版本的新特性一览
- · J2SE1.5 注释语法新鲜试用
- · J2SE5.0新特性之使用代理服…
- · J2SE5.0新特性之ProcessBui…
- · 谈谈J2SE中的序列化之一个感…
- · 谈谈J2SE中的序列化之接受默…
