MailMessage.Body теряет CrLf с Encoding.UTF8 - PullRequest
0 голосов
/ 24 февраля 2011

У меня сегодня была интересная ошибка при отправке текстовых электронных писем из нашей системы. Мы форматируем сообщения так:

-1-е, что-то случилось, бла бла.
-2 и что-то еще случилось, блаб бла бла бла.

Сегодня у нас было письмо, которое выглядело так:

-1-е, что-то случилось, бла бла.
2-е что-то еще произошло блаб-бла-бла-бла $ 1000,00 -3-е Что-то случилось.

Итак, выше мы видим, что мы потеряли 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, см. Ниже: Снимок экрана перспективы

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

У нас просто была проблема, похожая на эту, но это оказалось преобразованием, которое мы сделали из потока байтов в строку. Я также видел, как это происходило при перепутывании кодировок. Судя по опубликованному коду, я не понимаю, как это могло произойти.

О, и Гансу - он имел в виду «неповрежденный», а не «в такт»

1 голос
/ 24 февраля 2011

Вы говорите, что сообщение не повреждено (включая новую строку) до того момента, когда вы отправили сообщение, но когда сообщение было получено, оно не содержало новую строку?Можете ли вы продублировать эту ошибку?

В то время как возможно, что элемент управления SmtpClient каким-то образом потерял символ новой строки, также возможно, что один из серверов ретрансляции где-то потерял его при переводе, или что ваш почтовый клиент не отображалэто правильно.

Сообщения проходят невероятное количество разных этапов перевода между серверами, и некоторые из этих переводов ... менее чем строго отлажены.В частности, кодируемая для печати кодировка имеет некоторые интересные крайние случаи, когда множество реализаций не получают корректность.

Если ваш сервер ретрансляции является локальным, я бы предложил включить ведение журнала, чтобыон сохранит копию сообщения, полученного от вас.А на принимающей стороне получите действительные биты сообщения (если это возможно) без какого-либо перевода клиентским программным обеспечением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...