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("[email protected]", "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();
}
}
java imap 邮件接收
猜你喜欢
转载自hus2013.iteye.com/blog/2231311
今日推荐
周排行