我在使用Java Mail发送的电子邮件中丢失了一段时间

时间:2008-09-23 08:06:33

标签: java smtp email

我正在从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有这个错误。

8 个答案:

答案 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 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....";

这就是清理输出所需的全部内容。

答案 7 :(得分:0)

正如格雷格指出的那样,问题在于你的SMTP客户端,它不会做点填充(将前导点加倍)。

电子邮件似乎是以quoted-printable编码的。切换到base64(我假设您可以使用当前的java mime实现来完成)将解决问题。

相关问题