获取通过谷歌脚本发送的邮件的线程ID

时间:2014-11-05 12:17:20

标签: google-apps-script

是否可以获取通过MailApp.sendEmail()发送的邮件的线程ID。我想在发送后立即用标签标记发送的邮件。

MailApp.sendEmail("samplemail@gmail.com","Sellers Required for pilot",msg_to_bd);
//get thread id for this mail, say thread 1
thread1.addLabel(labll);

4 个答案:

答案 0 :(得分:4)

首先,由于您要为刚刚发送的主题添加标签,因此您必须使用GmailApp。 MailApp仅允许您发送邮件,而不与用户的收件箱进行交互。

正如您所见,GmailApp.sendEmail()不会返回消息或线程ID。在这种情况下,您可以搜索刚刚发送的主题,但是您必须说明您向此人发送过多封邮件的时间。

只要您不是非常快速地发送重复邮件,您就可以依赖于对GmailApp.search()的调用将返回与Web UI相同顺序的线程。所以搜索从我到:customer123@domain.net'可能会返回多个线程,但第一个结果将是最近发送的消息的线程。

一个玩具示例,我们将邮件发送到名为Recipients的标签中列出的一堆地址:

var recipients = SpreadsheetApp.getActiveSpreadsheet()
                               .getSheetByName('Recipients')
                               .getDataRange()
                               .getValues();
recipients.shift();  // Only if the Recipients sheet contained a header you need to remove
var d = new Date();  
var dateText = d.toLocaleString(); // Pretty-printed timestamp
var newLabel = GmailApp.createLabel(dateText); // Label corresponding to when we ran this
for (var i = 0; i < recipients.length; i++) {
  GmailApp.sendEmail(recipients[i], 'This is a test', 'Of the emergency broadcast system');
  var sentThreads = GmailApp.search('from:me to:' + recipients[i]);
  var mostRecentThread = sentThreads[0];
  mostRecentThread.addLabel(newLabel);
}

答案 1 :(得分:1)

Apps脚本不会返回线程ID,但您可以执行的操作是在发送电子邮件后在邮箱中搜索主题并将标签应用于结果中的第一个线程。

var to="email@example.com", subject="email subject";
GmailApp.sendEmail(to,subject,msg_to_bd);
var threads = GmailApp.search("to:" + to + " in:sent subject:" + subject, 0, 1);
threads[0].addLabel(label);

答案 2 :(得分:1)

由于所有GmailApp.send *方法(在撰写本文时)都没有返回消息或线程标识符,并且由于GmailMessage对象没有send *方法,因此最安全的做法是嵌入唯一标识符发送时的消息。然后搜索包含唯一标识符的电子邮件。

此代码对我来说是一项实验。请注意,我必须睡眠()几秒钟才能使搜索成功。

  function tryit() {
    var searchTerm = Utilities.getUuid();
    GmailApp.sendEmail('address@somewhere.com', 'oh please',
                       'custom id: ' + searchTerm);
    Utilities.sleep(2000);
    var threadIds = GmailApp.search(searchTerm);
    Logger.log(threadIds);
    if (threadIds.length != 1) {
      Browser.msgBox('Found too many threads with unique id '
                     + searchTerm);
      return;
    }
    return threadIds[0];
  }

我怀疑我们必须跳过箍的原因是API作者不希望发送电子邮件同步(可能需要太长时间),因此他们无法返回错误或消息ID失败或成功。

如果你想要完全疯狂,你可以用uuid向自己发送一条消息,然后在while-sleep-search循环中旋转,直到找到uuid并因此得到一个线程id,然后回复线程收件人的完整列表。如果出现问题,这可以保证只有您的收件箱会受到影响。

答案 3 :(得分:0)

我正在使用它,它将uuid隐藏的代码添加到邮件中,我可以以100%的精度查找/标记特定的电子邮件:

var uid = Utilities.getUuid();
var uidText = '<span style="color:transparent; display:none !important; height:0; opacity:0; visibility:hidden; width:0">' + uid +  '</span>';
GmailApp.sendEmail(parameters.email, subject, "", {"htmlBody":htmlEmail + uidText});
Utilities.sleep(1000);
GmailApp.search(uid)[0].addLabel(label)