Java实现邮件发送遇到的问题

 更新时间:2016年09月11日 15:36:53   投稿:hebedich   我要评论

本文给大家分享的是个人在项目过程中,使用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。这样问题解决思路有两个:

  1. 依赖容器的jar重新写代码;
  2. 更新容器的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();
    }
  }
  
}

相关文章

  • java在linux系统下开机启动无法使用sudo命令的原因及解决办法

    java在linux系统下开机启动无法使用sudo命令的原因及解决办法

    每次开机自动启动的java进程,页面上的关机按钮都无法实现关机功能,但是此时如果以chb账号通过ssh登录该服务器,手动杀掉tomcat进程,然后再重新启动tomcat,页面上的关机按钮就有效了
    2013-08-08
  • javz笔记之:有趣的静态方法的使用

    javz笔记之:有趣的静态方法的使用

    本篇文章介绍了,java中静态方法的使用介绍,需要的朋友参考下
    2013-04-04
  • 全面解析JTA 深度历险

    全面解析JTA 深度历险

    本文介绍了利用 JTA 深度历险的相关内容,充分举例说明JTA的原理和事务处理等相关内容,十分详细,需要的朋友可以参考下。
    2017-09-09
  • 在java中实现C#语法里的按引用传递参数的方法

    在java中实现C#语法里的按引用传递参数的方法

    下面小编就为大家带来一篇在java中实现C#语法里的按引用传递参数的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • java_String和StringBuffer区别分析

    java_String和StringBuffer区别分析

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。
    2013-04-04
  • 通过java反射机制动态调用某方法的总结(推荐)

    通过java反射机制动态调用某方法的总结(推荐)

    下面小编就为大家带来一篇通过java反射机制动态调用某方法的总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Hadoop之NameNode Federation图文详解

    Hadoop之NameNode Federation图文详解

    今天小编就为大家分享一篇关于Hadoop之NameNode Federation图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 使用Servlet处理一个上传的文件

    使用Servlet处理一个上传的文件

    今天小编就为大家分享一篇关于使用Servlet处理一个上传的文件,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java父线程(或是主线程)等待所有子线程退出的实例

    Java父线程(或是主线程)等待所有子线程退出的实例

    下面小编就为大家分享一篇Java父线程(或是主线程)等待所有子线程退出的实例,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • Spring Boot应用配置常用相关视图解析器详解

    Spring Boot应用配置常用相关视图解析器详解

    这篇文章主要给大家介绍了关于Spring Boot应用配置常用相关视图解析器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论