javaMail操作.docx
《javaMail操作.docx》由会员分享,可在线阅读,更多相关《javaMail操作.docx(27页珍藏版)》请在冰豆网上搜索。
javaMail操作
JavaMail工具类
前段时间,因为项目需要,用到邮件的收发功能。
根据sky提供的EmailUtils.java文件,现整理成工具类。
这里主要用到的了ApacheCommons下的一个Email类库V1.3。
先看看官方文档的介绍:
http:
//commons.apache.org/email/
SimpleEmail
这个类是用来发送基本的基于文本的电子邮件。
MultiPartEmail
这个类用于发送多部分消息。
可以是内联或附加附件的文本消息。
HtmlEmail
这个类用于发送HTML格式的电子邮件。
它的所有功能MultiPartEmail允许附件可以很容易地添加。
它也支持嵌入的图像。
ImageHtmlEmail
这个类用于发送HTML格式的电子邮件,内嵌图像。
它的所有功能为HtmlEmail,但将所有图像内联图像。
EmailAttachment
这是一个简单的容器类,允许的附件,易于处理。
这是使用的实例MultiPartEmail和HtmlEmail。
什么是SMTP、POP、两者区别
SMTP
简单邮件传输协议定义了递送邮件的机制。
在下文中,我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。
这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。
这并不需要SMTP服务器使用支持授权的邮件转发,但是却的确要注意SMTP服务器的正确设置(SMTP服务器的设置与JavaMailAPI无关)。
POP
POP是一种邮局协议,目前为第3个版本,即众所周知的POP3。
POP定义了一种用户如何获得邮件的机制。
它规定了每个用户使用一个单独的邮箱。
大多数人在使用POP时所熟悉的功能并非都被支持,例如查看邮箱中的新邮件数量。
而这个功能是微软的Outlook内建的,那么就说明微软Outlook之类的邮件客户端软件是通过查询最近收到的邮件来计算新邮件的数量来实现前面所说的功能。
因此在我们使用JavaMailAPI时需要注意,当需要获得如前面所讲的新邮件数量之类的信息时,我们不得不自己进行计算。
IMAP
IMAP,即InternetMessageAccessProtocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。
IMAP与POP类似,都是一种邮件获取协议。
POP和IMAP有什么区别?
POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:
移动邮件、标记已读等),这是不会反馈到服务器上的,比如:
您通过电子邮件客户端收取了QQ邮箱中的3封邮件并移动到了其他文件夹,这些移动动作是不会反馈到服务器上的,也就是说,QQ邮箱服务器上的这些邮件是没有同时被移动的。
但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:
移动邮件、标记已读等),服务器上的邮件也会做相应的动作。
也就是说,IMAP是“双向”的。
同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。
附:
源代码
/**
*Createdon2013Feb4,201311:
25:
49AM
*/
packagezq.email;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
import.MalformedURLException;
import.URL;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Properties;
importjavax.mail.BodyPart;
importjavax.mail.Flags;
importjavax.mail.Folder;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.Multipart;
importjavax.mail.Session;
importjavax.mail.Store;
importjavax.mail.Transport;
importjavax.mail.internet.AddressException;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
importjavax.mail.internet.MimeUtility;
importjavax.mail.search.OrTerm;
importjavax.mail.search.SearchTerm;
importjavax.mail.search.SubjectTerm;
importmons.mail.DefaultAuthenticator;
importmons.mail.Email;
importmons.mail.EmailAttachment;
importmons.mail.EmailException;
importmons.mail.MultiPartEmail;
importmons.mail.SimpleEmail;
importmon.util.LoggerUtils;
importmon.email.EmailUtils;
importmon.json.JSONUtils;
importmon.properties.PropertiesUtils;
/**
*Title:
邮件工具类
*
*Description:
邮件工具类
*
*调用方法:
*
*实例化EmailUtilemailUtil=newEmailUtil();
*
*发送简单邮件emailUtil.sendSimpleEmail("zq@","发送简单邮件","发送简单邮件测试");
*
*Copyright:
Copyright(c)2012
*
*Company:
通易科技有限公司
*
*2013Feb4,201311:
25:
49AM
*
*@authorzq
*@version1.0
*/
publicclassEmailUtil{
/**
*属性配置文件名称
*/
privatestaticfinalStringEMAIL_CONFIGURATION_FILE="email.properties";
/**
*服务器名称配置key
*/
privatestaticfinalStringEMAIL_HOST_KEY="email.host";
privatestaticStringemailHost;
/**
*服务器名称配置key
*/
privatestaticfinalStringEMAIL_POP3_KEY="email.pop3";
privatestaticStringemailPop3;
privatestaticfinalStringEMAIL_IMAP_KEY="email.imap";
privatestaticStringemailImap;
/**
*用户名配置key
*/
privatestaticfinalStringEMAIL_USERNAME_KEY="email.username";
privatestaticStringemailUsername;
/**
*密码配置key
*/
privatestaticfinalStringEMAIL_PASSWORD_KEY="email.password";
privatestaticStringemailPassowrd;
/**
*配置charset
*/
privatestaticfinalStringEMAIL_CHARSET_KEY="email.charset";
privatestaticStringemailCharset;
/**
*发件人配置key
*/
privatestaticfinalStringEMAIL_FROM_KEY="email.from";
privatestaticStringemailFrom="email.from";
/**
*是否删除邮件
*/
privatestaticbooleanIS_DELETE=false;
//简单邮件
privateEmailemail;
//带附件的邮件
privateMultiPartEmailmpEmail;
privateStringbakMail;
//备份文件夹路径
privatestaticfinalStringEMAIL_FILE_BAK="c:
\\TEMP\\";
//html邮件htmlemail
publicEmailUtil()throwsException{
super();
init();
}
/**
*
*工具类实例化,配置的邮件信息
*
*@authorFeb4,201311:
34:
02AMZQ
*@throwsException
*
*/
privatevoidinit()throwsException{
emailHost=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_HOST_KEY);
emailPop3=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_POP3_KEY);
emailImap=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_IMAP_KEY);
emailFrom=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_FROM_KEY);
emailCharset=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_CHARSET_KEY);
emailUsername=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_USERNAME_KEY);
emailPassowrd=PropertiesUtils.getParameter(EMAIL_CONFIGURATION_FILE,
EMAIL_PASSWORD_KEY);
}
/**
*
*发送单个邮件
*
*@authorFeb4,20132:
12:
10PMZQ
*@paramto
*接收人
*@paramsubject
*邮件标题
*@parammsg
*邮件信息
*@throwsEmailException
*@throwsAddressException
*
*/
publicvoidsendSimpleEmail(Stringto,Stringsubject,Stringmsg)
throwsEmailException,AddressException{
createSimpleEmail(null,null);
email.setSubject(subject);
email.setMsg(msg);
email.addTo(to);
email.send();
}
/**
*
*发送邮件带附件
*
*@authorFeb4,20134:
13:
18PMZQ
*@paramto
*接收人
*@paramsubject
*邮件标题
*@parammsg
*邮件信息
*@paramattachments
*附件集合附件集合List为网络文件;List为本地文件
*@throwsMalformedURLException
*@throwsEmailException
*
*/
publicvoidsendEmailAttachment(Stringto,Stringsubject,Stringmsg,
List
EmailException{
createEmailAttachment(null,null,attachments);
mpEmail.setSubject(subject);
mpEmail.setMsg(msg);
mpEmail.addTo(to);
mpEmail.send();
}
/**
*
*通过pop3协议读取邮件
*
*@authorFeb4,20135:
48:
15PMZQ
*@throwsMalformedURLException
*@throwsEmailException
*@throwsMessagingException
*
*/
publicvoidgetPop3Email()throwsMalformedURLException,EmailException,
MessagingException{
Folderfolder=null;
Storestore=null;
try{
//设置javamail属性
Propertiesprops=System.getProperties();
//Setupmailserver
props.put("mail.smtp.host",emailHost);//设置SMTP发件服务器地址
props.put("mail.smtp.auth","true");//邮件服务器是否要验证
//Getsession
Sessionsession=Session.getDefaultInstance(props);//获取邮件会话
session.setDebug(false);
//Definemessage
store=session.getStore("pop3");
store.connect(emailPop3,emailUsername,emailPassowrd);
folder=store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
//Message[]messages=folder.getMessages();
Message[]messages=searchMessage(folder);
getAttachment(session,messages);
}catch(Exceptione){
LoggerUtils.error(EmailUtils.class,"取邮件出错:
",e);
}finally{
if(folder!
=null){
folder.close(true);
}
if(store!
=null){
store.close();
}
}
}
/**
*
*只取指定格式标题的邮件
*
*通过邮件标题查找邮件
*
*@authorFeb4,20136:
31:
45PMZQ
*@paramfolder
*@return
*@throwsMessagingException
*
*/
privateMessage[]searchMessage(Folderfolder)throwsMessagingException{
//邮件以"CC#"开关
SubjectTermsbujectTerm=newSubjectTerm("CC#");
SearchTermst=newOrTerm(sbujectTerm,sbujectTerm);
returnfolder.search(st);
}
/**
*
*解析附件
*
*@authorFeb4,20136:
05:
45PMZQ
*@paramsession
*@parammessages
*@throwsMessagingException
*@throwsIOException
*@throwsException
*
*/
privatevoidgetAttachment(Sessionsession,Message[]messages)
throwsMessagingException,IOException,Exception{
Objectcontent=null;
Stringsubject=null;
for(Messagemessage:
messages){
//解析邮件内容
//标题
subject=message.getSubject();
LoggerUtils.developer(EmailUtils.class,"读取邮件:
"+subject);
//转发邮箱
forwardMail(session,message);
//集装箱报送
content=message.getContent();
if(contentinstanceofMimeMultipart){
//有附件
MimeMultipartmultipart=(MimeMultipart)content;
parseMultipart(message,multipart);
//删除邮件
message.setFlag(Flags.Flag.DELETED,IS_DELETE);
}
}
}
/**
*
*对复杂邮件的解析,读取附件这里是excel
*
*@authorFeb4,20135:
56:
36PMZQ
*@parammessage
*@parammultipart
*邮件消息体
*@throwsException
*
*/
privatevoidparseMultipart(Messagemessage,Multipartmultipart)
throwsException{
try{
intcount=multipart.getCount();
//System.out.println("couont="+count);
for(intidx=0;idxBodyPartbodyPart=multipart.getBodyPart(idx);
//System.out.println(bodyPart.getContentType());
LoggerUtils.developer(EmailUtils.class,JSONUtils
.object2JSON(bodyPart));
if(bodyPart.isMimeType("text/plain")){
//System.out.println("plain................."
//+bodyPart.getContent());
}elseif(bodyPart.isMimeType("text/html")){
//System.out.println("html..................."
//+bodyPart.getContent());
}elseif(bodyPart.isMimeType("multipart/*")){
Multipartmpart=(Multipart)bodyPart.getContent();
parseMultipart(message,mpart);
}elseif(bodyPart.isMimeType("application/vnd.ms-excel")
||bodyPart.isMimeType("application/octet-stream")){
//application/vnd.openxmlforma