java Mail邮件接收工具类
下面是一个邮件接收的工具类,有点长!!!
publicclassReciveMail{
privateMimeMessagemsg=null;
privateStringsaveAttchPath="";
privateStringBufferbodytext=newStringBuffer();
privateStringdateformate="yy-MM-ddHH:mm";
publicReciveMail(MimeMessagemsg){
this.msg=msg;
}
publicvoidsetMsg(MimeMessagemsg){
this.msg=msg;
}
/**
*获取发送邮件者信息
*@return
*@throwsMessagingException
*/
publicStringgetFrom()throwsMessagingException{
InternetAddress[]address=(InternetAddress[])msg.getFrom();
Stringfrom=address[0].getAddress();
if(from==null){
from="";
}
Stringpersonal=address[0].getPersonal();
if(personal==null){
personal="";
}
Stringfromaddr=personal+"<"+from+">";
returnfromaddr;
}
/**
*获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同"to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
*@paramtype
*@return
*@throwsMessagingException
*@throwsUnsupportedEncodingException
*/
publicStringgetMailAddress(Stringtype)throwsMessagingException,UnsupportedEncodingException{
Stringmailaddr="";
StringaddrType=type.toUpperCase();
InternetAddress[]address=null;
if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
if(addrType.equals("TO")){
address=(InternetAddress[])msg.getRecipients(Message.RecipientType.TO);
}
if(addrType.equals("CC")){
address=(InternetAddress[])msg.getRecipients(Message.RecipientType.CC);
}
if(addrType.equals("BCC")){
address=(InternetAddress[])msg.getRecipients(Message.RecipientType.BCC);
}
if(address!=null){
for(inti=0;i<address.length;i++){
Stringmail=address[i].getAddress();
if(mail==null){
mail="";
}else{
mail=MimeUtility.decodeText(mail);
}
Stringpersonal=address[i].getPersonal();
if(personal==null){
personal="";
}else{
personal=MimeUtility.decodeText(personal);
}
Stringcompositeto=personal+"<"+mail+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}else{
thrownewRuntimeException("ErroremailType!");
}
returnmailaddr;
}
/**
*获取邮件主题
*@return
*@throwsUnsupportedEncodingException
*@throwsMessagingException
*/
publicStringgetSubject()throwsUnsupportedEncodingException,MessagingException{
Stringsubject="";
subject=MimeUtility.decodeText(msg.getSubject());
if(subject==null){
subject="";
}
returnsubject;
}
/**
*获取邮件发送日期
*@return
*@throwsMessagingException
*/
publicStringgetSendDate()throwsMessagingException{
DatesendDate=msg.getSentDate();
SimpleDateFormatsmd=newSimpleDateFormat(dateformate);
returnsmd.format(sendDate);
}
/**
*获取邮件正文内容
*@return
*/
publicStringgetBodyText(){
returnbodytext.toString();
}
/**
*解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,
*解析邮件主要根据MimeType的不同执行不同的操作,一步一步的解析
*@parampart
*@throwsMessagingException
*@throwsIOException
*/
publicvoidgetMailContent(Partpart)throwsMessagingException,IOException{
StringcontentType=part.getContentType();
intnameindex=contentType.indexOf("name");
booleanconname=false;
if(nameindex!=-1){
conname=true;
}
System.out.println("CONTENTTYPE:"+contentType);
if(part.isMimeType("text/plain")&&!conname){
bodytext.append((String)part.getContent());
}elseif(part.isMimeType("text/html")&&!conname){
bodytext.append((String)part.getContent());
}elseif(part.isMimeType("multipart/*")){
Multipartmultipart=(Multipart)part.getContent();
intcount=multipart.getCount();
for(inti=0;i<count;i++){
getMailContent(multipart.getBodyPart(i));
}
}elseif(part.isMimeType("message/rfc822")){
getMailContent((Part)part.getContent());
}
}
/**
*判断邮件是否需要回执,如需回执返回true,否则返回false
*@return
*@throwsMessagingException
*/
publicbooleangetReplySign()throwsMessagingException{
booleanreplySign=false;
Stringneedreply[]=msg.getHeader("Disposition-Notification-TO");
if(needreply!=null){
replySign=true;
}
returnreplySign;
}
/**
*获取此邮件的message-id
*@return
*@throwsMessagingException
*/
publicStringgetMessageId()throwsMessagingException{
returnmsg.getMessageID();
}
/**
*判断此邮件是否已读,如果未读则返回false,已读返回true
*@return
*@throwsMessagingException
*/
publicbooleanisNew()throwsMessagingException{
booleanisnew=false;
Flagsflags=((Message)msg).getFlags();
Flags.Flag[]flag=flags.getSystemFlags();
System.out.println("flags'slength:"+flag.length);
for(inti=0;i<flag.length;i++){
if(flag[i]==Flags.Flag.SEEN){
isnew=true;
System.out.println("seenmessage.......");
break;
}
}
returnisnew;
}
/**
*判断是是否包含附件
*@parampart
*@return
*@throwsMessagingException
*@throwsIOException
*/
publicbooleanisContainAttch(Partpart)throwsMessagingException,IOException{
booleanflag=false;
//StringcontentType=part.getContentType();
if(part.isMimeType("multipart/*")){
Multipartmultipart=(Multipart)part.getContent();
intcount=multipart.getCount();
for(inti=0;i<count;i++){
BodyPartbodypart=multipart.getBodyPart(i);
Stringdispostion=bodypart.getDisposition();
if((dispostion!=null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
flag=true;
}elseif(bodypart.isMimeType("multipart/*")){
flag=isContainAttch(bodypart);
}else{
StringconType=bodypart.getContentType();
if(conType.toLowerCase().indexOf("appliaction")!=-1){
flag=true;
}
if(conType.toLowerCase().indexOf("name")!=-1){
flag=true;
}
}
}
}elseif(part.isMimeType("message/rfc822")){
flag=isContainAttch((Part)part.getContent());
}
returnflag;
}
/**
*保存附件
*@parampart
*@throwsMessagingException
*@throwsIOException
*/
publicvoidsaveAttchMent(Partpart)throwsMessagingException,IOException{
Stringfilename="";
if(part.isMimeType("multipart/*")){
Multipartmp=(Multipart)part.getContent();
for(inti=0;i<mp.getCount();i++){
BodyPartmpart=mp.getBodyPart(i);
Stringdispostion=mpart.getDisposition();
if((dispostion!=null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
filename=mpart.getFileName();
if(filename.toLowerCase().indexOf("gb2312")!=-1){
filename=MimeUtility.decodeText(filename);
}
saveFile(filename,mpart.getInputStream());
}elseif(mpart.isMimeType("multipart/*")){
saveAttchMent(mpart);
}else{
filename=mpart.getFileName();
if(filename!=null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
filename=MimeUtility.decodeText(filename);
}
saveFile(filename,mpart.getInputStream());
}
}
}elseif(part.isMimeType("message/rfc822")){
saveAttchMent((Part)part.getContent());
}
}
/**
*获得保存附件的地址
*@return
*/
publicStringgetSaveAttchPath(){
returnsaveAttchPath;
}
/**
*设置保存附件地址
*@paramsaveAttchPath
*/
publicvoidsetSaveAttchPath(StringsaveAttchPath){
this.saveAttchPath=saveAttchPath;
}
/**
*设置日期格式
*@paramdateformate
*/
publicvoidsetDateformate(Stringdateformate){
this.dateformate=dateformate;
}
/**
*保存文件内容
*@paramfilename
*@paraminputStream
*@throwsIOException
*/
privatevoidsaveFile(Stringfilename,InputStreaminputStream)throwsIOException{
Stringosname=System.getProperty("os.name");
Stringstoredir=getSaveAttchPath();
Stringsepatror="";
if(osname==null){
osname="";
}
if(osname.toLowerCase().indexOf("win")!=-1){
sepatror="//";
if(storedir==null||"".equals(storedir)){
storedir="d://temp";
}
}else{
sepatror="/";
storedir="/temp";
}
Filestorefile=newFile(storedir+sepatror+filename);
System.out.println("storefile'spath:"+storefile.toString());
BufferedOutputStreambos=null;
BufferedInputStreambis=null;
try{
bos=newBufferedOutputStream(newFileOutputStream(storefile));
bis=newBufferedInputStream(inputStream);
intc;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();
}
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
bos.close();
bis.close();
}
}
publicvoidrecive(Partpart,inti)throwsMessagingException,IOException{
System.out.println("------------------START-----------------------");
System.out.println("Message"+i+"subject:"+getSubject());
System.out.println("Message"+i+"from:"+getFrom());
System.out.println("Message"+i+"isNew:"+isNew());
booleanflag=isContainAttch(part);
System.out.println("Message"+i+"isContainAttch:"+flag);
System.out.println("Message"+i+"replySign:"+getReplySign());
getMailContent(part);
System.out.println("Message"+i+"content:"+getBodyText());
setSaveAttchPath("c://temp//"+i);
if(flag){
saveAttchMent(part);
}
System.out.println("------------------END-----------------------");
}
}
邮件接收与工具类的使用,有好几种邮件接收的写法!:
看了很多网上其他代码,pop3Server的值是pop.mail.163.com,但是试了试不成功,还有user的值既可以是带有username@...com也可以是username。
如果收件邮箱是163邮箱,必须先登陆163邮箱中设置,开启pop3服务。至于别的邮箱暂不知道。
publicstaticvoidmain(String[]args)throwsException{
//连接pop3服务器的主机名、协议、用户名、密码
Stringpop3Server="pop.163.com";
Stringprotocol="pop3";
Stringuser="username";
Stringpwd="password";
//创建一个有具体连接信息的Properties对象
Propertiesprops=newProperties();
props.setProperty("mail.store.protocol",protocol);
props.setProperty("mail.pop3.host",pop3Server);
//使用Properties对象获得Session对象
Sessionsession=Session.getInstance(props);
session.setDebug(true);
//利用Session对象获得Store对象,并连接pop3服务器
Storestore=session.getStore();
store.connect(pop3Server,user,pwd);
//获得邮箱内的邮件夹Folder对象,以"只读"打开
Folderfolder=store.getFolder("inbox");
folder.open(Folder.READ_ONLY);
//获得邮件夹Folder内的所有邮件Message对象
Message[]messages=folder.getMessages();
ReciveMailrm=null;
for(inti=0;i<messages.size();i++){
rm=newReciveMail((MimeMessage)messages[i]);
rm.recive(messages[i],i);;
}
folder.close(false);
store.close();
}