案例一:
运行环境比较
1、本地用同样的代码、系统环境及发邮件的帐号是没有问题的;
2、外网其它服务器项目使用相同技术也没有问题;
问题现象
邮件模板中某链接(如:“http://www.baidu.com/...”)在邮箱发送后自动执行了,导致其它业务出错。
处理方式
1、处理前:“http://www.baidu.com/...”这部分字符串是在发邮件时整个填充到邮件模板中某个变量;
2、处理后:“http://”固定在邮件模板中,“www.baidu.com/...”这部分会变化就仍然用程序填充至模板;
处理结果
问题已解决,邮件中的链接不再自动执行。
案例二:
运行环境比较
1、本地用同样的代码、系统环境及发邮件的帐号也是没有问题的;
问题现象
发邮件报错如下:
com.sun.mail.smtp.SMTPSendFailedException: 553 Envolope sender mismatch with login user.
处理方式
根据网上搜索的资料,说是发邮件的username 和 发送地址不匹配,具体如下:
:553 Envolope sender mismatch with login user.-->553年Envolope发送方与登录用户不匹配。
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
String userName = "[email protected]";//A
return new PasswordAuthentication(userName, password);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]"));// B
答:A和B 必须统一!
所以我认真检查了下,发现我们项目的用法确实有点不一样,不过应该也是正确的呀。
我们项目中的B是这样的
new InternetAddress(StringUtil.formatAddress(“小明”, “[email protected]”); /** * 格式化 Name <[email protected]> 的地址 * @param name 名字 * @param email Email地址 * @return 格式化的地址 */ public static String formatAddress(String name, String email) { if (StringHelper.isEmpty(name)) { return email; } try {//"%1$s <%2$s>" return String.format("%1$s <%2$s>", MimeUtility.encodeText(name,"utf-8", "B"), email); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return email; }
对比下:
A: "[email protected]"
B:?utf-8?B?5ZKx572R5ZWG5Z+O?= <[email protected]>
于是我就改为下面这个样子:
new InternetAddress(StringUtil.formatAddress(“[email protected]”);//A和B一样了
传外网、重启服务器,测试下还真没问题了,只不是发件人不能显示中文名“小明”而是默认的“ceshi”.
一是这样发件人不好看;二是我觉得应该不是这个问题,因为本地也是同样的配置但没问题啊!
感觉还是服务器自身的问题,于是我又把代码改回去,重启服务器,再测试,哎~~~~~~~~
坑啊~~邮件发送成功了。也就是说其实我只需要重启下服务器就好了!!!
可是为什么呢?哎~~ 这种事很难解释,但时常会遇到!!
那么长个记性,下次遇到本地测试机没问题,却偏偏外网服务器突然就出问题了,并且之前还好好的;那么兄台,这个时候先不管三七二十一,先重启下试试吧!省得白忙活了不是~~