String.Format HTML 电子邮件模板的样式部分失败
String.Format failing on style section of HTML Email Template
我正在使用 Bodybuilder 和邮件发送服务发送 HTML 电子邮件模板。这个我用过link学习
https://www.c-sharpcorner.com/article/send-email-using-templates-in-asp-net-core-applications/
无论如何,我使用外部服务 (https://topol.io/) 创建了我的电子邮件模板。
当我尝试将生成的 HTML 文件与第一个 link 中引用的 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 部分放在外部的建议。
您正在对包含大量 CSS 定义的字符串调用 String.Format
。 CSS 定义包括许多 {
和 }
对。 String.Format
将 {
和 }
对解释为替换的占位符,但这不是它们在您的字符串中所代表的内容。
为什么在这种情况下需要使用 String.Format
?
为什么不这样做,
builder.HtmlBody = File.ReadAllText(pathToFile);
如果 //Not important
实际上很重要,您可以在模板 as per this answer 中转义大括号。因此,您不想替换的大括号分别变为 '{{'
和 '}}'
。
基本上,运行 模板上的另一个一次性准备步骤,将 {
切换为 {{
,将 }
切换为 }}
,除非它们代表您要替换的占位符。
问题是 CSS 部分的 {
和 }
。对于 string.Format
它们代表占位符,但是 CSS 代码不是有效的占位符。
如果您确实需要用 string.Format
替换一些文本并且您总是通过 string.Format
推送您的输入文件,您可以简单地替换每个 {
和 }
分别输入 {{
和 }}
,您实际上希望 {
出现在最终结果中,并在应该进行替换的地方使用 {
和 }
.但不确定它如何与 Bodybuilder 配合使用。
您收到该错误是因为 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
);
我正在使用 Bodybuilder 和邮件发送服务发送 HTML 电子邮件模板。这个我用过link学习
https://www.c-sharpcorner.com/article/send-email-using-templates-in-asp-net-core-applications/
无论如何,我使用外部服务 (https://topol.io/) 创建了我的电子邮件模板。
当我尝试将生成的 HTML 文件与第一个 link 中引用的 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 部分放在外部的建议。
您正在对包含大量 CSS 定义的字符串调用 String.Format
。 CSS 定义包括许多 {
和 }
对。 String.Format
将 {
和 }
对解释为替换的占位符,但这不是它们在您的字符串中所代表的内容。
为什么在这种情况下需要使用 String.Format
?
为什么不这样做,
builder.HtmlBody = File.ReadAllText(pathToFile);
如果 //Not important
实际上很重要,您可以在模板 as per this answer 中转义大括号。因此,您不想替换的大括号分别变为 '{{'
和 '}}'
。
基本上,运行 模板上的另一个一次性准备步骤,将 {
切换为 {{
,将 }
切换为 }}
,除非它们代表您要替换的占位符。
问题是 CSS 部分的 {
和 }
。对于 string.Format
它们代表占位符,但是 CSS 代码不是有效的占位符。
如果您确实需要用 string.Format
替换一些文本并且您总是通过 string.Format
推送您的输入文件,您可以简单地替换每个 {
和 }
分别输入 {{
和 }}
,您实际上希望 {
出现在最终结果中,并在应该进行替换的地方使用 {
和 }
.但不确定它如何与 Bodybuilder 配合使用。
您收到该错误是因为 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
);