谈谈在Java发送邮件中遇到的的问题
前言
发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软office365邮件服务后,却遇到了两个问题。
问题一,tls加密设置
异常信息如下:
Exceptioninthread"main"com.sun.mail.smtp.SMTPSendFailedException:5305.7.57SMTP;ClientwasnotauthenticatedtosendanonymousmailduringMAILFROM
这个解决起来比较容易。找了些资料,添加如下配置即可:
mail.smtp.starttls.enable=true
问题二,提示协议为null:
异常信息如下:
Exceptioninthread"main"javax.mail.NoSuchProviderException:Invalidprotocol:null atjavax.mail.Session.getProvider(Session.java:449) atjavax.mail.Session.getTransport(Session.java:667) atjavax.mail.Session.getTransport(Session.java:648) atjavax.mail.Session.getTransport(Session.java:634)
这个问题是在将应用部署到生产环境后才遇到的。经检查后发现调用的jar包不是我在maven中指定的版本。后来确认是应用使用的jar包和容器(就是jetty)使用的jar包冲突了。容器使用的jar版本较旧,不过默认优先加载容器的jar。这样问题解决思路有两个:
依赖容器的jar重新写代码;
更新容器的jar。
第二个选择多少有些危险,就采用第一个选项好了,只需要修改一行即可:
Transporttransport=session.getTransport("smtp");
这个问题在javax.mail1.4版本中会出现。之后较高的版本会默认采用SMTP协议发送邮件。
修改后的程序:
packagecom.zhyea.zytools; importjava.util.Date; importjava.util.Properties; importjavax.mail.Message; importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeMessage; publicclassMailSender{ privatestaticfinalStringMAIL_SMTP_HOST="smtp.exmail.qq.com"; privatestaticfinalIntegerMAIL_SMTP_PORT=587; privatestaticfinalBooleanMAIL_SMTP_AUTH=true; privatestaticfinalStringMAIL_SMTP_USER="robin@zhyea.com"; privatestaticfinalStringMAIL_SMTP_PASSWORD="robinzhyea"; privatestaticPropertiesprops=newProperties(); 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); } /** *发送邮件 */ publicstaticvoidsend(Stringto,Stringtitle,Stringcontent){ try{ Sessionsession=Session.getInstance(props);//创建邮件会话 MimeMessagemessage=newMimeMessage(session);//由邮件会话新建一个消息对象 message.setFrom(newInternetAddress(MAIL_SMTP_PASSWORD));//设置发件人的地址 message.setRecipient(Message.RecipientType.TO,newInternetAddress(to));//设置收件人,并设置其接收类型为TO //设置信件内容 //message.setText(mailContent);//发送纯文本邮件TODO message.setSubject(title);//设置标题 message.setContent(content,"text/html;charset=gbk");//发送HTML邮件,内容样式比较丰富 message.setSentDate(newDate());//设置发信时间 message.saveChanges();//存储邮件信息 //发送邮件 Transporttransport=session.getTransport("smtp"); transport.connect(MAIL_SMTP_USER,MAIL_SMTP_PASSWORD); transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址 transport.close(); }catch(Exceptione){ e.printStackTrace(); } } } packagecom.zhyea.zytools; importjava.util.Date; importjava.util.Properties; importjavax.mail.Message; importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeMessage; publicclassMailSender{ privatestaticfinalStringMAIL_SMTP_HOST="smtp.exmail.qq.com"; privatestaticfinalIntegerMAIL_SMTP_PORT=587; privatestaticfinalBooleanMAIL_SMTP_AUTH=true; privatestaticfinalStringMAIL_SMTP_USER="robin@zhyea.com"; privatestaticfinalStringMAIL_SMTP_PASSWORD="robinzhyea"; privatestaticPropertiesprops=newProperties(); 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); } /** *发送邮件 */ publicstaticvoidsend(Stringto,Stringtitle,Stringcontent){ try{ Sessionsession=Session.getInstance(props);//创建邮件会话 MimeMessagemessage=newMimeMessage(session);//由邮件会话新建一个消息对象 message.setFrom(newInternetAddress(MAIL_SMTP_PASSWORD));//设置发件人的地址 message.setRecipient(Message.RecipientType.TO,newInternetAddress(to));//设置收件人,并设置其接收类型为TO //设置信件内容 //message.setText(mailContent);//发送纯文本邮件TODO message.setSubject(title);//设置标题 message.setContent(content,"text/html;charset=gbk");//发送HTML邮件,内容样式比较丰富 message.setSentDate(newDate());//设置发信时间 message.saveChanges();//存储邮件信息 //发送邮件 Transporttransport=session.getTransport("smtp"); transport.connect(MAIL_SMTP_USER,MAIL_SMTP_PASSWORD); transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址 transport.close(); }catch(Exceptione){ e.printStackTrace(); } } }
以上就是本文的全部内容,希望本文的内容对大家的学习工作能有所帮助。