使用 Google Script 永久删除我的电子邮件的脚本

Posted

技术标签:

【中文标题】使用 Google Script 永久删除我的电子邮件的脚本【英文标题】:Script to permenantly delete my emails with Google Script 【发布时间】:2016-07-22 12:05:02 【问题描述】:

这个 Gmail.Users.Messages.remove(userId, id) 是如何工作的?电子邮件的 ID 是什么?永久删除电子邮件的功能是否正确?

就我而言,我想立即且明确地删除所有已发送的电子邮件。这是我从某人那里获取的一些代码,只是标签不同:

function myFunction() 
  var threads = GmailApp.search("in:sent label:Inbox");
  var me = Session.getActiveUser().getEmail();
    for (var i = 0; i < threads.length; i++) 
      Gmail.Users.Messages.remove(me, threads[i]);
    


这是否正确,谁能帮助我?

编辑:我修改了我的代码,但它仍然无法正常工作,我仍然无法弄清楚如何使用删除功能,这是它:

function myFunction() 
  
  var me = Session.getActiveUser().getEmail();
  var thread = Gmail.Users.Threads.list(me);
  for (var i = 0; i < 1000; i++) 
        Gmail.Users.Threads.remove(me, thread);
        thread = Gmail.Users.Threads.list(me).nextPageToken;
     
  


代码运行后,我会设置一个触发器,每分钟运行一次函数。这样我的已发送文件夹总是空的。

【问题讨论】:

【参考方案1】:

在我这边,我正在使用这个

 thread.moveToTrash();

(同意垃圾可能不是你所期望的......)

谷歌文档(英文):https://developers.google.com/apps-script/reference/gmail/gmail-thread#movetotrash

发帖(法国):http://curiositedevie.blogspot.be/2015/08/gmail-gestion-de-vos-emails-aux-petits.html?m=1

完整示例脚本(英文):https://github.com/boly38/script.google.com/blob/master/organizeEmail.gs


编辑:这是永久删除线程的解决方案

在下面的示例中使用Gmail.Users.Threads.remove(mymail, thread.id);

如何使用示例:

更新您的 gmail 地址(第一次执行时会要求您提供相关授权)。 我强烈建议第一次玩时使用permanentlyRemoveMyLabel = false。在这种情况下,此示例将显示(并保留)带有label:mytest 的消息 完成后,将permanentlyRemoveMyLabel 设置为true。在这种情况下,此示例将显示并永久删除带有label:mytest 的消息。

https://script.google.com/ 的示例:

function removeMyTest() 
  var mymail = "myemailhere@gmail.com";
  var mylabel = "mytest";
  var permanentlyRemoveMyLabel = false;
  var pageToken;
  do 
    var threadList = Gmail.Users.Threads.list('me', 
      q: 'label:' + mylabel,
      pageToken: pageToken
    );
    if (threadList.threads && threadList.threads.length > 0) 
      threadList.threads.forEach(function(thread) 
        Logger.log('id: %s snippet: %s', thread.id, thread.snippet);
        if (permanentlyRemoveMyLabel) 
          Gmail.Users.Threads.remove(mymail, thread.id);
          Logger.log('id: %s snippet: %s REMOVED', thread.id, thread.snippet);
        
      );
    
    pageToken = threadList.nextPageToken;
   while (pageToken);

【讨论】:

感谢您的回答,我已经读到,使用高级 Google 服务,使用 Gmail Api 可以在不进入垃圾文件夹的情况下绝对删除电子邮件。这是developers.google.com/gmail/api/v1/reference/users/messages/… 的主题。就是不知道怎么用,不得不说我的编程功力很厉害,不过还在学习中。 我认为这个 v1 "delete(...)" ReST API 没有被任何 'apps-script' 方法包装,因为apps-script/reference 中没有删除方法,甚至没有办法清空垃圾.. :( 完全正确,但必须有办法,因为此链接中给出的脚本:developers.google.com/gmail/api/v1/reference/users/messages/… 如果给出了正确的 ID,则可以完美运行。我只需要知道如何获取电子邮件的 ID,以便我可以正确运行我的功能。 您的解决方案完美运行!正是我想要的,谢谢! 您需要为 Gmail 启用高级谷歌服务(在资源和控制台 api 下)【参考方案2】:

这将从已发送文件夹中删除所有对话。注意如果有人向您发送了一条消息并且您回复了这将是同一对话的一部分,我认为传入的消息也会被删除。这可能不是你想要的。

function DeleteByLabel() 

  var label="sent"
  var threads = GmailApp.search("in:" +label);
  var me = Session.getActiveUser().getEmail();
  Logger.log("Found " + threads.length + " threads with label " + label);

  for (var i = threads.length -1; i >=0; i--) 
     var thisid=threads[i].getId();
     Logger.log("Removing thread " +i + ' of ' + threads.length + " from " + label + " with ID = " + thisid);

    try 
        Gmail.Users.Threads.remove(me, thisid);
    
    catch(err) 
     Logger.log("Error " + err.message + " when removing thread with ID " +thisid);
    ;



在我的“草稿”文件夹上尝试过,它摆脱了那些好的。

注意,您必须在运行时启用相应的 Gmail API。

【讨论】:

【参考方案3】:

将其添加到谷歌脚本。

function Intialize() 
  return;


function Install() 
  ScriptApp.newTrigger("purgeGmail")
           .timeBased().everyMinutes(1).create();


function Uninstall() 
  var triggers = ScriptApp.getScriptTriggers();
  for (var i=0; i<triggers.length; i++) 
    ScriptApp.deleteTrigger(triggers[i]);
  

function purgeGmail() 
  var search = "category:forums";
  var threads = GmailApp.search(search, 0, 500);
  GmailApp.moveThreadsToTrash(threads);

【讨论】:

【参考方案4】:

我在文档中做了一些挖掘工作。有了你想要的结果,我想你正在寻找的是User.messages.delete。如文档中所述:

立即永久删除指定消息。此操作无法撤消。

根据Gmail.Users.Messages.remove(),我不确定这个,但我认为它是一个旧实现,因为我环顾社区并发现这个answer 提供它作为永久删除的sn-p电子邮件/消息。不过,我会坚持当前文档所说的内容。

【讨论】:

我无法在 script.google.com 找到这个命令 User.messages.delete ,我正在开发网络版本。唯一可用的命令是 remove()。【参考方案5】:

这在 2017 年 2 月中旬之前一直有效。

我用它来清空我的垃圾

  `var threads = GmailApp.getTrashThreads(0, 100);
  for (var i = threads.length -1; i >=0; i--) 
        Logger.log("Removing thread " +i + ' of ' + threads.length + " from Trash");
    try 
    Gmail.Users.Messages.remove(me, threads[i].getId());
     catch(err) 
    Logger.log("Error " + err.message);
    ;
  
  Logger.log("Finished removing " + threads.length + " threads from Trash.");`

它现在已停止工作并出现以下错误:

`17-02-25 02:10:53:510 PST] Removing thread 1 of 2 from Trash
[17-02-25 02:10:53:620 PST] Error Not Found
[17-02-25 02:10:53:621 PST] Removing thread 0 of 2 from Trash
[17-02-25 02:10:53:763 PST] Error Not Found
[17-02-25 02:10:53:764 PST] Finished removing 2 threads from Trash.`

最近好像功能有所变化。

【讨论】:

如果您知道它不再起作用,为什么您将其发布为答案,先生? 这不是答案

以上是关于使用 Google Script 永久删除我的电子邮件的脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何还原被永久删除的Google驱动器文件

如何通过组帐户使用 Google Script 发送电子邮件

Gmail /Google 应用程序每小时/每天自动使用脚本/api 永久删除垃圾邮件

我找不到我创建的Google脚本(未附加到电子表格)

Google App Script在doc中显示提示,但未使用电子表格权限

如何强制 Google App Script MailApp.sendEmail 在循环中为每封电子邮件使用新线程?