谈谈在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();
  }
 }

}

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

(0)

相关推荐

  • java 发送邮件的实例代码(可移植)

    以一个web项目为例,代码是可以移植的 首先要导入mail.jar包,然后创建自己的类 1:HTMLSender类 复制代码 代码如下: package com.txq.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.NoSuchProviderException; import javax.mail.Sess

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • java实现163邮箱发送邮件到qq邮箱成功案例

    下载和上传附件.发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时间去弄,现在终于成功以163邮箱发送邮件到qq邮箱,以下是相关代码,具体解释可以参考代码中注释: package test; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import java.ut

  • java发送邮件的具体实现

    首先是继承自javax.mail.Authenticator的一个具体类.getPasswordAuthentication()方法也就是构建一个PasswordAuthentication对象并返回,有点费解JAVA Mail这样的设计意图,可能javax.mail.Authenticator为我们提供了附加的保证安全的验证措施吧. 复制代码 代码如下: package com.mzule.simplemail; import javax.mail.Authenticator;import j

  • 利用Java发送邮件的实现代码

    前言 大家请注意:以下代码使用的测试邮箱为126的邮箱,实测可用,注意,个人测试时,注意发送的邮件内容,邮件内容邮箱服务器审查较严格,少有不慎就会被判定为垃圾邮件,进而就会给你返回一个错误码: 实例代码 import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentica

  • Java Mail与Apache Mail发送邮件示例

    一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例如xxx@xx.com 2.收件人姓名:大部分的邮件显示时都会显示,例如loadfate 779554589@qq.com 3.发件人:发件人的邮箱地址 4.发件人姓名: 5.主题:邮件的标题 6.内容及附件:邮件的主要内容 二.使用Java发邮件的通用步骤 一般的项目中没有单独的邮件服务器,一般情况下都是使用别人的服务器. 1.设置smtp服务器:不同的邮件服务器有不同的地址,

  • Java邮件发送程序(可以同时发给多个地址、可以带附件)

    发送邮件的主程序 import java.util.Properties; import common.util.Email_Autherticatorbean; import javax.mail.Authenticator; import javax.mail.internet.InternetAddress; import org.apache.commons.lang.StringUtils; import javax.mail.internet.MimeBodyPart; import

  • Java基于JavaMail实现向QQ邮箱发送邮件

    最近项目在做新闻爬虫,想实现这个功能:爬虫某个页面失败后,把这个页面的 url 发到邮箱.最终实现的效果图如下,后期可以加上过滤标签.失败状态码等,方便分类搜索异常. 开发人员可以根据邮件里的 url 和堆栈信息,分析爬虫失败的原因. 是不是服务器 down 了? 还是爬虫的 Dom 解析没有解析到内容? 还是正则表达式对于这个页面不适用? 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 注意开启完之后,QQ 邮箱会生成一个授权码,在代码里连接邮箱使用这个授权码而不是原

  • java编程实现邮件定时发送的方法

    本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask,

  • java实现基于SMTP发送邮件的方法

    本文实例讲述了java实现基于SMTP发送邮件的方法.分享给大家供大家参考.具体实现方法如下: import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Tra

随机推荐