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包中,如何进行邮件服务器配置的扩展.
如有不好之处,欢迎拍砖.