Java实现简单邮件发送
JAVAMAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVAMail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。
Java邮件发送的大致过程是这样的:
1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。
2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。
3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。
4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。
5、使用javax.mail.Transport工具类发送邮件。
下面是我封装的代码,注释也比较详细。
1、首先是继承自javax.mail.Authenticator的一个具体类。getPasswordAuthentication()方法也就是构建一个PasswordAuthentication对象并返回,有点费解JAVAMail这样的设计意图,可能是javax.mail.Authenticator为我们提供了附加的保证安全的验证措施吧。
packagecom.mzule.simplemail; 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、邮件发送类,剩下的步骤都是在这个类实现的。代码中的SimpleMail是封装了邮件主题和内容的一个POJO。觉得在一个方法参数中既包含主题又包含内容,不太合适,故重载了此方法。还有就是因为大多数邮箱的SMTP服务器地址都是可以通过邮箱地址算出来,简单起见,提供了一个不需要SMTP服务器地址的构造器。
packagecom.mzule.simplemail; importjava.util.List; importjava.util.Properties; 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; /** *简单邮件发送器,可单发,群发。 * *@authorMZULE * */ 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服务器,对大多数邮箱都管用 finalStringsmtpHostName="smtp."+username.split("@")[1]; init(username,password,smtpHostName); } /** *初始化 * *@paramusername *发送邮件的用户名(地址) *@parampassword *密码 *@paramsmtpHostName *SMTP主机地址 */ privatevoidinit(Stringusername,Stringpassword,StringsmtpHostName){ //初始化props props.put("mail.smtp.auth","true"); props.put("mail.smtp.host",smtpHostName); //验证 authenticator=newMailAuthenticator(username,password); //创建session session=Session.getInstance(props,authenticator); } /** *发送邮件 * *@paramrecipient *收件人邮箱地址 *@paramsubject *邮件主题 *@paramcontent *邮件内容 *@throwsAddressException *@throwsMessagingException */ publicvoidsend(Stringrecipient,Stringsubject,Objectcontent) throwsAddressException,MessagingException{ //创建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(List<String>recipients,Stringsubject,Objectcontent) throwsAddressException,MessagingException{ //创建mime类型邮件 finalMimeMessagemessage=newMimeMessage(session); //设置发信人 message.setFrom(newInternetAddress(authenticator.getUsername())); //设置收件人们 finalintnum=recipients.size(); InternetAddress[]addresses=newInternetAddress[num]; for(inti=0;i<num;i++){ addresses[i]=newInternetAddress(recipients.get(i)); } message.setRecipients(RecipientType.TO,addresses); //设置主题 message.setSubject(subject); //设置邮件内容 message.setContent(content.toString(),"text/html;charset=utf-8"); //发送 Transport.send(message); } /** *发送邮件 * *@paramrecipient *收件人邮箱地址 *@parammail *邮件对象 *@throwsAddressException *@throwsMessagingException */ publicvoidsend(Stringrecipient,SimpleMailmail) throwsAddressException,MessagingException{ send(recipient,mail.getSubject(),mail.getContent()); } /** *群发邮件 * *@paramrecipients *收件人们 *@parammail *邮件对象 *@throwsAddressException *@throwsMessagingException */ publicvoidsend(List<String>recipients,SimpleMailmail) throwsAddressException,MessagingException{ send(recipients,mail.getSubject(),mail.getContent()); } }
3、调用上面的邮箱发送器,可以构建一个工厂类,工厂类可以封装创建的过程,所以通过读配置文件获取邮箱用户名,密码都会变得十分方便。下面的代码是我在写观察者模式的时候写的,只是简单演示了工厂类。
packagecom.mzule.dp.observer.factory; importcom.mzule.dp.observer.constant.MailSenderType; importcom.mzule.simplemail.SimpleMailSender; /** *发件箱工厂 * *@authorMZULE * */ publicclassMailSenderFactory{ /** *服务邮箱 */ privatestaticSimpleMailSenderserviceSms=null; /** *获取邮箱 * *@paramtype邮箱类型 *@return符合类型的邮箱 */ publicstaticSimpleMailSendergetSender(MailSenderTypetype){ if(type==MailSenderType.SERVICE){ if(serviceSms==null){ serviceSms=newSimpleMailSender("invisible@126.com", "hidden"); } returnserviceSms; } returnnull; } }
4、发送邮件,还是观察者模式DEMO里面的代码,呼呼。
packagecom.mzule.dp.observer.observer; importjava.util.ArrayList; importjava.util.List; importjava.util.Observable; importjava.util.Observer; importjavax.mail.MessagingException; importjavax.mail.internet.AddressException; importcom.mzule.dp.observer.constant.MailSenderType; importcom.mzule.dp.observer.factory.MailSenderFactory; importcom.mzule.dp.observer.po.Product; importcom.mzule.simplemail.SimpleMailSender; publicclassProductPriceObserverimplementsObserver{ @Override publicvoidupdate(Observableobj,Objectarg){ Productproduct=null; if(objinstanceofProduct){ product=(Product)obj; } if(arginstanceofFloat){ Floatprice=(Float)arg; Floatdecrease=product.getPrice()-price; if(decrease>0){ //发送邮件 SimpleMailSendersms=MailSenderFactory .getSender(MailSenderType.SERVICE); List<String>recipients=newArrayList<String>(); recipients.add("invisible@qq.com"); recipients.add("invisible@gmail.com"); try{ for(Stringrecipient:recipients){ sms.send(recipient,"价格变动","您关注的物品" +product.getName()+"降价了,由" +product.getPrice()+"元降到"+price+"元,降幅达" +decrease+"元人民币。赶快购物吧。"); } }catch(AddressExceptione){ e.printStackTrace(); }catch(MessagingExceptione){ e.printStackTrace(); } } } } }
5、查看邮件是否发送成功了。
以上就是java邮件发送的全部过程,希望对大家的学习有所帮助。