【问题标题】:Do SendGrid automatically convert HTML messages to plain text?SendGrid 会自动将 HTML 消息转换为纯文本吗?
【发布时间】:2016-06-30 18:01:44
【问题描述】:

我正在向注册的用户发送确认电子邮件,并希望确保同时存在 HTML 和纯文本版本,以防用户的电子邮件客户端不显示 HTML,但我有点困惑如何去做这个。这是我的一些代码:

private async Task configSendGridasync(IdentityMessage message)
    {
        var myMessage = new SendGridMessage();
        myMessage.AddTo(message.Destination);
        myMessage.From = new System.Net.Mail.MailAddress(
                            "hello@example.com", "Example");
        myMessage.Subject = message.Subject;
        myMessage.Text = message.Body;
        myMessage.Html = message.Body;

        var credentials = new NetworkCredential(
                   ConfigurationManager.AppSettings["MailAccount"],
                   ConfigurationManager.AppSettings["MailPassword"]
                   );

        // Create a Web transport for sending email.
        var transportWeb = new Web(credentials);

        // Send the email.
        if (transportWeb != null)
        {
            await transportWeb.DeliverAsync(myMessage);
        }
        else
        {
            Trace.TraceError("Failed to create Web transport.");
            await Task.FromResult(0);
        }
    }



private async Task<string> SendEmailConfirmationTokenAsync(string userID, string subject)
    {
        string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
        var callbackUrl = Url.Action("ConfirmEmail", "Account",
           new { userId = userID, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(userID, subject, "<p>Example confirmation message</p>");


        return callbackUrl;
    }

我的代码可以运行并发送 HTML 电子邮件,但是对于拥有不显示 HTML 的电子邮件客户端的用户会发生什么? myMessage.Text = message.Body; 是否会自动获取 "&lt;p&gt;Example confirmation message&lt;/p&gt;" 并将其转换为纯文本?如果没有,如何添加用于文本版本的消息?

编辑:我将使用的 HTML 格式通常类似于:

<p style="color:#333;">First paragraph</p>
<p style="color:#333;">Second paragraph <a href="https://www.somelink.com">Click here</a></p>
<p style="color:#333;"> Third <br> paragraph</p>

【问题讨论】:

  • 不,它不会自动转换它。您应该提供纯文本。

标签: c# asp.net-mvc sendgrid


【解决方案1】:

您必须自己提供文本替代方案。您可以通过将 br 标记替换为换行符并删除其他 html 格式来将 html 转换为文本。例如:

// convert br's to newline
var textString = System.Text.RegularExpressions.Regex.Replace(htmlString, "\\s*<\\s*[bB][rR]\\s*/\\s*>\\s*", Environment.NewLine);

// remove html tags
textString = System.Text.RegularExpressions.Regex.Replace(textString, "<[^>]*>", string.Empty);

【讨论】:

  • 这看起来是一个不错的路径,但唯一的问题是我的 HTML 现在完全在一行上,并且我使用的链接不见了。如果链接从:click here 到:www.examplelink.com,那将是理想的
  • 我编辑了我的原始帖子并添加了一个更好的示例来说明我将使用什么类型的 HTML
  • 您可以使用另一个正则表达式从链接中提取 href 属性:&lt;a.+?\s*href\s*=\s*["\']?([^"\'\s&gt;]+)["\']? 参见regex101.com/r/oH3yT4/1
【解决方案2】:

您可以使用 HtmlAgilityPack (NuGet) 进行从 html 到纯文本的转换:

HtmlToText htt = new HtmlToText();
string plaintText = htt.ConvertHtml(htmlString);

你会需要这个 HtmlCovert.cs:

#region

using System.IO;

#endregion

namespace NameSapceBlah
{
    using HtmlAgilityPack;

    public class HtmlToText
{
    #region Public Methods

    public string Convert(string path)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.Load(path);

        StringWriter sw = new StringWriter();
        this.ConvertTo(doc.DocumentNode, sw);
        sw.Flush();
        return sw.ToString();
    }

    public string ConvertHtml(string html)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        StringWriter sw = new StringWriter();
        this.ConvertTo(doc.DocumentNode, sw);
        sw.Flush();
        return sw.ToString();
    }

    public void ConvertTo(HtmlNode node, TextWriter outText)
    {
        string html;
        switch (node.NodeType)
        {
            case HtmlNodeType.Comment:
                // don't output comments
                break;

            case HtmlNodeType.Document:
                this.ConvertContentTo(node, outText);
                break;

            case HtmlNodeType.Text:
                // script and style must not be output
                string parentName = node.ParentNode.Name;
                if ((parentName == "script") || (parentName == "style"))
                    break;

                // get text
                html = ((HtmlTextNode)node).Text;

                // is it in fact a special closing node output as text?
                if (HtmlNode.IsOverlappedClosingElement(html))
                    break;

                // check the text is meaningful and not a bunch of whitespaces
                if (html.Trim().Length > 0)
                {
                    outText.Write(HtmlEntity.DeEntitize(html));
                }
                break;

            case HtmlNodeType.Element:
                switch (node.Name)
                {
                    case "p":
                        // treat paragraphs as crlf
                        outText.Write("\r\n");
                        break;
                }

                if (node.HasChildNodes)
                {
                    this.ConvertContentTo(node, outText);
                }
                break;
        }
    }

    #endregion

    #region Private Methods

    private void ConvertContentTo(HtmlNode node, TextWriter outText)
    {
        foreach (HtmlNode subnode in node.ChildNodes)
        {
            this.ConvertTo(subnode, outText);
        }
    }

    #endregion
}

}

那么你的方法应该有效: myMessage.Text = 纯文本;

虽然我会创建一个替代的 HTML 视图并将纯文本作为电子邮件主题发送。

 ContentType mimeType = new ContentType("text/html");
 AlternateView alternate =   AlternateView.CreateAlternateViewFromString(htmlString, mimeType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2014-09-08
    • 2018-03-17
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多