我正在从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版本和旧版本邮件类仍然在其中一个lib文件夹中,并且优先于我们的文件夹。 1.2之前的JDK有这个错误。
答案 0 :(得分:5)
从SMTP的角度来看,您可以使用句点开始一行,但您必须发送两个句点。如果您使用的SMTP客户端不这样做,您可能会遇到您描述的问题。
尝试IP嗅探器可能值得查看问题的确切位置。发送该电子邮件时可能至少涉及两个单独的SMTP交易。
答案 1 :(得分:3)
我在HTML电子邮件中遇到了类似的问题:神秘的缺失期,以及一个奇怪的截断消息。 JavaMail使用quoted-printable编码发送HTML电子邮件,该编码在任何点(即不仅在空白处)包装行,以便没有行超过76个字符。 (它在行尾使用'='作为软回车,因此接收器可以重新组合线。)这很容易导致以句点开头的行,应该加倍。 (这称为“点填充”)如果不是,则接收SMTP服务器将占用该时段,或者更糟糕的是,如果句点是一行中的唯一字符,则SMTP服务器将其解释为消息。
我将其跟踪到GNU JavaMail 1.1.2实现(又名classpathx javamail)。此实现没有更新版本,并且未更新4或5年。查看源代码,它部分实现了点填充 - 它试图在一行上处理句点,但是有一个错误可以防止这种情况发生。
不幸的是,这是我们平台(Centos 5)上的默认实现,所以我想它也是RedHat的默认实现。
Centos上的修复是安装Sun(或者我现在应该说Oracle的?)JavaMail实现(我使用1.4.4),并使用Centos alternative 命令安装它来代替默认实现。 (使用 alternative 确保安装Centos补丁不会导致返回GNU实现。)
答案 2 :(得分:1)
借助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( );
}
答案 3 :(得分:1)
我遇到了类似的问题,但使用的是ASP.NET 2.0。根据应用程序日志,电子邮件中的链接是正确的“http://www.3rdmilclassrooms.com/”,然而客户端收到的电子邮件链接缺少句号“http://www3rdmilclassrooms.com”
我尽我所能证明电子邮件是使用正确的链接发送的。我怀疑是修改超链接的是电子邮件客户端或垃圾邮件过滤器软件。电子邮件垃圾邮件过滤软件可能会这样做吗?
答案 4 :(得分:0)
我不确定,但看起来有点像您的电子邮件正在编码。 0x3D是十六进制字符61,它是等号('=')。
您使用哪些班级/图书馆发送电子邮件?检查有关编码的设置。
答案 5 :(得分:0)
您是否将Mime类型设置为“text / html”?你应该有这样的东西:
BodyPart bp = new MimeBodyPart();
bp.setContent(message,"text/html");
答案 6 :(得分:0)
我有一个类似的问题,以编程方式将电子邮件发送到雅虎帐户。他们会得到一个非常长的文本行,并在HTML电子邮件中添加他们自己的换行符,认为这不会导致问题,但当然可以。
诀窍不是试图发送这么长的一条线。由于HTML电子邮件不关心换行符,因此您应该每隔几个块添加自己的邮件,或者在违规行之前添加自己的邮件,以确保您的URL不会在这样的时间段内被拆分。
我必须从
更改我的ASP VBvar html;
html = "Blah Blah Blah Blah ";
html = html & " More Text Here....";
到
var html;
html = "Blah Blah Blah Blah " & VbCrLf;
html = html & " More Text Here....";
这就是清理输出所需的全部内容。
答案 7 :(得分:0)
正如格雷格指出的那样,问题在于你的SMTP客户端,它不会做点填充(将前导点加倍)。
电子邮件似乎是以quoted-printable编码的。切换到base64(我假设您可以使用当前的java mime实现来完成)将解决问题。