2011-02-24 24 views
0

從我們的系統發送純文本電子郵件時,今天我有一個有趣的錯誤。我們這樣格式化消息:MailMessage.Body使用Encoding丟失CrLf.UTF8

-1st發生了一些事情blab bla。
-2nd別的事發生了blab blab blaa bla。

今天,我們有一個看起來像這樣的電子郵件:

- 一次事情發生泄密喇嘛。
-2nd發生其他事情blab blab blaa bla $ 1000.00 -3rd發生了一些事情。

因此,上面我們看到,我們丟失了CrLf,但僅限於沒有周期並以0結尾的消息。我瀏覽了代碼,發現CrLf在我們發送電子郵件之前一直處於進入狀態。我找到下面的代碼了,我猜測它適用於C#和:

:建立對身體的字符串時,我們使用Environment.NewLine

構建字符串:

If Not errorList Is Nothing Then 
    If errorList.Count > 0 Then 
     strBldrBody.Append(EMailHelper.CrLf) 
     strBldrBody.Append(EMailHelper.CrLf) 
     strBldrBody.Append("Response Error List:") 
     For Each itm As String In errorList 
     strBldrBody.Append(EMailHelper.CrLf) 
     strBldrBody.Append(DataHelper.DASH) 
     strBldrBody.Append(itm) 
     Next 
    End If 
End If 

電子郵件編碼設置:

Try 
    If Not String.IsNullOrEmpty(recipient) Then 
     Using mailMsg As MailMessage = New MailMessage() 

      mailMsg.From = New MailAddress(_configHelper.EmailFrom) 
      mailMsg.Subject = subject 
      mailMsg.Body = body 
      mailMsg.BodyEncoding = Encoding.UTF8 

      EMailHelper.SetToAddress(recipient, mailMsg) 

      Dim smtpClient As SmtpClient = New SmtpClient(_configHelper.EmailRelayServer) 

      smtpClient.Send(mailMsg) 
     End Using 
    End If 

Catch ex As System.Exception 
    'logs error 
End Try 

我想知道在字符串翻譯的utf-8編碼/解碼期間發生了什麼刪除CrLf ?!

的問題展望,見下圖: outlook screen shot

+0

「正在粘住」並不意味着什麼。代碼片段不可能重現問題。 – 2011-02-24 16:47:08

+0

@Hans:我認爲他的意思是「完好無損,直到......」 – 2011-02-24 16:53:52

回答

1

我們剛剛遇到類似這樣的問題,但事實證明這是我們從字節流轉換爲字符串的轉換。當編碼混淆時,我也看到了這種情況。從發佈的代碼,我不明白這可能發生。

呵呵,對漢斯來說 - 他的意思是'完好無損'而不是'大頭貼'

+0

你是對的,這是不可能的。 Outlook正在刪除「額外的換行符」。 – 2011-02-24 17:23:30

1

你說的消息是完整(包括新行),直到您發送消息的時間點,但收到消息時,它沒有包含換行符?你能重複這個錯誤嗎?

雖然SmtpClient控件有可能以某種方式丟失了換行符,但也有可能其中一箇中繼服務器在某處翻譯失敗,或者您的電子郵件客戶端無法正確顯示它。

消息在服務器之間經歷了令人難以置信的不同翻譯步驟,其中一些翻譯比嚴格調試要少。特別是,quoted-printable encoding有一些有趣的邊緣情況,許多實現不正確。

如果您的中繼服務器是本地的,我會建議開啓日誌記錄功能,以便在收到您的消息時保存它的副本。並且在接收端,獲取消息的實際位(如果可能的話),而不需要客戶端軟件的任何翻譯。