Java邮件API生成分段IP数据包,避免EHLO到SMTP

时间:2013-03-22 09:15:55

标签: java tcp smtp ip javamail

我们目前在Tomcat 7容器内运行的JavaMail应用程序遇到了一个相当奇怪的问题。 Java Mail API以经典的方式使用,而不是太花哨(只发送电子邮件通知,没有附件等)。 在测试环境中,此代码成功将电子邮件发送到MSExchangeServer。

应用程序在Xen Hypervisor上运行,guest虚拟机是Windows 2008R2,Xen和Windows版本在测试和生产方面是相同的。我们正在运行JDK7u17(最新,昨天下载)。

使用

与EHLO / HELO阶段的SMTP服务器通信中断

javax.mail.MessagingException:将HELO命令发送到SMTP服务器失败

然后我们尝试使用blat commandline utility发送电子邮件  这很有效。

我们尝试使用putty,我们可以在telnet模式下使用putty连接到邮件服务器时重现问题,如果在RAW中连接putty,我们可以发送EHLO命令。

所以,我们在游戏中添加了一个嗅探器并录制了以下(可重现的)失败会话session data

00000000  32 32 30 20 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a 220 **** ********
00000010  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a ******** ********
00000020  2a 0d 0a                                         *..
00000000  45                                               E
00000001  48 4c 4f 20 53 52 56 2d  46 50 53 2d 30 32 0d 0a HLO SRV- FPS-02..
00000023  35 30 32 20 75 6e 69 6d  70 6c 65 6d 65 6e 74 65 502 unim plemente
00000033  64 20 28 23 35 2e 35 2e  31 29 0d 0a             d (#5.5. 1)..
00000011  48                                               H
00000012  45 4c 4f 20 53 52 56 2d  46 50 53 2d 30 32 0d 0a ELO SRV- FPS-02..
0000003F  35 30 32 20 75 6e 69 6d  70 6c 65 6d 65 6e 74 65 502 unim plemente
0000004F  64 20 28 23 35 2e 35 2e  31 29 0d 0a             d (#5.5. 1)..
00000022  51                                               Q
00000023  55 49 54 0d 0a                                   UIT..
0000005B  35 30 32 20 75 6e 69 6d  70 6c 65 6d 65 6e 74 65 502 unim plemente
0000006B  64 20 28 23 35 2e 35 2e  31 29 0d 0a             d (#5.5. 1)..

备注,EHLO命令分为两部分。

现在我们用blat录制了一个会话:

00000000  32 32 30 20 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a 220 **** ********
00000010  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a ******** ********
00000020  2a 0d 0a                                         *..
00000000  45 48 4c 4f 20 73 72 76  2d 66 70 73 2d 30 32 0d EHLO srv -fps-02.
00000010  0a                                               .
00000023  32 35 30 2d 72 65 6c 61  79 2e 6d 65 64 69 61 6e 250-rela y.median
00000033  65 74 2d 77 6f 72 6c 64  2e 64 65 0d 0a 32 35 30 et-world .de..250
00000043  2d 50 49 50 45 4c 49 4e  49 4e 47 0d 0a 32 35 30 -PIPELIN ING..250
00000053  20 38 42 49 54 4d 49 4d  45 0d 0a                 8BITMIM E..

如您所见,EHLO不在包边界上,因此服务器回复250 -...

我们尝试过另一个邮件服务器,看看邮件服务器recv函数是否可能已损坏,但另一台服务器表现出相同的行为。

我们现在意识到另一个JavaMail应用程序能够通过完全相同的邮件服务器发送邮件。乍一看,代码没有区别,但另一个应用程序使用JavaMail 1.3,而失败的应用程序使用JavaMail 1.4(取自Geronimo 1.4 -1.7.1)。

任何想法,为什么数据包分段对邮件服务器有影响?在我看来,在与TCP通信时,我不应该关心IP数据包分段。

任何帮助表示感谢,提前谢谢!

托马斯

1 个答案:

答案 0 :(得分:1)

我们能够解决问题,主要原因是geronimo libs。应该更好地检查maven中心: - (

我们现在已切换到javax.mail.mail:1.4,这解决了这个问题。

记录:

通讯FAILED使用:

        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-javamail_1.4_spec</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.javamail</groupId>
            <artifactId>geronimo-javamail_1.4_provider</artifactId>
            <version>1.8.3</version>
        </dependency>

沟通工作使用:

<dependencies>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>

感谢您的时间,也许这将有助于其他人。至少我可以告诉自己我的时间投入很多: - )

致以最诚挚的问候,

托马斯