如何通过电子邮件正文需要支持的 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 邮件正文中呈现为换行符。

并且您应该确保实际文本是 HtmlEncoded。如果不这样做,用户输入可用于将标记注入邮件。

久经考验的实用功能集,特此声明开源:

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 版本,则字符串插值:它将大大提高您的作品的可读性。