不关闭邮件会话功能的情况下,如何删除单个 Gmail 邮件或永久删除?

3

我通过电子邮件从扫描仪接收文档。

扫描仪无法更改主题。所有来自扫描仪的电子邮件主题都相同为“扫描到电子邮件服务器作业”。

但是,每个文件名都是唯一的。

谷歌将这些消息进行线程处理,通常我希望保持线程处理状态。

我运行脚本以提取PDF并放置在驱动器上,然后将该消息发送到垃圾箱。

问题是...未来的扫描会在整个线程上运行相同的脚本,因此每次运行脚本时,我都会得到许多完全相同的文档副本。

我在这里和其他地方查看了这个:使用Google脚本永久删除线程中的一个Gmail消息

    threads[i].moveToTrash();

期望行为:不要在垃圾箱中的邮件上运行脚本。问题是,整个邮件线程都被标记为垃圾邮件。

实际行为:它会在整个邮件线程上运行脚本...即使来自同一发件人并具有相同主题的垃圾箱中的邮件也会被运行。

目标:永久删除邮件,以便脚本不会在具有相同主题的先前邮件上运行。

或者在收到附件后将主题更改为文件名,并在提取附件后停止对邮件进行排列。

或者添加一个适用于单个邮件(而不是线程)的标签,不会堵塞我的标签/文件夹。

此外,需要澄清的是,我不能仅检查文件名是否唯一......因为它们通常在驱动器中重命名。

来自http://www.googleappsscript.org/home/fetch-gmail-attachment-to-google-drive-using-google-apps-script的下面两行不起作用。 整个邮件线程将重新处理......所有附件将再次添加。

  var root = DriveApp.getRootFolder();
  for(var i in threads){
    var mesgs = threads[i].getMessages();
    for(var j in mesgs){
      //get attachments
      var attachments = mesgs[j].getAttachments();
      for(var k in attachments){
        var attachment = attachments[k];
        var isImageType = checkIfImage_(attachment);
        if(!isImageType) continue;
        var attachmentBlob = attachment.copyBlob();
        var file = DriveApp.createFile(attachmentBlob);
        parentFolder.addFile(file);
        root.removeFile(file);
      }
    }
    threads[i].addLabel(label);

    //ADDED BELOW TO MOVE TO TRASH
    threads[i].moveToTrash();
    threads[i].removeFromThread();


  }

https://developers.google.com/apps-script/reference/gmail/gmail-label#removefromthreadsthreads 供我参考 - B D
1
当您想要完全删除线程中的一条消息而不破坏线程时,可以使用Gmail API中的Users.messages: delete方法。参考 但是从您的问题中,我不确定您的脚本部分是否使用了此方法。所以,您能提供当前的脚本吗?我想确认您的脚本并考虑解决方案和/或解决方法。 - Tanaike
1
感谢您的回复并更新了您的问题。在您的脚本中,检索了几个线程,并检索了每个线程中的所有消息。但是在您的问题中,似乎线程是恒定的。如果即使收到新消息,现有的一个线程ID也是恒定的,那么如何仅通过线程ID检查消息而不检查所有线程,并在获取附件文件后完全删除消息呢? - Tanaike
脚本是在触发器上运行还是手动操作?如果是在触发器上运行,你可以只检索最新的信息。如果是手动操作,则Tanaike的方法最好,在遍历附件后,使用消息(mesgs [j]),获取其ID并将其与上述建议中提到的Users.messages:delete方法一起使用。 - AMolina
是的,脚本正在触发/每分钟计时器上运行。 Tanaike的建议也可以,但需要重新制作整个运行在线程上的脚本,我不确定如何做到百分之百。脚本触发器每分钟运行一次。我会研究msgs[j] Users.messages:delete。删除是否真的删除还是发送到垃圾箱?问题是如果线程在垃圾箱中...任何新消息都会在整个线程上运行循环! - B D
显示剩余4条评论
1个回答

2
  • 您想彻底删除一个主题中的所有消息,并且在检索了主题中所有消息的所有附件文件后,您还想永久删除该主题。
  • 主题的标题始终相同。
  • 您希望使用Google Apps脚本实现此目的。

如果我理解正确,那么这个答案怎么样?在这个答案中,您问题中的脚本进行了修改。请将其视为几个答案之一。

当使用Users.threads:delete方法删除主题时,主题中的所有消息也将被删除。这将反映在您的脚本中。

在此方法中,主题和主题中的所有消息都将被永久删除。因此,请在测试时小心使用。

修改后的脚本:

在此修改中,我们向您问题中的脚本添加了3行代码。在运行脚本之前,请设置用于检查主题的变量subject

var subject = "sample subject"; // Added: Please set the subject of the thread.
var root = DriveApp.getRootFolder();
for(var i in threads){
  if (threads[i].getFirstMessageSubject() == subject) { // Added: Here, "subject" is checked.
    var mesgs = threads[i].getMessages();
    for(var j in mesgs){
      //get attachments
      var attachments = mesgs[j].getAttachments();
      for(var k in attachments){
        var attachment = attachments[k];
        var isImageType = checkIfImage_(attachment);
        if(!isImageType) continue;
        var attachmentBlob = attachment.copyBlob();
        var file = DriveApp.createFile(attachmentBlob);
        parentFolder.addFile(file);
        root.removeFile(file);
      }
    }
    Gmail.Users.Threads.remove("me", threads[i].getId()); // Added: Here, the thread and all mesagges in the thread are permanently deleted.
  }
}

注意:

  • 在使用此脚本之前,请启用高级Google服务下的Gmail API
  • 根据您的问题,我可以理解到线程的第一条消息的主题始终相同。因此,当subject与线程的第一条消息的主题相同时,将检索所有附件文件并永久删除该线程。
  • 在此方法中,线程和线程中的所有消息都将被永久删除。因此,在实际电子邮件运行脚本之前,建议先使用样本线程进行测试。
  • 如果有多个具有相同主题的第一条消息的线程,则会对它们运行上述修改后的脚本。请注意这一点。

参考文献:


谢谢 - 我尝试了这个方法,但它没有起作用。是因为“我”的原因吗 - 邮件来自别名,发送到别名。 扫描仪发出的电子邮件来自images@mydomain.com,并发送到别名scanner1@mydomain.com?(是的,我的主题=“扫描到电子邮件服务器作业”)。我还为此脚本启用了Gmail的高级Google服务。 - B D
哦,不好意思,我忘了写这个。在使用此脚本之前,请启用先进的谷歌服务中的 Gmail API。根据我的理解,您可以使用Gmail.Users.Threads.remove("me", threads[i].getId());中的“ me ”来处理您的情况。 - Tanaike
另外,关于“未能工作”,您能提供详细信息吗? - Tanaike
谢谢!我想这是我的错误。我必须在代码中更改查询为query ='in:inbox to:scanner1@mydomain.com has:attachment' + query;你的帮助一如既往的惊人 :) - B D
@B D 谢谢您的回复。我很高兴您的问题得到了解决。也谢谢您。 - Tanaike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接