`

java imap 邮件接收

阅读更多

package com.ckn.web.main;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Properties;

import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeUtility;

import com.sun.mail.imap.IMAPMessage;
import com.sun.mail.util.BASE64DecoderStream;

public class ImapPullMail {
    
    public static void main(String[] args) throws Exception{
        //0、各种连接配置
        Properties props=new Properties();
        props.setProperty("mail.store.protocol", "imap");
        props.setProperty("mail.imap.host", "imap.163.com");
        props.setProperty("mail.imap.port", "143");
        
        //1、创建Session实例对象
        Session session=Session.getInstance(props);
        
        //2、创建IMAP协议的Store对象
        Store imapStore=session.getStore("imap");
        
        //3、连接邮件服务器
        imapStore.connect("12456kcc@163.com", "snsjxnsdfsxd45");
        
        //4、获得收件箱
        Folder folder=imapStore.getFolder("INBOX");
        
        //5、以读写的方式打开收件箱
        folder.open(Folder.READ_WRITE);
        
        //6、获得收件箱的邮件列表
        Message[] messages=folder.getMessages();
        
        //7、收件箱的状态//
        System.out.println("收件箱中共"+messages.length+"封邮件!");
        System.out.println("收件箱中共"+folder.getUnreadMessageCount()+"封未读邮件!");
        System.out.println("收件箱中共"+folder.getNewMessageCount()+"封新邮件!");
        System.out.println("收件箱中共"+folder.getDeletedMessageCount()+"封已删除邮件!");
        
        //8、解析邮件箱邮件
        System.out.println("***************");
        for(Message message:messages){
            //读过的略过
            if(message.getFlags().contains(Flag.SEEN)) continue;
            
            System.out.println("***********************");
            IMAPMessage imapMsg=(IMAPMessage) message;
            String subject=MimeUtility.decodeText(imapMsg.getSubject());
            
            System.out.println("当前邮件 标题:"+subject);
            //imapMsg.writeTo(System.out);
            //获取邮件外包装  ,  包括多个邮件内容块 , 业务场景是 转发的内容 用到这个结构
            //Multipart multipart=(Multipart) message.getContent();
            Object wrapContent=message.getContent();
            if(wrapContent instanceof Multipart){
                System.out.println("包含多个块");
                Multipart outMultipart=(Multipart) wrapContent;
                int partCount=outMultipart.getCount();
                
                for(int i=0;i<partCount;i++){
                    // Part 类似Message 的东西
                    Part nPart=outMultipart.getBodyPart(i);
                    Object nContent=nPart.getContent();

                    //System.out.println(nContent.getClass().getInterfaces());
                    //遍历 邮件内容  块(可能直接是文本块 、文本 HTML块 、或者附件块...通常情况下是文本块 、文本HTML块和附件块 )
                    if(nContent instanceof Multipart){
                        //对文本HTML块的处理
                        Multipart nMultipart=(Multipart) nContent;
                        int nPartCount=nMultipart.getCount();
                        for(int k=0;k<nPartCount;k++){
                            Part nnPart=nMultipart.getBodyPart(k);
                            System.out.println("内容类型: "+nnPart.getContentType());
                            System.out.println("小包裹内容: "+nnPart.getContent());
                        }
                        
                    }else if(nContent instanceof BASE64DecoderStream){    
                        //对附件块的处理
                        String disposition=nPart.getDisposition();
                        if(disposition!=null){
                            String fileName=MimeUtility.decodeText(nPart.getFileName());
                            String contentType=MimeUtility.decodeText(nPart.getContentType());
                            
                            System.out.println("i:"+i+" "+"fileName->"+fileName
                                    +"\ncontentType->"+contentType);
                            
                            InputStream in=nPart.getInputStream();
                            FileOutputStream out=new FileOutputStream("D:\\Users\\jxn\\Desktop\\TRANSFILE\\"+fileName);
                            
                            int len;
                            byte[] readBytes=new byte[1024];
                            while((len=in.read(readBytes))!=-1){
                                out.write(readBytes,0,len);
                            }
                            
                            out.close();
                            in.close();
                            System.out.println("文件下载完成");
                        }
                    }else{
                        //直接文本块的处理
                        System.out.println("i:"+i+" "+nContent.getClass().getName());
                        System.out.println(nContent);
                    }
                }
            }else{
                System.out.println("纯文本邮件");
                System.out.println(message.getContent());
            }
            
            imapMsg.setFlag(Flag.SEEN, false); //这段代码一定要放在后面执行,服务器默认拉取后就将邮件设为已读了,如放在前面,在拉取数据后就被默认改成读过状态了,故一定要放在读过后执行; 该方法作用: 设置已读标志  第二个参数如果设置为true,则将修改反馈给服务器。false则不反馈给服务器
            System.out.println("*********************************************");
            
        }
        
        //9、关闭资源
        folder.close(true);
        imapStore.close();
    }

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics