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;i recipients,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邮件发送简单封装
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。