本地开发用的是163邮箱的25端口,可以正常发送的
在阿里云服务器上的就会出现javax.mail.MessagingException: Could not connect to SMTP host的错误,基本可以定位这是端口的问题
然后在163邮箱帮助那里查到,邮箱的SMTP端口有分两种的:SSL协议和非SSL协议
阿里云服务器为了安全起见,一般是禁用非SSL协议的25端口,
所以改用SSL协议的端口可以发送,博主是改为994端口的,
改为SSL协议端口后,本地测试依然是出现上面那个错误的,因为端口是SSL协议的端口,但是邮件传输的设置没有按照SSL协议进行传输,所以还是发送不了的
所以要在邮件传输配置上加上
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
贴上代码直观
package com.dne.sinosig.core.util;
/**
* 发送邮件的基本信息
* */
import java.util.Properties;
public class MailSenderInfo {
// 发送邮件的服务器的IP和端口
private String mailServerHost;
private String mailServerPort = "994";
// 邮件发送者的地址
private String fromAddress;
// 邮件接收者的地址
private String toAddress;
// 登陆邮件发送服务器的用户名和密码
private String userName;
private String password;
// 是否需要身份验证
private boolean validate = false;
// 邮件主题
private String subject;
// 邮件的文本内容
private String content;
// 邮件附件的文件名
private String[] attachFileNames;
/** *//**
* 获得邮件会话属性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");//是否需要开启邮箱验证
p.put("mail.smtp.timeout",10000);//时间延迟
p.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");//设置为SSL协议
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String textContent) {
this.content = textContent;
}
}
这样就大功告成了
最后如果换回非SSL协议的端口,则是需要去除上面的这个SSL协议的配置的
不然会出现javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection