如何通过电子邮件正文需要支持的 SMTP 保留换行 HTML
How to preserve newline wrapping via SMTP where the email body needs to support HTML
所以我正在构建一个自动发送电子邮件的脚本,一旦他们记录问题,就会向员工发送收据,电子邮件需要允许 HTML
。
但是,当我从数据库中提取描述并将其显示在 .aspx page
的前端 (asp:textbox
) 时,它会显示换行符,格式正确但是当我发送通过 SMTP 对收件人的描述换行符(换行符)不要将文本换行。
例如:
示例字符串:"Bob is a human,\n and he likes basketball"
在 asp:textbox
控件中,它可以正确呈现,但通过电子邮件发送时却不能。
这有什么问题?我是否需要将 \n
替换为 HTML
中断,或者您可以保留它们吗?
脚本的基本概念如下:
SmtpClient client = new SmtpClient();
client.Port = 587;
client.Host = "smtp.outlook.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(serverEmail, serverEmailAuthToken);
MailMessage mm = new MailMessage(serverEmail, recipient, "Tasket Report Number: "
+ tasketTitle + " has been received.",
"Tasket Report Number: " + tasketTitle + "<br/>"
+ "Problem Domain: " + domain + "<br/>"
+ "Report Type: " + type + "<br/>"
+ "Report Area: " + area + "<br/>"
+ "Description: " + description
+ "<br/>");
mm.IsBodyHtml = true;
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
client.Send(mm);
\n
是 HTML 渲染器的空白。
您需要将换行符转换为 <br />
标记或段落,以便在 HTML 邮件正文中呈现为换行符。
并且您应该确保实际文本是 HtmlEncode
d。如果不这样做,用户输入可用于将标记注入邮件。
久经考验的实用功能集,特此声明开源:
public string enc(string s)
{
return System.Web.HttpUtility.HtmlEncode(s);
}
/// <summary>
/// HTML-encodes a string after replacing its newlines with br tags
/// </summary>
public string enc_br(string s)
{
if (String.IsNullOrWhiteSpace(s))
return s;
var lines = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
if (lines.Length == 1)
return enc(lines[0]);
else
{
for (var i = 0; i < lines.Length; ++i)
{
lines[i] = enc(lines[i]);
}
return String.Join("<br />", lines);
}
}
示例用法:
... + "Problem Domain: " + enc_br(domain) + "<br/>"
考虑使用 String.Format
,或者,如果您使用的是足够新的 .NET 版本,则字符串插值:它将大大提高您的作品的可读性。
所以我正在构建一个自动发送电子邮件的脚本,一旦他们记录问题,就会向员工发送收据,电子邮件需要允许 HTML
。
但是,当我从数据库中提取描述并将其显示在 .aspx page
的前端 (asp:textbox
) 时,它会显示换行符,格式正确但是当我发送通过 SMTP 对收件人的描述换行符(换行符)不要将文本换行。
例如:
示例字符串:"Bob is a human,\n and he likes basketball"
在 asp:textbox
控件中,它可以正确呈现,但通过电子邮件发送时却不能。
这有什么问题?我是否需要将 \n
替换为 HTML
中断,或者您可以保留它们吗?
脚本的基本概念如下:
SmtpClient client = new SmtpClient();
client.Port = 587;
client.Host = "smtp.outlook.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(serverEmail, serverEmailAuthToken);
MailMessage mm = new MailMessage(serverEmail, recipient, "Tasket Report Number: "
+ tasketTitle + " has been received.",
"Tasket Report Number: " + tasketTitle + "<br/>"
+ "Problem Domain: " + domain + "<br/>"
+ "Report Type: " + type + "<br/>"
+ "Report Area: " + area + "<br/>"
+ "Description: " + description
+ "<br/>");
mm.IsBodyHtml = true;
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
client.Send(mm);
\n
是 HTML 渲染器的空白。
您需要将换行符转换为 <br />
标记或段落,以便在 HTML 邮件正文中呈现为换行符。
并且您应该确保实际文本是 HtmlEncode
d。如果不这样做,用户输入可用于将标记注入邮件。
久经考验的实用功能集,特此声明开源:
public string enc(string s)
{
return System.Web.HttpUtility.HtmlEncode(s);
}
/// <summary>
/// HTML-encodes a string after replacing its newlines with br tags
/// </summary>
public string enc_br(string s)
{
if (String.IsNullOrWhiteSpace(s))
return s;
var lines = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
if (lines.Length == 1)
return enc(lines[0]);
else
{
for (var i = 0; i < lines.Length; ++i)
{
lines[i] = enc(lines[i]);
}
return String.Join("<br />", lines);
}
}
示例用法:
... + "Problem Domain: " + enc_br(domain) + "<br/>"
考虑使用 String.Format
,或者,如果您使用的是足够新的 .NET 版本,则字符串插值:它将大大提高您的作品的可读性。