我在使用Java Mail发送的电子邮件中迷失了时间
我正在从Java服务器发送新闻通讯,并且其中一个超链接丢失了一段时间,因此变得毫无用处:
Please print your <a href=3D"http://xxxxxxx.xxx.xx.edu= au//newsletter2/3/InnovExpoInviteVIP.pdf"> VIP invitation</a> for future re= ference and check the Innovation Expo website <a href=3D"http://xxxxxxx.xx= xx.xx.edu.au/2008/"> xxxxxxx.xxxx.xx.edu.au</a> for updates.
在上面的示例中,在第一个超链接上edu和au之间的时间段丢失了。
我们已经确定邮件正文是换行符,并且换行符会在句点处分割行,并且在SMTP电子邮件中以句点开头的行是非法的:
http://tools.ietf.org/html/rfc2821#section-4.5.2
我的问题是,我应该使用哪些设置来确保包装是周期友好的和/或者首先不进行包装?
更新:经过大量的测试和调试,结果表明我们的代码很好,客户端的Linux服务器附带了非常旧的Java版本,而旧的Mail类仍位于lib文件夹之一中,并且优先于我们的文件夹获取。
JDK 1.2之前的版本存在此错误。
解决方案
从SMTP的角度来看,我们可以以句点开始行,但必须发送两个句点。如果我们使用的SMTP客户端不执行此操作,则可能会遇到我们描述的问题。
可能值得尝试使用IP嗅探器来查看问题的真正出处。发送该电子邮件可能至少涉及两个单独的SMTP事务。
我不确定,但是看起来好像电子邮件已被编码。 0x3D是十六进制字符61,它是等号字符('=')。
我们使用什么类/库发送电子邮件?检查有关编码的设置。
我们是否将Mime类型设置为" text / html"?我们应该具有以下内容:
BodyPart bp = new MimeBodyPart(); bp.setContent(message,"text/html");
确保所有内容均受quoted-printable的约束,对RFC2045友好。
在这样的方法中使用MimeUtility类。
private String mimeEncode (String input) { ByteArrayOutputStream bOut = new ByteArrayOutputStream(); OutputStream out; try { out = MimeUtility.encode( bOut, "quoted-printable" ); out.write( input.getBytes( ) ); out.flush( ); out.close( ); bOut.close( ); } catch (MessagingException e) { log.error( "Encoding error occured:",e ); return input; } catch (IOException e) { log.error( "Encoding error occured:",e ); return input; } return bOut.toString( ); }
我遇到类似的问题,但使用的是ASP.NET 2.0。对于每个应用程序日志,电子邮件中的链接都是正确的" http://www.3rdmilclassrooms.com/",但是随后客户端接收到该电子邮件的链接缺少" http://www3rdmilclassrooms.com"
我已尽力证明电子邮件已通过正确的链接发送。我怀疑是电子邮件客户端或者垃圾邮件过滤器软件正在修改超链接。电子邮件垃圾邮件过滤软件有可能做到这一点吗?
我有一个类似的问题,以编程方式将电子邮件发送到yahoo帐户。他们会得到一行很长的文本,并在HTML电子邮件中添加自己的换行符,以为那不会造成问题,但当然会。
诀窍是不要尝试发送这么长的行。由于HTML电子邮件不关心换行符,因此我们应该每隔几行添加一个块,或者仅在有问题的行之前添加一个,以确保URL在这样的时间段内不会被拆分。
我必须将ASP VB从
var html; html = "Blah Blah Blah Blah "; html = html & " More Text Here....";
到
var html; html = "Blah Blah Blah Blah " & VbCrLf; html = html & " More Text Here....";
这就是清理输出端所需的全部工作。
正如Greg所指出的,问题出在SMTP客户端上,该客户端不进行点填充(将前导点加倍)。
电子邮件似乎已被编码为带引号的。切换到base64(我想我们可以使用当前的Java mime实现来实现)将解决此问题。