今天在Springboot项目中遇到一个问题,JAVA后台代码在windows下发送邮件正常,打包部署到linux服务器上发送邮件一直失败,咨询了下阿里的客服,原来是发送邮件的25端口被禁用,所以邮件发送失败。
解决办法:
邮件发送部署在云服务器上时,不要使用默认的端口(25),一般为了安全云服务器默认是禁掉的,但是可以配置解禁,不过不推荐这样做。
改变发送邮件Port,本文以465端口号为例,大家可以根据实际情况,配置使用。
使用465端口或者是其他端口,需要去阿里后台配置规则添加开发相应端口
1.配置springboot配置文件
spring:
mail:
host: smtp.163.com //根据邮箱类别设置
username: 邮箱
password: 授权码,不是邮箱密码
properties:
mail:
smtp:
auth: true
timeout: 25000
ssl.enable: true
socketFactory.class: javax.net.ssl.SSLSocketFactory
starttls.enable: true
socketFactory.port: 465
port: 465
2.JAVA后台
@Autowired
private JavaMailSender sender;
@Value("${spring.mail.username}")
private String from;
@Value("${spring.mail.password}")
private String psw;
@Value("${spring.mail.host}")
private String host;
/**
* 使用加密的方式,利用465端口进行传输邮件,开启ssl
* user对象为接收邮件的一些信息
*/
public boolean sendMail(SysUser user) {
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// 设置邮件会话参数
Properties props = new Properties();
// 邮箱的发送服务器地址
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
// 邮箱发送服务器端口,这里设置为465端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
final String username = from;//这里就是配置文件中定义的用户名
final String password = psw;
// 获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
Session session = Session.getDefaultInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
// 通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
// 设置发件人
msg.setFrom(new InternetAddress(from));
// 设置收件人,to为收件人,cc为抄送,bcc为密送
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(user.getUsername(), false));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(user.getUsername(), false));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(user.getUsername(), false));
msg.setSubject("xx邮件");
// 设置邮件消息
msg.setText("恭喜你,此邮件。。。。。。。。不需要回复");//这里也可以定义跳转链接
// 设置发送的日期
msg.setSentDate(new Date());
// 调用Transport的send方法去发送邮件
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
3.本文使用的服务器为阿里云服务器,一般自己使用的端口号需要在网络安全配置中去开启使用的端口号,并把它加入到防火墙中,经过以上步骤,基本上就可以解决本地可以发送而linux服务器无法发送邮件的问题了。
4.如果想抄送多个收件人可不仅是将抄送人添加到集合中,然后以for循环,这样是行不通的,可以采用下面这样的方法,这样在邮件发送时,即可将邮件同步抄送到email[ ].
InternetAddress[] addressesCc = null;
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("111@qq.com", false));
String[] email = { "222@qq.com", "333@qq.com", "444@qq.com", "555@qq.com","666@qq.com"};
int count = email.length;
addressesCc = new InternetAddress[count];
for (int i = 0; i < email.length; i++) {
addressesCc[i] = new InternetAddress(email[i]);//将邮箱放入地址数组中
}
msg.setRecipients(Message.RecipientType.CC, addressesCc);
5.如果想将后台查询的数据以表格或其它Html样式发送到邮箱该如何处理呢?其实也很简单,直接将content内容定义为html样式输出即可
// 通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
// 设置发件人
msg.setFrom(new InternetAddress(from));
// 设置收件人,to为收件人,cc为抄送,bcc为密送
InternetAddress[] addressesCc = null;
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("xxx@qq.comk", false));
String[] email = { "xxx@qq.com", "xxx@qq.com", "xxx@qq.com"};
int count = email.length;
addressesCc = new InternetAddress[count];
for (int i = 0; i < email.length; i++) {
addressesCc[i] = new InternetAddress(email[i]);
}
msg.setRecipients(Message.RecipientType.CC, addressesCc);
msg.setSubject("xxxx系统");
// 设置html内容
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置邮件消息
StringBuilder content = new StringBuilder(
"<html><head></head><body><h2>官方通知邮件,请勿回复此邮件!</h2>\"\r\n"
+ "<h3>尊敬的用户您好,xxxxxx,请及时登录系统处理。 如有其它问题请及时沟通反馈</h3><br>\"\r\n");
content.append(
"<table border=\"5\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
content.append(
"<tr style=\\\"background-color: #428BCA; color:#ffffff\\\"><th>文件编号</th><th>一级菜单</th><th>二级菜单</th><th>三级菜单</th><th>四级菜单</th><th>五级菜单</th><th>文件名</th><th>过期时间</th></tr>");
for (WisdomFile data : list) {
content.append("<tr>");
content.append("<td>" + data.getFileNo() + "</td>"); // 第一列
content.append("<td>" + data.getPrimaryMenu() + "</td>"); // 第二列
content.append("<td>" + data.getSecondaryMenu() + "</td>"); // 第三列
content.append("<td>" + data.getThreeLevel() + "</td>");
content.append("<td>" + data.getFourLevel() + "</td>");
content.append("<td>" + data.getFiveLevel() + "</td>");
content.append("<td>" + data.getFileName() + "</td>");
content.append("<td>" + data.getExpirationDate() + "</td>");
content.append("</tr>");
}
content.append("</table>");
content.append("<h3>描述xxxxxxxxx</h3>");
content.append("</body></html>");
// 设置发送的日期
msg.setSentDate(new Date());
html.setContent(content.toString(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
msg.setContent(mainPart);
msg.saveChanges();
// 调用Transport的send方法去发送邮件
Transport.send(msg);