Java Mail邮件发送如何实现简单封装
首先每次发送需要配置的东西很多,包括发件人的邮箱和密码、smtp服务器和SMTP端口号等信息。其次,没有将发送和邮件内容相分离。按照单一职责原则,应该有且仅有一个原因引起类的变更[1]。最后一个问题是,我们的代码不仅自己用,也很可能让别人调用。别人调用的时候不想去了解邮件发送的细节,调用的人只想传尽量少的参数获得预期的效果。因此让Demo变成可以使用的代码需要我们重新设计代码的结构。
从Demo中我们可以抽象出两种类型的POJO,也就是发件人和邮件。你可能会问收件人怎么办?收件人可以跟邮件POJO放在一起吗?
仔细思考下我们就知道,邮件和收件人应该是分开的。因为如果邮件和收件人放在一起,那么就意味着我的一封邮件只能发送给特定的人了,而实际上我们会把相同的邮件发送给不同的收件人。因此收件人只要作为发送时的参数就可以了。
1.发件人POJO
/**
*@Title:MailAuthenticator
*@author:ykgao
*@description:
*@date:2017-10-11下午04:55:37
*/
importjavax.mail.Authenticator;
importjavax.mail.PasswordAuthentication;
/**
*服务器邮箱登录验证
*
*@authorMZULE
*
*/
publicclassMailAuthenticatorextendsAuthenticator{
/**
*用户名(登录邮箱)
*/
privateStringusername;
/**
*密码
*/
privateStringpassword;
/**
*初始化邮箱和密码
*
*@paramusername邮箱
*@parampassword密码
*/
publicMailAuthenticator(Stringusername,Stringpassword){
this.username=username;
this.password=password;
}
StringgetPassword(){
returnpassword;
}
@Override
protectedPasswordAuthenticationgetPasswordAuthentication(){
returnnewPasswordAuthentication(username,password);
}
StringgetUsername(){
returnusername;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
}
2.邮件POJO
用于存储邮件主题和内容。
/**
*@Title:SimpleMail
*@author:ykgao
*@description:
*@date:2017-10-11下午04:56:27
*/
publicclassSimpleMail{
/**邮件主题*/
publicStringSubject;
/**邮件内容*/
publicStringContent;
/**
*@returnthesubject
*/
publicStringgetSubject(){
returnSubject;
}
/**
*@paramsubject
*thesubjecttoset
*/
publicvoidsetSubject(Stringsubject){
Subject=subject;
}
/**
*@returnthecontent
*/
publicStringgetContent(){
returnContent;
}
/**
*@paramcontent
*thecontenttoset
*/
publicvoidsetContent(Stringcontent){
Content=content;
}
}
3.邮件发送
设计好了POJO,我们现在需要当然是发送邮件了。在Demo中我们需要配置SMTP服务器,但是我们使用邮箱发送邮件的时候并不需要填写SMTP服务器。其实SMTP服务器大多数的格式是:smtp.emailType.com。此处emailType就是你的邮箱类型也就是@后面跟的名称。比如163邮箱就是163。不过这个方法也不是万能的,因为outlook邮箱的smtp服务器就不是这个格式,而是smtp-mail.outlook.com,所以我单独为outlook邮箱写了个例外。
我们还需要群分邮件的功能。这个设计起来很容易,只需要一个单人发送的重载方法,其收件人的参数可以是一个List。
为了减少接口的参数个数,我们把SMTP端口默认为587。
importjava.io.UnsupportedEncodingException;
importjava.security.GeneralSecurityException;
importjava.util.List;
importjava.util.Properties;
importjavaMailDevelopment.SimpleMail;
importjavax.mail.MessagingException;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.AddressException;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMessage.RecipientType;
importcom.sun.mail.util.MailSSLSocketFactory;
/**
*@Title:SimpleMailSender
*@author:ykgao
*@description:邮件发送器
*@date:2017-10-11下午04:54:50
*/
publicclassSimpleMailSender{
/**
*发送邮件的props文件
*/
privatefinaltransientPropertiesprops=System.getProperties();
/**
*邮件服务器登录验证
*/
privatetransientMailAuthenticatorauthenticator;
/**
*邮箱session
*/
privatetransientSessionsession;
/**
*初始化邮件发送器
*
*@paramsmtpHostName
*SMTP邮件服务器地址
*@paramusername
*发送邮件的用户名(地址)
*@parampassword
*发送邮件的密码
*/
publicSimpleMailSender(finalStringsmtpHostName,finalStringusername,finalStringpassword){
init(username,password,smtpHostName);
}
/**
*初始化邮件发送器
*
*@paramusername
*发送邮件的用户名(地址),并以此解析SMTP服务器地址
*@parampassword
*发送邮件的密码
*/
publicSimpleMailSender(finalStringusername,finalStringpassword){
//通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
StringsmtpHostName="smtp."+username.split("@")[1];
if(username.split("@")[1].equals("outlook.com")){
smtpHostName="smtp-mail.outlook.com";
}
init(username,password,smtpHostName);
}
/**
*初始化
*
*@paramusername
*发送邮件的用户名(地址)
*@parampassword
*密码
*@paramsmtpHostName
*SMTP主机地址
*/
privatevoidinit(Stringusername,Stringpassword,StringsmtpHostName){
//初始化props
props.setProperty("mail.transport.protocol","smtp");//使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host",smtpHostName);//发件人的邮箱的SMTP服务器地址
props.setProperty("mail.smtp.auth","true");//需要请求认证
finalStringsmtpPort="587";
props.setProperty("mail.smtp.port",smtpPort);
//props.setProperty("mail.smtp.socketFactory.class",
//"javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback","false");
props.setProperty("mail.smtp.starttls.enable","true");
props.setProperty("mail.smtp.socketFactory.port",smtpPort);
//验证
authenticator=newMailAuthenticator(username,password);
//创建session
session=Session.getInstance(props,authenticator);
session.setDebug(true);
}
/**
*发送邮件
*
*@paramrecipient
*收件人邮箱地址
*@paramsubject
*邮件主题
*@paramcontent
*邮件内容
*@throwsAddressException
*@throwsMessagingException
*@throwsUnsupportedEncodingException
*/
publicvoidsend(Stringrecipient,Stringsubject,Objectcontent)throwsException{
//创建mime类型邮件
finalMimeMessagemessage=newMimeMessage(session);
//设置发信人
message.setFrom(newInternetAddress(authenticator.getUsername()));
//设置收件人
message.setRecipient(RecipientType.TO,newInternetAddress(recipient));
//设置主题
message.setSubject(subject);
//设置邮件内容
message.setContent(content.toString(),"text/html;charset=utf-8");
//发送
Transport.send(message);
}
/**
*群发邮件
*
*@paramrecipients
*收件人们
*@paramsubject
*主题
*@paramcontent
*内容
*@throwsAddressException
*@throwsMessagingException
*/
publicvoidsend(Listrecipients,Stringsubject,Objectcontent)
throwsAddressException,MessagingException{
//创建mime类型邮件
finalMimeMessagemessage=newMimeMessage(session);
//设置发信人
message.setFrom(newInternetAddress(authenticator.getUsername()));
//设置收件人们
finalintnum=recipients.size();
InternetAddress[]addresses=newInternetAddress[num];
for(inti=0;irecipients,SimpleMailmail)throwsAddressException,MessagingException{
send(recipients,mail.getSubject(),mail.getContent());
}
}
4.测试代码
代码写完了,现在需要测试下代码是否可行。
importjava.util.ArrayList;
importjava.util.List;
/**
*@Title:testMail
*@author:ykgao
*@description:
*@date:2017-10-11下午02:13:02
*
*/
publicclasstestMail{
publicstaticvoidmain(String[]args)throwsException{
/**创建一个邮件发送者*/
SimpleMailSendersimpleMailSeJavaMail邮件发送简单封装
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。