今天我从系统发送纯文本电子邮件时遇到了一个有趣的错误。我们格式化这样的消息:
-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
答案 0 :(得分:1)
您说邮件是完整的(包括该换行符),直到您发送邮件为止,但收到邮件时它不包含换行符?你能复制这个错误吗?
尽管SmtpClient
控件可能以某种方式丢失换行符,但其中一个中继服务器也可能在某处转换中丢失了它,或者您的电子邮件客户端无法正确呈现它。
消息在服务器之间经历了大量不同的翻译步骤,其中一些翻译......不是严格调试的。特别是,quoted-printable encoding有一些有趣的边缘情况,许多实现都不正确。
如果您的中继服务器是本地服务器,我建议您启用日志记录,以便保存从您那里收到的邮件副本。在接收端,获取消息的实际位(如果可能),而无需客户端软件进行任何类型的转换。
答案 1 :(得分:1)
我们遇到了类似的问题,但事实证明这是我们从字节流到字符串的转换。当编码混乱时,我也看到了这种情况。从发布的代码中,我看不出这是怎么发生的。
哦,对汉斯来说 - 他的意思是'完整'而不是“大头钉”