Skip to content

Instantly share code, notes, and snippets.

@dalion619
Created August 26, 2018 19:25
Show Gist options
  • Save dalion619/ae60e0885efa0c09d38a6032257205cb to your computer and use it in GitHub Desktop.
Save dalion619/ae60e0885efa0c09d38a6032257205cb to your computer and use it in GitHub Desktop.
Convert HTML Email Template to Plain Text
var emailHtmlBody = await EmailTemplateHelper.RenderEmailTemplate<WelcomeEmailTemplate>(welcomeEmailTemplateModel);
var emailPlainTextBody = await EmailTemplateHelper.ConvertHtmlEmailTemplateToPlainText(emailHtmlBody);
/// <summary>
/// Converts HTML email template to plain text.
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static async Task<string> ConvertHtmlEmailTemplateToPlainText(string html)
{
try
{
var parser = new HtmlParser();
var document = parser.Parse(html);
var plainTextStringBuilder = new StringBuilder();
// Aka subject.
var title = document.QuerySelector("title").TextContent;
plainTextStringBuilder.AppendLine(title);
plainTextStringBuilder.Append(Environment.NewLine);
// Get all sections of content.
var sections = document.All.Where(e => e.ClassList.Contains("section") && e.ClassList.Count() == 1);
foreach (var section in sections)
{
// Get heading of section.
var heading = section.GetElementsByClassName("h1").FirstOrDefault();
if (heading != null)
{
plainTextStringBuilder.Append(Environment.NewLine);
plainTextStringBuilder.AppendLine(heading.TextContent);
plainTextStringBuilder.Append(Environment.NewLine);
}
// Get paragraphs of content copy.
var paragraphs = section.GetElementsByClassName("copy");
if (paragraphs.Count() != 0)
{
foreach (var paragraph in paragraphs)
{
plainTextStringBuilder.AppendLine(paragraph.TextContent);
}
plainTextStringBuilder.Append(Environment.NewLine);
}
// Get CTA urls and titles.
var callToActions = section.GetElementsByTagName("a");
if (callToActions.Count() != 0)
{
foreach (var callToAction in callToActions)
{
plainTextStringBuilder.AppendLine($"{callToAction.TextContent} | {callToAction.GetAttribute("href")}");
plainTextStringBuilder.Append(Environment.NewLine);
}
}
}
// Get footer signature.
var address = document.GetElementsByClassName("address").FirstOrDefault();
if (address != null)
{
/*
Text is malformed due to HTML formatting.
Split string by \n then disregard all elements that are empty after a Trim().
Select remaining elements Trim once more then join back into a string seperated by a Environment.NewLine
*/
plainTextStringBuilder.AppendLine(string.Join(Environment.NewLine, (address.TextContent.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries)).Where(s => !string.IsNullOrEmpty(s.Trim())).Select(s => s.Trim())));
}
return plainTextStringBuilder.ToString();
}
catch (Exception e)
{
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment