谈谈在Java发送邮件中遇到的的问题

 更新时间:2016年08月22日 09:33:02   投稿:daisy  
本文介绍了在利用Java发送邮件过程中遇到的的两个问题,以及如何解决这两个问题。如果大家也遇到了这些问题,可以来参考借鉴。

前言

发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软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();
  }
 }
 
}

以上就是本文的全部内容,希望本文的内容对大家的学习工作能有所帮助。

相关文章

  • java正则表达式之Pattern与Matcher类详解

    java正则表达式之Pattern与Matcher类详解

    这篇文章主要给大家介绍了关于java正则表达式之Pattern与Matcher类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java ThreadPool线程池的使用,线程池工具类用法说明

    java ThreadPool线程池的使用,线程池工具类用法说明

    这篇文章主要介绍了java ThreadPool线程池的使用,线程池工具类用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • SpringBoot整合Shiro的环境搭建教程

    SpringBoot整合Shiro的环境搭建教程

    这篇文章主要为大家详细介绍了SpringBoot整合Shiro的环境搭建教程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-12-12
  • 如何解决使用restTemplate进行feign调用new HttpEntity<>报错问题

    如何解决使用restTemplate进行feign调用new HttpEntity<>报错问题

    这篇文章主要介绍了如何解决使用restTemplate进行feign调用new HttpEntity<>报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • springboot +rabbitmq+redis实现秒杀示例

    springboot +rabbitmq+redis实现秒杀示例

    本文主要介绍了springboot +rabbitmq+redis实现秒杀示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java单链表的简单操作实现教程

    Java单链表的简单操作实现教程

    这篇文章主要给大家介绍了关于Java单链表的简单操作实现教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 图解JAVA中Spring Aop作用

    图解JAVA中Spring Aop作用

    这篇文章主要介绍了Java的Spring框架下的AOP的作用,需要的朋友可以参考
    2017-04-04
  • SpringBoot处理 CORS 跨域的方法详解

    SpringBoot处理 CORS 跨域的方法详解

    Springboot跨域问题,是当前主流web开发人员都绕不开的难题,CORS是一个W3C标准,全称是”跨域资源共享”,本文将给大家详细介绍SpringBoot 如何处理 CORS 跨域,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • spring中REST和RESTful的区别以及基本实现

    spring中REST和RESTful的区别以及基本实现

    本文主要介绍了spring中REST和RESTful的区别以及基本实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 关于mybatis传入参数一直为null的问题

    关于mybatis传入参数一直为null的问题

    这篇文章主要介绍了关于mybatis传入参数一直为null的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论