Java封装好的mail包发送电子邮件的类
下面代码是利用Javamail包封装了一个发送邮件的类
importjava.io.File;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.FileDataSource;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.Multipart;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.AddressException;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
publicclassSendMail{
privatestaticfinalStringMAIL_ADDRESS_REGEX="^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,3}$";
privateStringmailServer;
privateStringsender;
privateString[]receiver;
publicSendMail(){
}
publicvoidsetMailBasicInfo(StringmailServer,Stringsender,Stringreceiver){
this.mailServer=mailServer;
this.sender=sender;
this.receiver=receiver.split(",");
}
publicvoidsetMailBasicInfo(StringmailServer,Stringsender,String[]users){
this.mailServer=mailServer;
this.sender=sender;
this.receiver=users;
}
publicvoidsetMailBasicInfo(StringmailServer,Stringsender,List<String>users){
this.mailServer=mailServer;
this.sender=sender;
this.receiver=newString[users.size()];
users.toArray(this.receiver);
}
publicbooleansend(Stringsubject,Stringcontent,List<String>fileNames)
{
subject=subject==null?"":subject;
content=content==null?"":content;
Propertiesprops=newProperties();
props.put("mail.smtp.host",mailServer);
Sessionsession=Session.getInstance(props,null);
try
{
InternetAddress[]receiver=getReceiverList();
if(receiver.length==0)
{
System.out.println("receiverisnull");
returnfalse;
}
MimeMessagemsg=newMimeMessage(session);
msg.setFrom(newInternetAddress(sender));
msg.setRecipients(Message.RecipientType.TO,receiver);
msg.setSubject(subject);
msg.setSentDate(newDate());
Multipartcontainer=newMimeMultipart();
MimeBodyParttextBodyPart=newMimeBodyPart();
textBodyPart.setContent(content.toString(),"text/html;charset=gbk");
container.addBodyPart(textBodyPart);
doAttachFile(container,fileNames);
msg.setContent(container);
System.out.println("beginsendmail");
Transport.send(msg);
System.out.println("sendmailsuccess");
}
catch(MessagingExceptione)
{
System.out.println("sendmailfail");
System.out.println(e);
returnfalse;
}
catch(Exceptione){
returnfalse;
}
returntrue;
}
publicbooleansend(Stringsubject,Stringcontent){
returnsend(subject,content,null);
}
publicbooleansend(Stringsubject){
returnsend(subject,null);
}
privatevoiddoAttachFile(Multipartcontainer,List<String>fileNames)throwsMessagingException{
if(fileNames==null||fileNames.size()==0)
return;
for(Stringfilename:fileNames){
Filef=newFile(filename);
if(!f.isFile())
continue;
System.out.println("theattachfileis:"+filename);
MimeBodyPartfileBodyPart=newMimeBodyPart();
FileDataSourcefds=newFileDataSource(f);//要发送的附件地址
fileBodyPart.setDataHandler(newDataHandler(fds));
fileBodyPart.setFileName(fds.getName());//设置附件的名称
container.addBodyPart(fileBodyPart);
}
}
privateInternetAddress[]getReceiverList()throwsAddressException
{
ArrayList<InternetAddress>toList=newArrayList<InternetAddress>();
for(inti=0;i<receiver.length;++i)
{
if(receiver[i].matches(MAIL_ADDRESS_REGEX))
{
toList.add(newInternetAddress(receiver[i]));
}
}
return(InternetAddress[])toList.toArray(newInternetAddress[toList.size()]);
}
}
使用举例
Stringhost="168.xx.xx.xx";//邮件服务器的地址
Stringsubject="发送邮件的主题";
Stringsender="test@gmail.com";
List<String>receivers=newArrayList<String>();
receivers.add("user1@263.com");
receivers.add("user2@263.com");
Stringcontent="邮件主题";
SendMailsendMail=newSendMail();
sendMail.setMailBasicInfo(host,sender,receivers);
sendMail.send(subject,content,null);//没有附件
正文也可以是html内容,如
Stringcontent="<html>详细信息:<ahref='xxxx'>请点击查看!</a></html>";
我们再来看一个封装好的类
packagecom.message.base.email;
importcom.message.base.spring.ApplicationHelper;
importcom.message.base.utils.StringUtils;
importcom.message.base.utils.ValidateUtils;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjavax.mail.*;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeMessage;
importjava.util.Collections;
importjava.util.Date;
importjava.util.List;
importjava.util.Properties;
/**
*发送邮件服务器.
*
*@authorsunhao(sunhao.java@gmail.com)
*@versionV1.0,13-3-25上午6:19
*/
publicclassEmailServer{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(EmailServer.class);
//spring中配置
/**邮箱服务器配置**/
privateList<EmailConfig>config;
/**是否开启debug调试模式**/
privatebooleanisDebug=false;
/**是否启用身份验证**/
privatebooleanisAuth=true;
/**验证类型**/
privateStringauthType="auth";
/**
*私有化默认构造器,使外部不可实例化
*/
privateEmailServer(){}
/**
*单例,保证上下文中只有一个EmailServer
*
*@returnEmailServer
*/
publicstaticEmailServergetInstance(){
returnApplicationHelper.getInstance().getBean(EmailServer.class);
}
/**
*发送普通邮件(单个接收人)
*
*@paramusername发件人用户名
*@parampassword发件人密码
*@paramtitle邮件标题
*@paramcontent邮件正文
*@paramreceiver单个接收人
*@return
*/
publicbooleansendTextMail(Stringusername,Stringpassword,Stringtitle,Stringcontent,Stringreceiver){
returnthis.sendTextMail(username,password,title,content,Collections.singletonList(receiver));
}
/**
*发送普通邮件(多个接收人)
*
*@paramusername发件人用户名
*@parampassword发件人密码
*@paramtitle邮件标题
*@paramcontent邮件正文
*@paramreceivers多个接收人
*@return
*/
publicbooleansendTextMail(Stringusername,Stringpassword,Stringtitle,Stringcontent,List<String>receivers){
Authenticationauth=null;
if(this.isAuth()){
//如果需要身份认证,则创建一个密码验证器
auth=newAuthentication(username,password);
}
Propertiesprops=newProperties();
props.setProperty("mail.smtp.auth",this.isAuth()?"true":"false");
props.setProperty("mail.transport.protocol","auth");
EmailConfigconfig=this.getEmailConfig(username);
props.setProperty("mail.smtp.host",config.getSmtp());
props.setProperty("mail.smtp.port",config.getPort()+"");
//根据邮件会话属性和密码验证器构造一个发送邮件的session
Sessionsession=Session.getDefaultInstance(props,auth);
session.setDebug(this.isDebug);
Messagemessage=this.makeTextMail(session,title,content,username,receivers,false);
try{
Transport.send(message);
returntrue;
}catch(MessagingExceptione){
logger.error(e.getMessage(),e);
returnfalse;
}
}
/**
*发送HTML邮件(单个接收人)
*
*@paramusername发件人用户名
*@parampassword发件人密码
*@paramtitle邮件标题
*@paramcontent邮件正文
*@paramreceiver单个接收人
*@return
*/
publicbooleansendHtmlMail(Stringusername,Stringpassword,Stringtitle,Stringcontent,Stringreceiver){
returnthis.sendHtmlMail(username,password,title,content,Collections.singletonList(receiver));
}
/**
*发送HTML邮件(多个接收人)
*
*@paramusername发件人用户名
*@parampassword发件人密码
*@paramtitle邮件标题
*@paramcontent邮件正文
*@paramreceivers多个接收人
*@return
*/
publicbooleansendHtmlMail(Stringusername,Stringpassword,Stringtitle,Stringcontent,List<String>receivers){
Authenticationauth=null;
if(this.isAuth()){
//如果需要身份认证,则创建一个密码验证器
auth=newAuthentication(username,password);
}
Propertiesprops=newProperties();
props.setProperty("mail.smtp.auth",this.isAuth()?"true":"false");
props.setProperty("mail.transport.protocol","auth");
EmailConfigconfig=this.getEmailConfig(username);
props.setProperty("mail.smtp.host",config.getSmtp());
props.setProperty("mail.smtp.port",config.getPort()+"");
//根据邮件会话属性和密码验证器构造一个发送邮件的session
Sessionsession=Session.getDefaultInstance(props,auth);
session.setDebug(this.isDebug);
Messagemessage=this.makeTextMail(session,title,content,username,receivers,true);
try{
Transport.send(message);
returntrue;
}catch(MessagingExceptione){
logger.error(e.getMessage(),e);
returnfalse;
}
}
/**
*获取邮件服务器配置
*
*@paramemail邮箱地址
*@return
*/
privateEmailConfiggetEmailConfig(Stringemail){
StringmailServiceDomainName=this.getMailServiceDomainName(email);
for(EmailConfigconfig:this.config){
if(config.getName().equals(mailServiceDomainName)){
returnconfig;
}
}
returnnull;
}
/**
*创建邮件message
*
*@paramsession根据配置获得的session
*@paramtitle邮件主题
*@paramcontent邮件的内容
*@paramfrom发件者
*@paramreceivers收件者
*@paramisHtmlMail是否是html邮件
*/
privateMessagemakeTextMail(Sessionsession,Stringtitle,Stringcontent,Stringfrom,List<String>receivers,booleanisHtmlMail){
Messagemessage=newMimeMessage(session);
try{
/**标题**/
logger.info("thismail'stitleis{}",title);
message.setSubject(title);
/**内容**/
logger.info("thismail'scontentis{}",content);
if(isHtmlMail){
//是html邮件
message.setContent(content,"text/html;charset=utf-8");
}else{
//普通邮件
message.setText(content);
}
/**发件者地址**/
logger.info("thismail'ssenderis{}",from);
AddressfromAddress=newInternetAddress(from);
message.setFrom(fromAddress);
/**接收者地址**/
Address[]tos=newInternetAddress[receivers.size()];
for(inti=0;i<receivers.size();i++){
Stringreceiver=receivers.get(i);
if(ValidateUtils.isEmail(receiver)){
tos[i]=newInternetAddress(receiver);
}
}
/**发件时间**/
message.setSentDate(newDate());
message.setRecipients(Message.RecipientType.TO,tos);
}catch(MessagingExceptione){
logger.error(e.getMessage(),e);
e.printStackTrace();
}
returnmessage;
}
/**
*获取邮箱域名
*
*@paramemail邮箱
*@return
*/
privateStringgetMailServiceDomainName(Stringemail){
if(StringUtils.isEmpty(email)){
return"";
}else{
intfirstIndex=StringUtils.indexOf(email,"@");
intsecondIndex=StringUtils.lastIndexOf(email,".");
returnStringUtils.substring(email,firstIndex+1,secondIndex);
}
}
publicList<EmailConfig>getConfig(){
returnconfig;
}
publicvoidsetConfig(List<EmailConfig>config){
this.config=config;
}
publicbooleanisDebug(){
returnisDebug;
}
publicvoidsetDebug(booleandebug){
isDebug=debug;
}
publicbooleanisAuth(){
returnisAuth;
}
publicvoidsetAuth(booleanauth){
isAuth=auth;
}
publicStringgetAuthType(){
returnauthType;
}
publicvoidsetAuthType(StringauthType){
this.authType=authType;
}
}
调用方式如下
publicbooleansendMail()throwsException{
List<String>receivers=newArrayList<String>();
receivers.add("sunhao0550@163.com");
receivers.add("sunhao0550@sina.cn");
EmailServer.getInstance().sendHtmlMail("message_admin@163.com","这里是密码","测试发送HTML邮件",
"<spanstyle='color:red;font-size:20pt'>测试发送HTML邮件</span><ahref='http://www.baidu.com'target='_blank'>链接到百度</a>",receivers);
returnEmailServer.getInstance().sendTextMail("message_admin@163.com","这里是密码","测试发送文本邮件",
"测试发送文本邮件测试发送文本邮件测试发送文本邮件",receivers);
}
PS:正在考虑扩展,如果把这几个类封在jar包中,如何进行邮件服务器配置的扩展.
如有不好之处,欢迎拍砖.