Javamail操作指南的详细介绍
Bromon原创请尊重版权二、邮件的收取
通常情况下我们都使用pop3协议来收邮件,IMAP嘛现在就不涉及了。收邮件的功能虽然我用了很多时间才基本搞清楚,不过讲起来就soeasy了,一个程序就可以基本包括。
邮件大致可以分三种:纯文本邮件、含有其他数据的文本邮件、含有附件的邮件。
CODE
/*
*Createdon2004-4-26
*/
packageorg.bromon.mail;
importjavax.mail.*;
importjava.util.*;
importjava.io.*;
/**
*@authorBromon
*/
publicclassReceiver
{
Folderinbox;
Storestore;
//连接邮件服务器,获得所有邮件的列表
publicMessage[]getMail(Stringhost,Stringname,Stringpassword)throwsException
{
Propertiesprop=newProperties();
prop.put("mail.pop3.host",host);
Sessionsession=Session.getDefaultInstance(prop);
store=session.getStore("pop3");
store.connect(host,name,password);
inbox=store.getDefaultFolder().getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
Message[]msg=inbox.getMessages();
FetchProfileprofile=newFetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg,profile);
return(msg);
}
//处理任何一种邮件都需要的方法
privatevoidhandle(Messagemsg)throwsException
{
System.out.println("邮件主题:"+msg.getSubject());
System.out.println("邮件作者:"+msg.getFrom()[0].toString());
System.out.println("发送日期:"+msg.getSentDate());
}
//处理文本邮件
publicvoidhandleText(Messagemsg)throwsException
{
this.handle(msg);
System.out.println("邮件内容:"+msg.getContent());
}
//处理Multipart邮件,包括了保存附件的功能
publicvoidhandleMultipart(Messagemsg)throwsException
{
Stringdisposition;
BodyPartpart;
Multipartmp=(Multipart)msg.getContent();
intmpCount=mp.getCount();//Miltipart的数量,用于除了多个part,比如多个附件
for(intm=0;m<mpCount;m++)
{
this.handle(msg);
part=mp.getBodyPart(m);
disposition=part.getDisposition();
if(disposition!=null&&disposition.equals(Part.ATTACHMENT))//判断是否有附件
{
//this.saveAttach(part);//这个方法负责保存附件,注释掉是因为附件可能有病毒,请清理信箱之后再取掉注释
}else{
System.out.println(part.getContent());
}
}
}
privatevoidsaveAttach(BodyPartpart)throwsException
{
Stringtemp=part.getFileName();//得到未经处理的附件名字
Strings=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
//文件名一般都经过了base64编码,下面是解码
StringfileName=this.base64Decoder(s);
System.out.println("有附件:"+fileName);
InputStreamin=part.getInputStream();
FileOutputStreamwriter=newFileOutputStream(newFile(fileName));
byte[]content=newbyte[255];
intread=0;
while((read=in.read(content))!=-1)
{
writer.write(content);
}
writer.close();
in.close();
}
//base64解码
privateStringbase64Decoder(Strings)throwsException
{
sun.misc.BASE64Decoderdecoder=newsun.misc.BASE64Decoder();
byte[]b=decoder.decodeBuffer(s);
return(newString(b));
}
//关闭连接
publicvoidclose()throwsException
{
if(inbox!=null)
{
inbox.close(false);
}
if(store!=null)
{
store.close();
}
}
publicstaticvoidmain(Stringargs[])
{
Stringhost="pop.163.com";
Stringname="bromon";
Stringpassword="Mypassword";
Receiverreceiver=newReceiver();
try
{
Message[]msg=receiver.getMail(host,name,password);
for(inti=0;i<msg.length;i++)
{
if(msg[i].isMimeType("text/*"))//判断邮件类型
{
receiver.handleText(msg[i]);
}else{
receiver.handleMultipart(msg[i]);
}
System.out.println("****************************");
}
receiver.close();
}catch(Exceptione)
{
System.out.println(e);
}
}
}
没有习惯读java代码的兄弟可能会觉得麻烦了一点,其中有个小问题,下载的附件会再文件名后面加上一个”#”符号,不知道这是javamail的特别处理还是pop3的规范。通过程序更改文件名很简单,就不说了。对于email还有很多其他的操作,可以自己取查看一下javadoc,我就不影响大家探索的乐趣了。在Properties里配置代理服务器,可以让程序通过代理收发邮件,一般的HTTP、socks4、socks5都支持。
本文地址:http://www.45fan.com/bcdm/68548.html