Ошибка 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
Вы можете просто заменить каждый {
а также }
вашего вклада с {{
а также }}
соответственно, где вы на самом деле хотите {
появляться в конечном результате и использовать {
а также }
где замена должна быть сделана. Но не уверен, как это играет вместе с Бодибилдером.