2014-01-29 67 views
1

我們使用Delphi XE5架構師&隨附的Indy版本。我們有一個應用程序,可以與不同的交換夥伴發送和接收消息。其中一些消息格式化爲電子郵件,電子郵件正文中包含MIME編碼的部分。我們使用TIdMessage來處理/解碼/重建MIME部分,這非常有效。Indy TIdMessage MIME部分超出最大行長度

今天,我們開始從TIdMessage接收錯誤而被解碼MIME部分

最大的線路長度超過

我們正在努力解決,看看是否有一個人品問題?

在十六進制編輯器,當我們檢查的消息,他們有文字

 
\.br\ 

,其次是十六進制09,其顯示爲「」。之後

 
\.br\. 

這是否會顯示爲不正確的換行符到解析器?

此外,我們正在考慮內容長度是否太多?

有適當的換行符,消息範圍介於2k - 6.6k行之間。

+0

只是要指出,SO正在剝離我指定的一些反斜槓「\\」。所以看看這個正確的休息是由「\ .br \」 – DelphiCoder

+0

謝謝託尼! – DelphiCoder

+0

請將delphi **和** indy版本添加到您的問題 –

回答

0

Indy的MIME解析器從數據源中逐行讀取數據,因此它不必在解析它之前將整個電子郵件加載到內存中。 TIdMessage在內部使用TIdIOHandlerStreamMsg作爲其數據源。該特定錯誤意味着TIdIOHandler.ReadLn()方法(默認情況下會停止在(CR)LF換行符上讀取)遇到比允許長的行。
Indy的默認最大行長度是16384個字符,並且TIdMessage不會覆蓋它。通常情況下,您看不到電子郵件的個別行數很長,通常由於歷史原因而限制在70多個字符之內。如果MIME數據在達到16K限制之前沒有任何LF個字符,則會導致問題。例如,如果MIME數據使用的Content-Transfer-Encoding標頭設置爲8bitbinary,則可能會發生這種情況,因此數據不必以7位安全的方式進行編碼,這是大多數電子郵件傳輸使用的方式。

+0

太好了,謝謝您的重要和高度相關的解釋!雖然我們在一些預處理代碼中發現了這個問題,但這提出了一個很好的觀點。我們現在正在處理比我們預期的更大的數據流。這個限制是*非常*很好知道! – DelphiCoder

+0

一般來說,MIME主體數據*應該使用'quoted-printable'來編碼,或者使用'base64'來編碼二進制數據。 MIME對兩者的線長限制都大大低於Indy的默認限制。 –

相關問題