Ошибка String.Format в разделе стилей HTML-шаблона электронной почты

Я отправляю шаблон электронной почты в формате HTML, используя Bodybuilder и службу отправки почты. Я использовал эту ссылку учиться.

https://www.c-sharpcorner.com/article/send-email-using-templates-in-asp-net-core-applications/

Во всяком случае, я создал свой шаблон электронной почты, используя внешний сервис ( https://topol.io/).

Это дает мне ошибки, когда я пытаюсь использовать сгенерированный HTML-файл с командой String.FOrmat, указанной в первой ссылке. Я наконец понял, что именно этот раздел кода вызывает сбой String.Format.

Это мой код на C#, который обычно работает с другими шаблонами HTML:

using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
            {
                builder.HtmlBody = SourceReader.ReadToEnd();
            }

string messagebody = string.Format(builder.HtmlBody,
                    //Not important
                    );

ТЕПЕРЬ этот код стиля в HTML вызывает сбой String.Format. (или культурист, я не уверен точно, у кого есть проблема, это терпит неудачу в string.format).

<style type="text/css">
        #outlook a {
            padding: 0;
        }

        .ReadMsgBody {
            width: 100%;
        }

        .ExternalClass {
            width: 100%;
        }

            .ExternalClass * {
                line-height: 100%;
            }

        body {
            margin: 0;
            padding: 0;
            -webkit-text-size-adjust: 100%;
            -ms-text-size-adjust: 100%;
        }

        table, td {
            border-collapse: collapse;
            mso-table-lspace: 0pt;
            mso-table-rspace: 0pt;
        }

        img {
            border: 0;
            height: auto;
            line-height: 100%;
            outline: none;
            text-decoration: none;
            -ms-interpolation-mode: bicubic;
        }

        p {
            display: block;
            margin: 13px 0;
        }
    </style>
    <!--[if !mso]><!-->
    <style type="text/css">
        @media only screen and (max-width:480px) {
            @-ms-viewport {
                width: 320px;
            }

            @viewport {
                width: 320px;
            }
        }
    </style>
    <style type="text/css">
        @media only screen and (min-width:480px) {
            .mj-column-per-100 {
                width: 100% !important;
            }

            .mj-column-per-60 {
                width: 60% !important;
            }

            .mj-column-per-40 {
                width: 40% !important;
            }

            .mj-column-per-50 {
                width: 50% !important;
            }
        }
    </style>
    <!--[if mso]><xml>
            <o:OfficeDocumentSettings>
            <o:AllowPNG/>
            <o:PixelsPerInch>96</o:PixelsPerInch>
            </o:OfficeDocumentSettings></xml><![endif]-->
    <!--[if lte mso 11]><style type="text/css">.outlook-group-fix {    width:100% !important;  }</style>
        <![endif]-->
    <!--[if !mso]><!-->
    <link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Merriweather" rel="stylesheet" type="text/css">
    <style type="text/css">
        @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700);
        @import url(https://fonts.googleapis.com/css?family=Merriweather);
    </style>
    <!--<![endif]-->

Есть идеи? Я открыт для предложений, как разместить этот раздел CSS снаружи, если причина сбоя не очевидна.

3 ответа

Решение

Вы получаете эту ошибку, потому что фигурные скобки используются в string.Format в качестве заполнителя для параметра значения.

Один из способов решить вашу проблему - заменить фигурные скобки на двойные:

using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
            {
                builder.HtmlBody = SourceReader.ReadToEnd();
            }

string htmlBody = builder.HtmlBody.Replace("{", "{{").Replace("}","}}")
string messagebody = string.Format(htmlBody,
                    //Not important
                    );

Ты звонишь String.Format на строку, которая содержит множество определений CSS. Определения CSS включают в себя много { а также } пар. String.Format толкует { а также } пары как заполнители для подстановки, но это не то, что они представляют в вашей строке.

Зачем вам нужно использовать String.Format по этому сценарию?

Почему бы не сделать,

builder.HtmlBody = File.ReadAllText(pathToFile);

Если //Not important на самом деле важно, что вы можете избежать скобок в вашем шаблоне, согласно этому ответу. Так что брекеты, которые вы не хотите заменять, становятся '{{' а также '}}' соответственно.

По сути, запустите еще один шаг подготовки к шаблону, переключив { за {{ а также } за }} если они не представляют собой заполнитель, который вы хотели бы заменить.

Проблема заключается в { а также } части CSS. За string.Format они представляют заполнители, но код CSS не является допустимым заполнителем.

Если вам действительно нужно заменить текст string.Format и вы всегда проталкиваете свой входной файл черезstring.FormatВы можете просто заменить каждый { а также } вашего вклада с {{ а также }} соответственно, где вы на самом деле хотите { появляться в конечном результате и использовать { а также } где замена должна быть сделана. Но не уверен, как это играет вместе с Бодибилдером.

Другие вопросы по тегам