MailMessage.Body使用Encoding.UTF8丢失CrLf

时间:2011-02-24 15:52:13

标签: c# vb.net string encoding

今天我从系统发送纯文本电子邮件时遇到了一个有趣的错误。我们格式化这样的消息:

-1发生了什么事blab bla - 其他事情发生了blab blab blaa bla。

今天我们收到了一封如下邮件:

-1发生了什么事blab bla - 其他事情发生了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

我想知道在删除CrLf的UTF-8编码/解码过程中字符串转换中发生了什么?!

问题是Outlook,见下文: outlook screen shot

2 个答案:

答案 0 :(得分:1)

您说邮件是完整的(包括该换行符),直到您发送邮件为止,但收到邮件时它不包含换行符?你能复制这个错误吗?

尽管SmtpClient控件可能以某种方式丢失换行符,但其中一个中继服务器也可能在某处转换中丢失了它,或者您的电子邮件客户端无法正确呈现它。

消息在服务器之间经历了大量不同的翻译步骤,其中一些翻译......不是严格调试的。特别是,quoted-printable encoding有一些有趣的边缘情况,许多实现都不正确。

如果您的中继服务器是本地服务器,我建议您启用日志记录,以便保存从您那里收到的邮件副本。在接收端,获取消息的实际位(如果可能),而无需客户端软件进行任何类型的转换。

答案 1 :(得分:1)

我们遇到了类似的问题,但事实证明这是我们从字节流到字符串的转换。当编码混乱时,我也看到了这种情况。从发布的代码中,我看不出这是怎么发生的。

哦,对汉斯​​来说 - 他的意思是'完整'而不是“大头钉”