本文共 2568 字,大约阅读时间需要 8 分钟。
最近项目上有个需求是要求对业务错误信息进行发邮件,故而开发了个发邮件的功能。这个功能很简单,网上也有很多代码。我这里贴一下我的发邮件方法:
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端口进行发邮件。
转载地址:http://qmcdi.baihongyu.com/