簡體   English   中英

我在使用Java Mail發送的電子郵件中丟失了一段時間

[英]I am losing periods in an email sent using 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文件夾中,並且優先選擇我們的。 1.2之前的JDK有這個bug。

從SMTP角度來看,您可以使用句點開始一行,但您必須發送兩個句點。 如果您使用的SMTP客戶端不這樣做,您可能會遇到您描述的問題。

嘗試使用IP嗅探器來查看問題的確切位置可能是值得的。 發送該電子郵件時可能至少涉及兩個單獨的SMTP事務。

我在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 alternatives命令來安裝它來代替默認實現。 (使用替代方案可確保安裝Centos補丁不會導致返回GNU實現。)

通過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 '

我盡我所能證明電子郵件是用正確的鏈接發送的。 我懷疑是修改超鏈接的是電子郵件客戶端或垃圾郵件過濾器軟件。 電子郵件垃圾郵件過濾軟件可能會這樣做嗎?

我不確定,但看起來有點像你的電子郵件被編碼了。 0x3D是十六進制字符61,它是等號('=')。

您使用哪些課程/圖書館發送電子郵件? 檢查有關編碼的設置。

你是否將Mime類型設置為“text / html”? 你應該有這樣的東西:

BodyPart bp = new MimeBodyPart();
bp.setContent(message,"text/html");

我有一個類似的問題,以編程方式發送電子郵件到雅虎帳戶。 他們會得到一個非常長的文本行,並在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客戶端,它不會做點填充(將前導點加倍)。

看來電子郵件是以quoted-printable編碼的。 切換到base64(我假設你可以用當前的java mime實現來做)將解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM