谈谈在Java发送邮件中遇到的的问题
程序员文章站
2024-03-13 14:50:57
前言
发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软office365邮件服务后,却遇到了两个问题...
前言
发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软office365邮件服务后,却遇到了两个问题。
问题一,tls加密设置
异常信息如下:
exception in thread "main" com.sun.mail.smtp.smtpsendfailedexception: 530 5.7.57 smtp; client was not authenticated to send anonymous mail during mail from
这个解决起来比较容易。找了些资料,添加如下配置即可:
mail.smtp.starttls.enable = true
问题二,提示协议为null:
异常信息如下:
exception in thread "main" javax.mail.nosuchproviderexception: invalid protocol: null at javax.mail.session.getprovider(session.java:449) at javax.mail.session.gettransport(session.java:667) at javax.mail.session.gettransport(session.java:648) at javax.mail.session.gettransport(session.java:634)
这个问题是在将应用部署到生产环境后才遇到的。经检查后发现调用的jar包不是我在maven中指定的版本。后来确认是应用使用的jar包和容器(就是jetty)使用的jar包冲突了。容器使用的jar版本较旧,不过默认优先加载容器的jar。这样问题解决思路有两个:
依赖容器的jar重新写代码;
更新容器的jar。
第二个选择多少有些危险,就采用第一个选项好了,只需要修改一行即可:
transport transport = session.gettransport("smtp");
这个问题在javax.mail 1.4版本中会出现。之后较高的版本会默认采用smtp协议发送邮件。
修改后的程序:
package com.zhyea.zytools; import java.util.date; import java.util.properties; import javax.mail.message; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; public class mailsender { private static final string mail_smtp_host = "smtp.exmail.qq.com"; private static final integer mail_smtp_port = 587; private static final boolean mail_smtp_auth = true; private static final string mail_smtp_user = "robin@zhyea.com"; private static final string mail_smtp_password = "robinzhyea"; private static properties props = new properties(); static { props.put("mail.smtp.host", mail_smtp_host); props.put("mail.smtp.auth", mail_smtp_auth); props.put("mail.smtp.user", mail_smtp_user); props.put("mail.smtp.password", mail_smtp_password); props.put("mail.smtp.starttls.enable", true); } /** * 发送邮件 */ public static void send(string to, string title, string content) { try { session session = session.getinstance(props);//创建邮件会话 mimemessage message = new mimemessage(session);//由邮件会话新建一个消息对象 message.setfrom(new internetaddress(mail_smtp_password));//设置发件人的地址 message.setrecipient(message.recipienttype.to, new internetaddress(to));//设置收件人,并设置其接收类型为to //设置信件内容 //message.settext(mailcontent); //发送 纯文本 邮件 todo message.setsubject(title);//设置标题 message.setcontent(content, "text/html;charset=gbk"); //发送html邮件,内容样式比较丰富 message.setsentdate(new date());//设置发信时间 message.savechanges();//存储邮件信息 //发送邮件 transport transport = session.gettransport("smtp"); transport.connect(mail_smtp_user, mail_smtp_password); transport.sendmessage(message, message.getallrecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址 transport.close(); } catch (exception e) { e.printstacktrace(); } } } package com.zhyea.zytools; import java.util.date; import java.util.properties; import javax.mail.message; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; public class mailsender { private static final string mail_smtp_host = "smtp.exmail.qq.com"; private static final integer mail_smtp_port = 587; private static final boolean mail_smtp_auth = true; private static final string mail_smtp_user = "robin@zhyea.com"; private static final string mail_smtp_password = "robinzhyea"; private static properties props = new properties(); static { props.put("mail.smtp.host", mail_smtp_host); props.put("mail.smtp.auth", mail_smtp_auth); props.put("mail.smtp.user", mail_smtp_user); props.put("mail.smtp.password", mail_smtp_password); props.put("mail.smtp.starttls.enable", true); } /** * 发送邮件 */ public static void send(string to, string title, string content) { try { session session = session.getinstance(props);//创建邮件会话 mimemessage message = new mimemessage(session);//由邮件会话新建一个消息对象 message.setfrom(new internetaddress(mail_smtp_password));//设置发件人的地址 message.setrecipient(message.recipienttype.to, new internetaddress(to));//设置收件人,并设置其接收类型为to //设置信件内容 //message.settext(mailcontent); //发送 纯文本 邮件 todo message.setsubject(title);//设置标题 message.setcontent(content, "text/html;charset=gbk"); //发送html邮件,内容样式比较丰富 message.setsentdate(new date());//设置发信时间 message.savechanges();//存储邮件信息 //发送邮件 transport transport = session.gettransport("smtp"); transport.connect(mail_smtp_user, mail_smtp_password); transport.sendmessage(message, message.getallrecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址 transport.close(); } catch (exception e) { e.printstacktrace(); } } }
以上就是本文的全部内容,希望本文的内容对大家的学习工作能有所帮助。