好好工作,好好生活
这里,我用pop3连126.com的邮箱取到邮件,解析邮件附件。我的工作是取到jpg或gif图片并保存。
说明:这是我的在工作中写的代码,是可用的。但是有部分代码被截取出来,比如有些参数我觉得没有必要,就删除了,没有测试。可能会有bug,但是肯定是小bug。
注1:使用的协议是pop3,因为这里不需要发送邮件,只度读取邮件,pop3协议比较简单方便
注2:这个函数没有一次处理所有的邮件,因为没有这个必要。如果需要一次处理所有邮件的话,将for循环的那部分删除就可以了
注3:message的类型可以是text/plain,text/html或者是multipart/*等类型的。但是只有multipart/*才是有附件的邮件。当然,有的邮件系统是将邮件内容作为附件来传递的。
注4:解析邮件的过程中可能会出现异常,比如我碰到的一个很奇怪的异常就是,当part不为null的时候,part.getFileName()抛出为空的异常。如果不捕获这个异常,会出问题,究竟是什么问题,我在注6里讲解。现在,捕获这个异常。这个邮件是有问题的,如果不删除,下次出来还是会抛异常,于是我们给他置一个删除标志。
注5:将已处理的邮件置删除标志。很奇怪,置删除标志的邮件不是被放在了垃圾箱里,而是被彻底删除了,所以用的时候要小心。但是如果继续留在收件箱,下次又会被处理一次
注6:当前面的邮件解析操作正常结束的时候,folder.close(true)会执行。这个时候,才会将刚刚置了删除标志的邮件删除。前面说过异常如果没有被捕获会出问题。这个问题就是,前面的邮件已经处理了,并且置上了删除标志,但是碰到问题邮件的时候抛出异常,没有被及时捕获,于是folder.close(true)不会被执行,那些该删除的邮件就没有删除。那么当你再调用这个connectMail的时候就会重复的处理邮件。我是在servlet里写的定时器来调用这个函数的,当时出问题,于是有的邮件被重复解析了200多次,这是很可怕的数字。
注1:part.getContentType()说明取不到这个message的类型,直接返回,不需处理
注2:根据我的需求,我只需处理图片类型,也就是说,只要这3种类型的message,其他的都可以忽略
注3:email是遵循一些编码方式的,大部分用的是base64,但是java mail提供解码的工具,这就是MimeUtility.decodeText(s)
注4:再对文件类型做一次判断(其实我觉得是不需要的,但是严整完整一点还是好些)
注5:有的操作系统对InputStram这样的对象有限制,限制同时打开的InputStream个数,例如linux中就有这样的限制。所以在打开了一个InputStream最好关闭。当然,如果不关闭,java的自动回收功能也回回收这个InputStream
Powered by: BlogJava Copyright © hopeshared