最近项目上有个需求是要求对业务错误信息进行发邮件,故而开发了个发邮件的功能。这个功能很简单,网上也有很多代码。我这里贴一下我的发邮件方法:
public static void sendMailByAliyunNew(String subject, String content){
try {
String receivers = "收件人邮箱";// 收件人,多个用逗号隔开
//设置SSL连接、邮件环境
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = System.getProperties();
props.setProperty("mail.transport.protocol", "SMTP");
props.setProperty("mail.smtp.host", "smtp.mxhichina.com");//阿里云邮箱固定的host
props.setProperty("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.socketFactory", sf);
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");//阿里云邮箱25服务端口默认禁用,所以使用ssl的465端口
props.setProperty("mail.smtp.socketFactory.port", "465");
//建立邮件会话
Session session = Session.getDefaultInstance(props, new Authenticator() {
//身份认证
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("发件人邮箱", "密码");//需要是阿里云邮箱
}
});
session.setDebug(true);
//建立邮件对象
MimeMessage message = new MimeMessage(session);
//设置邮件的发件人、收件人、主题
//附带发件人名字
message.setFrom(new InternetAddress("发件人邮箱"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receivers));
message.setSubject(subject,"UTF-8");
message.setContent(content, "text/html;charset=UTF-8");
message.setSentDate(new Date());
Transport.send(message);
System.out.println("邮件发送成功");
} catch (Exception e) {
e.printStackTrace();
}
}
先说一下我遇到的问题,我用的阿里云企业邮箱服务进行发邮件的,以上方法,在本地用main方法执行完全没问题,收到的邮件也没有乱码,但是部署到tomcat之后,收到的邮件是这样的,如图所示,没有主题,内容是看似乱码的东西(实际是base64编码后的)。
遇到此问题,排查了一天多,一直纠结在编码格式不对,转码问题上,也一直在尝试修改发邮件的方法,但是都不起效。后来想了下,为什么本地可以,tomcat不可以,一定是环境问题,跟环境有关的也就是jar包和字符集了,后来修改了tomcat字符集依旧不管事,最后排查lib的时候,发现工程的lib里面有geronimo相关的包,其中有个geronimo-javamail_1.4_spec-1.2.jar,这个包跟
javax.mail的jar包冲突,而且这个是geronimo发邮件的一个包,没有啥用,故而删掉这个jar包,然后重启tomcat,邮件发送正常。这也就解释了为啥本地可以但是tomcat不行了,本地执行的时候直接调用javax.mail包的内容,没有任何问题; 但是部署到tomcat后,jvm执行的时候,因为jar包冲突,使用了geronimo-javamail_1.4_spec-1.2.jar的内容,导致转码有问题,导致邮件发送内容有问题。
在此希望对大家有所帮助,在此需要注意,阿里云邮箱服务器禁用25端口,所以不能使用25端口进行发邮件,只能使用加密的465端口进行发邮件。