在使用SpringBoot
提供的邮件Api发送邮件时,一直提示异常。相同的逻辑,使用Go
语言又是正常的。
Java代码
package com.demo.test;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
public class EmailTest {
public static void main(String[] args) throws Exception {
JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl();
javaMailSenderImpl.setDefaultEncoding("utf-8");
javaMailSenderImpl.setHost("smtp.163.com"); // host
javaMailSenderImpl.setPort(465); // 端口
javaMailSenderImpl.setUsername("*****@163.com"); // 账户
javaMailSenderImpl.setPassword("******"); // 密码
javaMailSenderImpl.setProtocol("smtp"); // 协议
Properties properties = new Properties();
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.starttls.required", "true");
javaMailSenderImpl.setJavaMailProperties(properties);
// 创建邮件消息
MimeMessage message = javaMailSenderImpl.createMimeMessage();
// 通过Helper 设置邮件消息内容
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(new InternetAddress(MimeUtility.encodeText("Rocco") + "<*****@163.com>"));
helper.setTo("******@qq.com");
helper.setSubject("邮件测试");
helper.setText("<h3>你收到了吗?</h3>", true);
helper.addAttachment("users.sql", () -> Files.newInputStream(Paths.get("D:\\users.sql")), " application/octet-stream");
// 发送邮件
javaMailSenderImpl.send(message);
}
}
异常堆栈
Exception in thread "main" org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]. Failed messages: javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]; message exception details (1) are:
Failed message 1:
javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2198)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)
at javax.mail.Service.connect(Service.java:342)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:518)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:437)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)
at com.demo.test.EmailTest.main(EmailTest.java:46)
原因
写错了协议,465端口是需要ssl协议,对于smtp
来说,添加了ssl后就是smtps
协议了。
如果不设置这个选项,默认就是smtp
。
修改一行代码,修改协议为smtps
,邮件发送成功
javaMailSenderImpl.setProtocol("smtps"); // 协议