JavaMail实现收发邮件——(三)接收邮件

简介:

    JavaMail接收邮件和发送邮件基本一致,大体上是把Transport换成了Store。不过和发送相比,难点是对接收到的邮件进行解析,不然看起来就跟乱码一样。之所以解析这一块难,就在于一封未知的邮件你不知道它的结构是怎样的,因此需要我们通过判断一步步解析。对于这一点,我也不是很清楚,所以下面我就瞎写一点基础的。


一.首先连接POP3服务器获取邮件

(1)创建Properties对象以及Session对象  

1
2
3
4
5
6
7
8
// 创建一个有具体连接信息的Properties对象  
Properties properties =  new  Properties();
properties.put( "mail.store.protocal" , protocal);
properties.put( "mail.pop3.host" , pop3Server);     
         
// 使用Properties对象获得Session对象  
Session session = Session.getInstance(properties);
session.setDebug( false );

 

(2)利用Session对象获得Store对象,并连接pop3服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try  {
Store store = session.getStore(protocal);
store.connect(pop3Server,username, password);
             
//获取收件箱  
Folder folder = store.getFolder( "INBOX" );
folder.open(Folder.READ_ONLY);   //以只读权限打开收件箱  
/**
  * Folder.READ_ONLY:表示只读权限。
  * Folder.READ_WRITE:表示可以修改并读取邮件夹中的邮件。
  **/
             
//获取收件箱中的邮件
Message[] messages = folder.getMessages();
System.out.println( "总的邮件数目:" +messages.length);
System.out.println( "新邮件数目:" +folder.getNewMessageCount());
System.out.println( "未读邮件数目:" +folder.getUnreadMessageCount());


(3)对邮件进行一些处理后,然后进行格式化输出

1
2
3
4
5
6
7
8
9
10
11
12
for ( int  i= 0 ;i<messages.length;i++){
     HandleReceivedMail handleOneMail =  new  HandleReceivedMail((MimeMessage) messages[i]);
     System.out.println( "Message " + i +  " : 主题:" +handleOneMail.getSubject());
     System.out.println( "Message " + i +  " : 时间:" +handleOneMail.getSendDate());
     System.out.println( "Message " + i +  " : 发件人:" +handleOneMail.getFrom());
//  System.out.println("Message "+ i + " : Message-ID:"+handleOneMail.getMessageID());
     System.out.println( "Message " + i +  " : 回执:" +handleOneMail.getReplySign());
     handleOneMail.getMailContent((Part)messages[i]);
     System.out.println( "Message " + i +  " : 正文:" +handleOneMail.getBodyText());
     System.out.println( "Message " + i +  " : 附件:" +handleOneMail.isContainAttach((Part)messages[i]));
     System.out.println();
}


(4)关闭连接

1
2
3
//关闭连接
folder.close( false );
store.close();


二.对获取到的邮件传入到一个处理类HandleReceivedMail中进行处理

(1)对主题等内容进行解密,防止中文乱码

1
2
3
4
5
6
7
8
9
10
11
public  String changeEncode(String str){
         try  {
              if  (str ==  null  ||  "" .equals(str)) 
                  str =  ""
              else
                  str = MimeUtility.decodeText(str); 
         catch  (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
         return  str;
     }


(2)获取邮件主题

1
2
3
4
5
6
7
8
9
10
11
12
public  String getSubject(){
         String subject =  "" ;
         try  {
             subject = changeEncode(mimeMessage.getSubject());
             if (subject ==  null )
                 subject =  "" ;
             return  subject;
         catch  (MessagingException e) {
             e.printStackTrace();
         }
         return  null ;
     }


(3)获取邮件发送时间

1
2
3
4
5
6
7
8
9
10
11
public  String getSendDate(){
         try  {
             Date sendDate = mimeMessage.getSentDate();
             SimpleDateFormat dateFormat =  new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
             return  dateFormat.format(sendDate);
         catch  (MessagingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return  null ;
     }


(4)获取发件人姓名和地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  String getFrom(){
         try  {
             InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
             String person = address[ 0 ].getPersonal();   //姓名
             if (person ==  null )
                 person =  "" ;
             String from = address[ 0 ].getAddress();   //地址
             if (from ==  null )
                 from =  "" ;
             return  person+ "[" +from+ "]" ;
         catch  (MessagingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         
         return  null ;
     }


(5)获取邮件的Message-ID

1
2
3
4
5
6
7
8
9
public  String getMessageID(){
         try  {
             return  mimeMessage.getMessageID();
         catch  (MessagingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return  null ;
     }


(6)判断邮件是否需要回执,需要返回“true”,否则返回“false”

1
2
3
4
5
6
7
8
9
10
11
public  boolean  getReplySign(){
     try  {
         String[] reply = mimeMessage.getHeader( "Disposition-Notification-To" );
         if (reply !=  null )
             return  true ;  
     catch  (MessagingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
     return  false
}  


(7)解析邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public  void  getMailContent(Part part){
         try  {
             String contentType = part.getContentType();
             int  nameIndex = contentType.indexOf( "name" );
             boolean  isContainTextAttach =  false ;   //判断邮件中是否含有嵌套体
             if (nameIndex != - 1 )
                 isContainTextAttach =  true ;
             if (part.isMimeType( "text/plain" ) && !isContainTextAttach)
                 bodytext.append((String)part.getContent());
             else  if (part.isMimeType( "text/html" ) && !isContainTextAttach)
                 bodytext.append((String)part.getContent());   //对于HTML格式邮件,可以在前后加上标签<html><head>subject</head><body>bodytext</body></html>,保存为html格式文件(PS:未写)
             else  if (part.isMimeType( "message/rfc822" ))
                 getMailContent((Part) part.getContent());
             else  if (part.isMimeType( "multipart/*" )){
                 Multipart multipart = (Multipart) part.getContent();
                 int  count = multipart.getCount();
                 for ( int  i= 0 ;i<count;i++)
                     getMailContent(multipart.getBodyPart(i));
             }
             
         catch  (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }  
     }


(8)正文文本内容

1
2
3
public  String getBodyText(){
         return  bodytext.toString();
     }


(9)判断是否包含附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public  boolean  isContainAttach(Part part){
         boolean  attachflag =  false ;   //是否有附件
         try  {
             String contentType = part.getContentType();
             if (part.isMimeType( "multipart/*" )){
                 Multipart multipart = (Multipart) part.getContent();
                 for ( int  i= 0 ;i<multipart.getCount();i++){
                     BodyPart bodyPart = multipart.getBodyPart(i);
                     String disposition = bodyPart.getDisposition();
                     if ((disposition !=  null ) && (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE)))
                         attachflag =  true ;
                     else  if (bodyPart.isMimeType( "multipart/*" ))
                         attachflag = isContainAttach((Part)bodyPart);
                     else {
                         String bodytype = bodyPart.getContentType();
                         if (bodytype.toLowerCase().indexOf( "application" ) !=- 1 )
                             attachflag =  true ;
                         if (bodytype.toLowerCase().indexOf( "name" ) !=- 1 )
                             attachflag =  true ;
                     }
                     
                 }
             }
             else  if (part.isMimeType( "message/rfc822" ))
                 attachflag = isContainAttach((Part)part.getContent());
         catch  (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }      
         return  attachflag;
     }


(10)保存附件到本地

(PS:未写)


三.测试代码

1
2
3
4
5
public  static  void  main(String[] args) {
     ReceiveMail receiveMail =  new  ReceiveMail( "pop3.163.com" , "pop3" , "youname@163.com" , "youpassword" );
//  ReceiveMail receiveMail = new ReceiveMail("pop.qq.com","pop3","youname@qq.com","youpassword");
         receiveMail.receiveAllMail();
     }

注:1,关于POP3服务器,腾讯的和网易的写法还不一样,一个是:pop.qq.com,一个是:pop3.163.com

    2,QQ邮箱如果短时间内大量连接或者重复连接的话,有可能会抽风,即使代码没问题也连不上,对于这种情况,要么等一会,要么换163或其他邮箱进行测试




本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1664222,如需转载请自行联系原作者

相关文章
|
1月前
|
API 数据安全/隐私保护 开发者
怎么发电子邮件?aoksendAPI接口发信方法
怎么发电子邮件?aoksendAPI接口发信方法
|
1月前
|
数据安全/隐私保护
JavaMail给QQ邮箱发邮件报错
JavaMail给QQ邮箱发邮件报错
14 0
|
4月前
|
消息中间件
Rabbimq发送邮件并消费邮件
Rabbimq发送邮件并消费邮件
471 3
|
5月前
qq邮箱发送
qq邮箱发送
38 0
|
9月前
Javamail发送新浪邮件后保存邮件到已发送
Javamail发送新浪邮件后保存邮件到已发送
67 0
Jamil+c#—实现邮件的发送
Jamil+c#—实现邮件的发送
130 0
Jamil+c#—实现邮件的发送
阿里云如何添加邮箱解析来实现收发邮件服务
当你买域名后,要在阿里云添加邮箱解析,邮箱解析是把域名指向邮箱的服务器地址,实现邮箱的收发邮件服务。一、联系邮箱提供商,获取邮箱解析记录,这部分数据一般在邮箱提供商帮助文档里有,要么就和客服索要。二、添加解析操作步骤 1、联系邮箱提供商,获取邮箱解析地址记录。
|
数据安全/隐私保护
邮箱发送
邮箱发送
1728 0
|
Java 数据安全/隐私保护