首页 > 解决方案 > 从 GmailMessage.getHeader() 访问重复的标题

问题描述

我正在尝试从我的附加组件中的消息中获取 Return-Path 标头。我能够获得该值,但是,标题中有多个 Return-Path 条目。getHeader 只返回最后一个。如何使用 getHeader 获取两个条目?

如果有帮助,下面是完整的代码。


function getContextualAddOn(event) {
  var message = getCurrentMessage(event);

  var card = createCard(message);

  return [card.build()];
}

function myAction(e) {
  toAddress = e["formInput"]["forwardTo"];
  var message = getCurrentMessage(e);
  GmailApp.sendEmail(toAddress, "SPAM", message.getRawContent());
}

/**
 * Retrieves the current message given an action event object.
 * @param {Event} event Action event object
 * @return {Message}
 */
function getCurrentMessage(event) {
  var accessToken = event.messageMetadata.accessToken;
  var messageId = event.messageMetadata.messageId;
  GmailApp.setCurrentMessageAccessToken(accessToken);
  return GmailApp.getMessageById(messageId);
}

function createCard(message) {
  var emailFrom = message.getHeader("Return-Path");
  emailFrom = emailFrom.replace(/[<>]/g, "");
  var card = CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader().setTitle("Forward e-mail"));
  
  var statusSection = CardService.newCardSection();
  statusSection.addWidget(CardService.newTextParagraph()
     .setText("<b>Sender: </b>" + emailFrom ));
  card.addSection(statusSection);
  
  var formArea = CardService.newCardSection();
  var widget = CardService.newTextInput()
    .setFieldName("forwardTo")
    .setTitle("To:");
  
  formArea.addWidget(widget);
  
  var button = CardService.newTextButton()
    .setText("Submit")
    .setOnClickAction(CardService.newAction().setFunctionName("myAction"));
  
  var buttons = CardService.newButtonSet()
    .addButton(button);
  
  formArea.addWidget(buttons);
  
  card.addSection(formArea);
  
  return card;
}

标签: javascriptgoogle-apps-script

解决方案


在这种情况下,我认为需要Return-Path从电子邮件的原始内容中检索带有标题的值。为了实现这一点,下面的修改如何?

使用 V8 运行时:

在这种情况下,请在脚本编辑器中启用 V8。

从:

function createCard(message) {
  var emailFrom = message.getHeader("Return-Path");

至:

function createCard(message) {
  // var emailFrom = message.getHeader("Return-Path");
  const res = [...message.getRawContent().matchAll(/Return-Path:([\w\s\S].+)/g)].map(([,e]) => e.trim());
  • 在此修改中,res是一个包含标头值的数组Return-Path。当 2 个Return-Path标头包含在 中时message,这些标头包含在res.

没有 V8 运行时:

在这种情况下,您可以使用没有 V8 的脚本。

从:

function createCard(message) {
  var emailFrom = message.getHeader("Return-Path");

至:

function createCard(message) {
  // var emailFrom = message.getHeader("Return-Path");
  const res = message.getRawContent().match(/Return-Path:[\w\s\S].+/g).map(function(e) {return e.replace("Return-Path:", "").trim()});
  • 结果与上面的脚本相同。

参考:


推荐阅读