我们使用Spring JavaMailSenderImpl 发送邮件。以下是配置
host=XXXX.XXXX.XX
port=25
mail.username=xxxxxxxx
mail.password=xxxxxxx
mail.transport.protocol=smtp
mail.smtp.auth=true
mail.smtp.starttls.enable=true
属性文件: -
Exception in thread "taskExecutor-2" org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: XXXX.XXXX.XX, port: 25;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: XXXX.XXXX.XX, port: 25;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?; message exception details (1) are:
Failed message 1:
javax.mail.MessagingException: Could not connect to SMTP host: XXXX.XXXX.XX, port: 25;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
at javax.mail.Service.connect(Service.java:295)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336)
at com.XXXX.Mailer$1.run(Mailer.java:52)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:671)
at sun.security.ssl.InputRecord.read(InputRecord.java:504)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
... 9 more
控制台日志
table1
我们确信这与SSL证书无关,因为在同一服务器中部署了其他Web应用程序,它们使用相同的配置完美地发送电子邮件。这可能是什么问题?
答案 0 :(得分:10)
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.ssl.enable">true</prop>
在TCP连接(端口465)之后,您希望mail.smtp.ssl.enable
直接用于隐式SSL;对于使用STARTTLS命令(端口25)的显式SSL,您需要mail.smtp.starttls.enable
。但是使用当前属性,您将两者都设置为true。
这意味着它将执行TCP连接到端口25并尝试在那里进行SSL握手。这将失败,因为服务器正在从SMTP对话框发送纯文本问候语而不是预期的SSL握手。因此你得到了
无法识别的SSL消息,明文连接?
要修复它,请确保您使用隐式或显式SSL,但不能同时使用两者,具体取决于端口,即端口25 mail.smtp.ssl.enable
应为false。
答案 1 :(得分:0)
我尝试通过多种方法解决此问题,但最终发现此问题自己解决了。
在创建代码之前,请确保您能够从Terminal或任何其他邮件客户端发送电子邮件。测试完邮件后,可以正常工作,然后使用以下属性和代码。我已将代码部署在电子邮件服务器中,因此不需要SSL或TLS。我正在使用端口25进行中继。
必需属性-
mail.smtp.host=<myhostname.com>
mail.smtp.port=25
mail.smtp.auth=true
mail.transport.protocol=smtp
smtpd_recipient_restrictions=permit_sasl_authenticated
user=<sender_username/email>
password=<password>
mail.smtp.username=<sender_username/email>
mail.smtp.password=<password>
必需的代码-
public String sendEmail(String email){
//Compose the message
try {
FileReader reader=new FileReader("smtp.properties");
//Get the session object
Properties props = new Properties();
props.load(reader);
System.out.println(" Props :: " + props.toString());
String to = email;
String host=props.getProperty("mail.smtp.host");
final String user=props.getProperty("user");
final String password=props.getProperty("password");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.setRecipients(
Message.RecipientType.TO,
InternetAddress.parse(to)
);
message.setSubject("Testing - SMTP");
message.setText("Dear User, \n\n Hello !");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return "SUCCESS";
}
必需的导入-
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
答案 2 :(得分:0)
问题出现在 javax.mail 1.4.0,升级到 1.4.7 解决了我的问题