发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软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。这样问题解决思路有两个:
第二个选择多少有些危险,就采用第一个选项好了,只需要修改一行即可:
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邮件发送的实现,包括了java邮件发送的实现的使用技巧和注意事项,需要的朋友参考一下 邮件是在日常生活中,这篇文章主要介绍了java实现基于SMTP发送邮件的方法,实例分析了java基于SMTP服务发送邮件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 1.写一个 MailSendProper 类封装需要的属性 2、写一个 EmailMessage 封装 发送信息
本文向大家介绍Java实现简单邮件发送,包括了Java实现简单邮件发送的使用技巧和注意事项,需要的朋友参考一下 JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。 Java邮件发送的大致过程是这样的: 1、构建一个继承自
本文向大家介绍java实现发送邮件功能,包括了java实现发送邮件功能的使用技巧和注意事项,需要的朋友参考一下 前言 前段时间做一个紧急的功能,其中有部分需求是需要发邮件通知;通过查阅以及实验,很快的写了个发送邮件的功能;现在整理一下记录下来。 发送邮件 一、在pom中引入相关依赖 二、发送邮件的工具类 三、遇到的坑 在本地测试没有问题;我们的测试服务在阿里云上,阿里云对发送的时候是失败;追踪日志
本文向大家介绍Java发送邮件遇到的常见需求汇总,包括了Java发送邮件遇到的常见需求汇总的使用技巧和注意事项,需要的朋友参考一下 基于SMTP发送一个简单的邮件 首先,需要一个认证器: 然后,书写简单的发送邮件程序: 各种收件人、抄送人、秘密抄送人,怎么办 认证器沿用,略。 其实就是设置、追加多个收件人、抄送人、秘密抄送人: 发送附件怎么办 认证器沿用,略。 发送附件demo: 还有,发送HTM
本文向大家介绍Java实现发送邮件功能时碰到的坑,包括了Java实现发送邮件功能时碰到的坑的使用技巧和注意事项,需要的朋友参考一下 之前用163邮箱发邮件时明明是成功的,但是使用中国移动自己的邮箱时,无论如何在linux服务器中都发送不成功,一开始报如下错误: 在linux中telnet mail.chinamobilesz.com 25也不通,但是直接把mail.chinamobilesz.co
本文向大家介绍java实现163邮箱发送邮件到qq邮箱成功案例,包括了java实现163邮箱发送邮件到qq邮箱成功案例的使用技巧和注意事项,需要的朋友参考一下 下载和上传附件、发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时间去弄,现在终于成功以163邮箱发送邮件到qq邮箱,以下是相关代码,具体解释可以参考代码中注释: