C# SendGrid是否自动将HTML消息转换为纯文本?

C# SendGrid是否自动将HTML消息转换为纯文本?,c#,asp.net-mvc,sendgrid,C#,Asp.net Mvc,Sendgrid,我正在向注册的用户发送一封确认电子邮件,希望确保有HTML和纯文本版本,以防用户的电子邮件客户端不显示HTML,但我有点困惑如何做到这一点。以下是我的一些代码: private async Task configSendGridasync(IdentityMessage message) { var myMessage = new SendGridMessage(); myMessage.AddTo(message.Destination);

我正在向注册的用户发送一封确认电子邮件,希望确保有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;
    }

您必须自己提供文本备选方案。通过将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);
//将br转换为换行符
var textString=System.Text.RegularExpressions.Regex.Replace(htmlString,“\\s*\\s*”,Environment.NewLine);
//删除html标记
textString=System.Text.RegularExpressions.Regex.Replace(textString,]*>,string.Empty);

您可以使用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);

不,它不会自动转换它。你应该提供纯文本。这看起来是一个不错的路径,但唯一的问题是我的HTML现在完全在一行上,我使用的链接不见了。如果链接从:到:www.examplelink.com我编辑了我的原始帖子,并添加了一个更好的示例,说明我将使用哪种类型的HTML。您可以使用另一个正则表达式从链接中提取href属性:

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