2016-06-30 2 views
0

登録したユーザーに確認メールを送信していますが、ユーザーのメールクライアントにHTMLが表示されない場合はHTMLとプレーンテキストの両方のバージョンが存在することを確認しますが、これを行う。SendGridはHTMLメッセージをプレーンテキストに自動的に変換しますか?

private async Task configSendGridasync(IdentityMessage message) 
    { 
     var myMessage = new SendGridMessage(); 
     myMessage.AddTo(message.Destination); 
     myMessage.From = new System.Net.Mail.MailAddress(
          "[email protected]", "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;は自動的に"<p>Example confirmation message</p>"となり、プレーンテキストに変換されますか?そうでない場合は、テキスト版に使用されるgetメッセージをどのように追加しますか?

編集:私が使用する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> 
+0

いいえ自動的に変換されません。プレーンテキストを提供するはずです。 – Stilgar

答えて

0

あなたはテキスト代替を自分で用意する必要があります。 brタグを改行に置き換え、他のHTML書式を削除することで、HTMLをテキストに変換できます。

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

そして、あなたはこのHtmlCovert.csが必要になります:あなたは、プレーンテキストにHTMLからの変換を行うためにHtmlAgilityPack(NuGet)を使用することができ

// 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); 
+0

これは良いパスのように見えますが、唯一の問題はHTMLが完全に1行になり、使用していたリンクがなくなったことだけです。 click hereから:www.examplelink.com – Brett

+0

オリジナルの投稿を編集し、使用するHTMLの種類の良い例を追加しました – Brett

+0

別の正規表現とのリンクからhref属性を抽出することができます: '] +)["\']? com/r/oH3yT4/1 – longchiwen

1

:たとえば

#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 = plainテキスト;

イベント私は別のHTMLビューを作成し、メールの件名としてplainTextを送信します。 コンテンツタイプmimeType =新しいContentType( "text/html"); AlternateView代替= AlternateView.CreateAlternateViewFromString(htmlString、mimeType);

関連する問題