C# SendGrid是否自动将HTML消息转换为纯文本?
我正在向注册的用户发送一封确认电子邮件,希望确保有HTML和纯文本版本,以防用户的电子邮件客户端不显示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);
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);