案例一:
运行环境比较
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 = "ceshi@sina.com";//A
return new PasswordAuthentication(userName, password);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("wowo3129@sina.com"));// B
答:A和B 必须统一!
所以我认真检查了下,发现我们项目的用法确实有点不一样,不过应该也是正确的呀。
我们项目中的B是这样的
new InternetAddress(StringUtil.formatAddress(“小明”, “ceshi@sina.com”);
/**
* 格式化 Name <email@address.com> 的地址
* @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: "ceshi@sina.com"
B:?utf-8?B?5ZKx572R5ZWG5Z+O?= <ceshi@sina.com>
于是我就改为下面这个样子:
new InternetAddress(StringUtil.formatAddress(“ceshi@sina.com”);//A和B一样了
传外网、重启服务器,测试下还真没问题了,只不是发件人不能显示中文名“小明”而是默认的“ceshi”.
一是这样发件人不好看;二是我觉得应该不是这个问题,因为本地也是同样的配置但没问题啊!
感觉还是服务器自身的问题,于是我又把代码改回去,重启服务器,再测试,哎~~~~~~~~
坑啊~~邮件发送成功了。也就是说其实我只需要重启下服务器就好了!!!
可是为什么呢?哎~~ 这种事很难解释,但时常会遇到!!
那么长个记性,下次遇到本地测试机没问题,却偏偏外网服务器突然就出问题了,并且之前还好好的;那么兄台,这个时候先不管三七二十一,先重启下试试吧!省得白忙活了不是~~
转载于:https://blog.51cto.com/ycgit/1656122