从电子邮件的字符串主体中删除格式标签

时间:2012-01-20 02:29:17

标签: javascript html tags google-apps-script

如何在调用时删除所有格式标记:

GmailApp.getInboxThreads()[0].getMessages()[0].getBody()

使文本的唯一剩余部分是可以阅读的文本。

格式化可以被破坏;正文中的文本只需要解析,但标签如:

"&" 
<br>

以及其他可能需要删除。

5 个答案:

答案 0 :(得分:12)

即使Apps Script中没有DOM,您也可以解析HTML并以这种方式获取纯文本:

function getTextFromHtml(html) {
  return getTextFromNode(Xml.parse(html, true).getElement());
}

function getTextFromNode(x) {
  switch(x.toString()) {
    case 'XmlText': return x.toXmlString();
    case 'XmlElement': return x.getNodes().map(getTextFromNode).join('');
    default: return '';
  }
}

致电

getTextFromHtml("hello <div>foo</div>&amp; world <br /><div>bar</div>!");

将返回

  

“你好foo&amp; world bar!”。

为了解释,第二个参数为“true”的Xml.parse将文档解析为HTML页面。然后我们遍历文档(将修补缺少的HTML和BODY元素等,并转换为有效的XHTML页面),将文本节点转换为文本并扩展所有其他节点。

这无疑是记录不清的;我通过玩Xml对象并记录中间结果来写这个,直到我开始工作。我们需要更好地记录Xml内容。

答案 1 :(得分:6)

我注意到您正在撰写Google Apps脚本。 Google Apps脚本中没有 DOM ,也无法创建元素并获取 innerText 属性。

getBody()以HTML格式为您提供电子邮件正文。您可以使用以下代码替换代码:

var html = GmailApp.getInboxThreads()[0].getMessages()[0].getBody();
html=html.replace(/<\/div>/ig, '\n');
html=html.replace(/<\/li>/ig, '\n');
html=html.replace(/<li>/ig, '  *');
html=html.replace(/<\/ul>/ig, '\n');
html=html.replace(/<\/p>/ig, '\n');
html=html.replace(/<br\/?>/ig, '\n');
html=html.replace(/<[^>]+>/ig, '');

可能是您可以找到更换的标签。请记住,此代码不适用于任何HTML,但适用于getBody()HTML。 GMail有自己的格式化方法,并没有在HTML中使用每个可能的现有标签,只使用它的一部分;然后我们的GMail特定代码更短。

答案 2 :(得分:2)

我找到了一种更简单的方法来完成这项任务。

sendEmail()的参数中使用 htmlBody 高级参数。下面是一个例子:

var threads = GmailApp.search ('is:unread'); //searches for unread messages   
var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array

for (i = 0; i < messages.length; ++i)
{
j = messages[i].length; //to process most recent conversation in thread (contains messages from previous conversations as well, reduces redundancy
messageBody = messages[i][j-1].getBody(); //gets body of message in HTML
messageSubject = messages [i][j-1].getSubject();
GmailApp.sendEmail("dummyuser@dummysite.com", messageSubject, "", {htmlBody: messageBody});
}

首先,我发现所有线程都包含未读消息。然后,我使用 GmailApp 中的 getMessagesForThreads()方法将线程中包含的消息转换为二维数组。然后我创建了一个for循环,它运行我找到的所有线程。我将j设置为等于线程消息计数,因此我只能在线程(j-1)上发送最新消息。我通过 getBody()获取消息的HTML正文,通过 getSubject()获取主题。我使用 sendEmail(recipients,subject,body,optAdvancedArgs)来发送电子邮件并处理HTML正文。结果是发送的电子邮件格式正确,包含HTML的所有功能。这些方法的文档可以在这里找到:https://developers.google.com/apps-script/service_gmail

我希望这有帮助,再次手动解析方法确实有效,但我仍然发现一些HTML的碎片留下来,所以我想我会尝试一下,如果我发现任何问题,它对我有用longrun我会更新这篇文章。到现在为止还挺好!

答案 3 :(得分:0)

我不确定你的意思.getBody() - 这是否应该返回一个DOM体元素?

但是,删除HTML标记的最简单方法可能是让浏览器呈现HTML并询问他的文本内容:

var myHTMLContent = "hello &amp; world <br />!";
var tempDiv = document.createElement('div');
tempDiv.innerHTML = myHTMLContent;

// retrieve the cleaned content:
var textContent = tempDiv.innerText;

通过上面的示例,textContent变量将包含文本

"hello & world
!"

(请注意由<br />标记引起的换行符。)

答案 4 :(得分:0)

Google现在拥有getPlainBody()功能,可以从电子邮件正文中获取纯文本。它在文本类中。

我一直在使用脚本发送电子邮件将其转换为任务,谷歌通过更改Corey上面的答案功能打破了它。我用以下内容替换了它。

var taskNote = ((thread.getMessages()[0]).getPlainBody()).substring(0,1000);