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

网友投稿 234 2023-07-08


谈谈在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(sessmwserXVGfrion);//由邮件会话新建一个消息对象

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_SMmwserXVGfrTP_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();

}

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实力弹弹球实现代码
下一篇:JDBC使用游标实现分页查询的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~