我们传统使用的比较简单的是 STMP 25端口收发邮件
今天发现刚购买的阿里云服务器不能作为客户端通过STMP 25端口发送邮件
开始在网上有说发现是JDK1.8的原因,然后自己也把JDK1.8换到了JDK1.7 还是不行,所以这里排除了JDK的原因。
那么问题来了,是否25端口不能连接适用喃?
然后在终端输入命令行 ,可测试25端口是否可连接。
telnet smtp.163.com 25
返回成功 说明你的服务器 是没有封掉25端口的。上面的图是我自己的电脑,当然能连通。
当换到服务器测试的时候 就会出现一只连接不成功
找了很久的问题,突然在阿里云客服社区发现一个帖子,当中有客服的解释,当然我不是第一个遇到这个问题的人。
那么客服的解释一下就说明的问题:好像是将25端口封掉了 时间是2016年9月底以后新购买的服务器。
那么问题找到了 那就需要将25端口换到465端口 采用SSL协议传输邮件。
好了贴代码时间到:
下面这段代码是采用SSL协议发送邮件,可向多人单人发送邮件
package com.aaaa.util;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/**
* 邮件处理类
*
* @author jiafuwei
*
*/
public class MailUtil {
private static final String FROM_MAIL_SMTP = "smtp.exmail.qq.com";
private static final String FROM_MAIL_NAME = "aaaaaa@qq.com";
private static final String FROM_MAIL_PASS = "xxxxxxx";
/**
* 发送邮件(灵活度高,通用版)
* @param from 发件人
* @param to 收件人, 多个Email以英文逗号分隔
* @param cc 抄送, 多个Email以英文逗号分隔
* @param subject 主题
* @param content 内容
* @param fileList 附件列表
* @return
*/
public static boolean sendMail(String to, String cc, String subject, String content, String[] fileList){
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
final Properties p = System.getProperties() ;
p.setProperty("mail.smtp.host", FROM_MAIL_SMTP);
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.user", FROM_MAIL_NAME);
p.setProperty("mail.smtp.pass", FROM_MAIL_PASS);
p.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
p.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮箱发送服务器端口,这里设置为465端口
p.setProperty("mail.smtp.port", "465");
p.setProperty("mail.smtp.socketFactory.port", "465");
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session session = Session.getInstance(p, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(p.getProperty("mail.smtp.user"),p.getProperty("mail.smtp.pass"));
}
});
session.setDebug(true);
Message message = new MimeMessage(session);
//消息发送的主题
message.setSubject(subject);
//接受消息的人
message.setReplyTo(InternetAddress.parse(FROM_MAIL_NAME));
//消息的发送者
message.setFrom(new InternetAddress(p.getProperty("mail.smtp.user"),"河马评测"));
// 创建邮件的接收者地址,并设置到邮件消息中
String[] split = to.split(",");
InternetAddress []tos = new InternetAddress[split.length];
for (int i = 0; i < split.length; i++) {
tos[i]=new InternetAddress(split[i]);
}
// 设置抄送人
if (cc != null && cc.length() > 0) {
message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
}
message.setRecipients(Message.RecipientType.TO, tos);
// 消息发送的时间
message.setSentDate(new Date());
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(content, "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
message.setContent(mainPart);
// 设置附件
if (fileList != null && fileList.length > 0) {
for (int i = 0; i < fileList.length; i++) {
html = new MimeBodyPart();
FileDataSource fds = new FileDataSource(fileList[i]);
html.setDataHandler(new DataHandler(fds));
html.setFileName(MimeUtility.encodeText(fds.getName(), "UTF-8", "B"));
mainPart.addBodyPart(html);
}
}
message.setContent(mainPart);
message.saveChanges();
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
return false;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 测试Mian方法
*
* @param args
*/
public static void main(String[] args) {
String content = "<html><head><style type='text/css'>p{padding-left:50px;font-family:'楷体';font-size:20px;}table{padding-left:50px;border:0;font-family:'楷体';font-size:30px;}</style></head><body>您好:<br/><p>申请编号为"+"测试测试内容"+"的经销商对订单发起放弃签约,具体信息如下:</p><table border='1' cellpadding='10' cellspacing='0'> <tr align='center'><td width='200'>经销商</td> <td width='300'>"+"无需回复"+"</td> </tr> <tr align='center'><td>申请编号</td><td>"+"测试测试内容"+"</td></tr> <tr align='center'><td>取消时间</td><td>"+"无需回复"+"</td></tr> <tr align='center'><td>加装GPS数量</td><td>"+"测试测试内容"+"</td></tr> <tr align='center'><td>GPS IMEI号</td><td>"+"测试测试内容"+"</td></tr><tr align='center'><td>店铺地址</td><td>"+"测试测试内容"+"</td></tr> <tr align='center'><td>店铺联系人姓名</td><td>"+"测试测试内容"+"</td></tr> <tr align='center'><td>店铺联系人电话</td><td>"+"测试测试内容"+"</td></tr> </table><p>请及时联系GPS相关人员,安排上门拆装,谢谢!</p>------------------------------------------------------------------------------</body></html>";
content = "<html><head><style type='text/css'>p{padding-left:50px;font-family:'楷体';font-size:20px;}table{padding-left:50px;border:0;font-family:'楷体';font-size:30px;}</style></head><body>Hey:<br/><p>我们发现您的用户评测报告已经出来了,赶紧来看看:</p><p>用户:吕坤 手机号:17697182873 评测进度:3/9 (评测越多,报告越丰富哦):</p><p>河马小提示:点击链接查看报告</p><p>个人信用报告:<a href='https://axhub.im/pro/dbf03b6626db7bde/' target='_blank'>https://axhub.im/pro/dbf03b6626db7bde/</a></p><p>联系人信息:<a href='https://axhub.im/pro/dbf03b6626db7bde/' target='_blank'>https://axhub.im/pro/dbf03b6626db7bde/</a></p></body></html>";
System.out.println(content);
String[] fileList = new String[1];
fileList[0] = "d:/pac.txt";
sendMail("123456@qq.com", "jiafw@yqjr.com.cn", "测试测试", content,fileList);
}
}
OK当我们使用465端口SSL协议的时候,顺利的在服务器上发出邮件了。