如何使用谷歌应用程序脚本阅读Gmail中的所有电子邮件

时间:2015-05-19 17:48:18

标签: google-apps-script messages

我试图在我的Gmail帐户中阅读所有电子邮件 - 收件箱,已发送,草稿,垃圾箱,带有标签的电子邮件,存档等。我可以在没有垃圾的情况下生活,但我想要其他所有内容。

(以下所有示例都使用try {} catch {}来避免使用空标签等错误。)

我已经尝试了

for (var i=StartLabel; i<=EndLabel; i++)
{
  var label = labels[i].getName();

  // get all messages, then join them into a single dimension array
  var messages = GmailApp.getMessagesForThreads(GmailApp.search("label:" + label))
                   .reduce(function(a, b) {return a.concat(b);});
  CountByLabels += messages.length;
}

这给了我标签中的所有内容(我认为),而不是其他内容。

我尝试了其他内容,以获取收件箱(与上述内容相结合)或所有电子邮件

var messages = GmailApp.getMessagesForThreads(GmailApp.getInboxThreads()).reduce(function(a, b) {return a.concat(b);});
CountInbox += messages.length;

但我只得到大约549个结果(GMail显示5,478)。如果我从getPriorityInboxThreads中添加结果,我会得到1,829个结果。

我试过

// get all messages, then join them into a single dimension array
var messages = GmailApp.getMessagesForThreads(GmailApp.search("(is:unread OR is:read) in:anywhere")).reduce(function(a, b) {return a.concat(b);});
CountByLabels += messages.length;

我得到了598个结果。 我在上面的代码中尝试了不同的搜索词,例如:

是:未读= 528结果

是:read = 1,037结果

是:读取OR是:未读= 599结果

他们都没有给出正确的号码,甚至是关闭,顺便说一句,如果我直接在gmail中尝试这些搜索词,我会得到一个完全不同的,更高的结果 - 几千个,或者多个&# 39;

我不认为这与How to use Google App Scripts to retrieve Gmail emails in a customised way?有关,因为返回的数字不是圆数(例如500)。

我假设我可以使用getSpamThreads,getStarredThreads,getTrashThreads,getDraftMessages获取相关文件夹,但直到我理解为什么我只收到来自收件箱的电子邮件我不相信那些给我一切。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:4)

试试这个:

function allEmailsInLabels() {
  var allLabels,i,j,L,L2,msgCount,theCount,threads,thisLabel;

  msgCount = 0;
  theCount = 0;

  allLabels = GmailApp.getUserLabels();
  L = allLabels.length;

  for (i = 0; i < L; i++) {
    Logger.log("label: " + allLabels[i].getName());
    thisLabel = allLabels[i];
    threads = thisLabel.getThreads();
    //Logger.log('threads: ' + threads);

    L2 = threads.length;

    for (j = 0; j < L2; j++) {
      msgCount = threads[i].getMessageCount();
      //Logger.log('thread message count: ' + threads[j].getMessageCount());
      theCount = theCount + msgCount;
    };
  };
  //Logger.log('theCount: ' + theCount);
};

首先获取所有标签,然后获取线程,然后获取每个线程中的消息计数,并保持运行计数。您还需要在收件箱中收到消息,该代码不包含这些消息。这是显示基本概念的文档中的示例代码:

// Log the subject lines of your Inbox
var threads = GmailApp.getInboxThreads();
for (var i = 0; i < threads.length; i++) {
  Logger.log(threads[i].getFirstMessageSubject());
}

答案 1 :(得分:1)

我有同样的问题。我在阅读Google开发者网站上的参考资料时,多读了一点,发现有关函数moveToInbox的内容,这是一个Google示例,使用Google搜索来获取收件箱(https://developers.google.com/apps-script/reference/gmail/gmail-thread#movetoinbox中未包含的所有电子邮件。我决定将其与getInboxThreads结合使用,并与这两个结合起来,我的代码更短,并且发现了我收到的每封电子邮件(减少了垃圾邮件和垃圾邮件)。

WinBFWindow

此后,在Gmail中“所有邮件”文件夹中的每一封电子邮件都位于这两个变量中。

我不知道这是否可以帮助任何人,但肯定可以帮助我。

答案 2 :(得分:0)

这不是您问题的答案(但可能是您返回的总结果与您在gmail收件箱中看到的内容不一致的原因之一)但突出了我在调用getPriorityInboxThreads时遇到的一个问题( )它忽略了任何未被标记为&#34;重要的线程&#34;在主要收件箱中。

//returns 10 threads and 1st message for each thread
function getThreads(){
  var ret = '';
  var threads = GmailApp.getPriorityInboxThreads(0, 10);
  for (var i = 0 ; i < threads.length; i++) {
    var id = threads[i].getId();
    var message = GmailApp.getMessageById(id);
    ret += "subject: " + message.getSubject() +'\n';
    Logger.log("subject: " + message.getSubject());

    /*Edited this out as it doesn't return anything
    //check for labels  on this thread 
    var labels = threads[i].getLabels();
    for (var j = 0; j < labels.length; j++) {
      Logger.log(labels[j].getName());
    } */
  }

 return ret;
}

&#34;重要&#34;被归类为系统标志,getPriorityInboxThreads()忽略任何未标记为重要的线程....

我想选择&#34; Primary&#34;中的所有主题。收件箱无论被标记为&#34;重要&#34;。

要进行测试,只需将收件箱中的任何线程更改为重要或不等。

答案 3 :(得分:0)

我发布了有关如何将Gmail邮件发送到Google电子表格的视频后,我收到了一些查看者的反馈,说他们只能收到许多邮件,而其他人则无法处理。因此,我进行了一些研究,发现获取电子邮件的过程可能会失败,并使系统无法处理大量电子邮件。 Gmail API在此处提到了这一点: https://developers.google.com/apps-script/reference/gmail/gmail-label#getthreads

文档建议使用private bool ItemsFilter(object o) { var dataItem = o as DataItem; // Item filter if(!string.IsNullOrWhitespace(CurrentFilter)) if(CurrentFilter != "All Items") if (o.Item != CurrentFilter) return false; // Element filter if(!string.IsNullOrWhitespace(CurrentElement)) if(CurrentElement != "All Elements") if (o.Element != CurrentElement) return false; // Value filter if(!string.IsNullOrWhitespace(CurrentValue)) if(CurrentValue != "All Values") if (o.Value != CurrentValue) return false; return true; } ,其中getThreads(start, max)start是限制参数。

您可以观看视频并从YouTube和GitHub下载完整代码: https://youtu.be/gdgCVqtcIw4

答案 4 :(得分:0)

我知道这有点延迟,但是遇到了同样的问题并查看了这里提供的一些解决方案,我想提供我自己的解决方案,它也使用了搜索功能:

function getEmails() {
  var allEmailThreads = GmailApp.search('label:all')
}

这实际上对每封电子邮件进行过滤,无论邮箱如何,在我看来,这是解决问题的最简单方法。