解决SpringBoot邮件发送异常:Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]

在使用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");				// 协议