2015-06-24 32 views
1

我已经创建了一个脚本,可以删除400天以上(大约13个月)的邮件。我搜索了可用的GS帮助,找不到一个获取“All Mail”文件夹句柄的方法,这是我想要从中删除邮件的地方。有没有办法做到这一点,我没有看到?需要处理“全部邮件”文件夹以删除旧邮件

+0

我认为你可以使用'getUserLabelByName()'[谷歌文档(https://developers.google.com/apps-script/reference/gmail/gmail-app#getUserLabelByName(字符串))的Gmail没有按't叫一个文件夹的文件夹,这是一个“标签” –

+2

@SandyGood - “所有消息”不是“用户标签”,所以它不能以这种方式访问​​。但是,标签和文件夹之间非常重要的区别! – Mogsdad

+0

自从昨天以来,我一直在试图解决这个问题,并且“很轻易的”意识到该函数中的关键词是USER。我还发现,除“所有邮件”和“已发送邮件”之外,所有Google标签均可访问有垃圾邮件和垃圾邮件的GET功能。去数字,你可以得到你不想要的东西(并在30天内被删除),并不能得到你想要的东西。 –

回答

1

感谢您的信息。能够建立一个完全符合我想要的功能。

function delOldMail() { 
    var email = Session.getActiveUser().getEmail(); 
    var subject = 'GS delOldMail: ' + Session.getActiveUser(); 
    var body = 'Messages Deleted:'; 
    var breakPoint = 50; 
    var breakCntr = 0; 

    var threads = GmailApp.search('!is:starred older_than:400d'); 
    if (threads.length > 0) { 

    for (var delCntr = 0; delCntr < threads.length; delCntr++) {  
     var message = threads[delCntr].getMessages()[0]; 
     var messageId = message.getId(); 
     var messageById = GmailApp.getMessageById(messageId); 
     var messagedate = messageById.getDate(); 

     var seqnum = "0000" + delCntr; 
     var seqstrt = seqnum.length - 4; 
     var body = body + "\n threads: " + seqnum.substr(seqstrt,4) + " " + threads[delCntr].getFirstMessageSubject() + ':::' + messagedate; 

     if (breakCntr = breakPoint) { 
     breakPoint = breakPoint + 50 
     Utilities.sleep(1000); 
     } 
     var breakCntr = breakCntr++ 
     threads[delCntr].moveToTrash(); 
    } 
    } else { 
    var body = body + '\n Nothing to delete today ...'; 
    } 
    GmailApp.sendEmail(email, subject, body); 
} 
+0

你为什么要删除电子邮件 - 不感兴趣? – Jonathon

+0

从我担任Lotus Notes开发人员的日子开始,我就将自己的邮箱保持在最低限度。当我需要查看最古老的信息时,我不想回想太多。 –

+0

我想我很喜欢GMail的归档方式,而不是删除,再加上布尔搜索。 – Jonathon

1

执行搜索。它的工作方式与GMail UI相同。

var threads = GmailApp.search('older_than:400d … plus whatever other criteria you want'); 

它会给出与GMail相同的结果,即使用All Mail作为搜索存储库。

如果你想找到尚未提交到任何标签,那么广告'has:nouserlabels'作为一个标准的邮件,但要注意线程是调皮的家伙特别是当过滤器已经自动标记收到的消息在对话中没有标签等

如果此调用可能返回大量结果,则可能需要分页。

更新 遍历结果检查每个线程的最后一条消息退换也符合使用.getLastMessageDate()

+0

这给线程,而不是消息。线程的年龄由最旧的消息决定,因此结果可能包含新消息。对于每个线程,您都需要分别检查每条消息以确保它符合您的年龄标准。 – Mogsdad

+1

是的。尽管意图很可能是如果它包含更新的消息而使整个线程完好无损,则只需检查每个线程的一条消息。答复修正。 – Jonathon

+0

感谢您的信息,并提出。我会测试这个以确保我不陷入任何这些陷阱。 –

1

在Gmail中你的年龄标准,“所有邮件”是不是一个文件夹,它不是一个用户标签。这就是你的邮件。

如果您的目标是确定具有特定年龄的所有消息,则GMail服务中没有任何方法可以这样做。但是,您可以使用GMail API列出所有消息,并通过提供查询字符串可以过滤结果。

这是一个可以做到这一点的功能。应该警告,尽管......它可以详尽地列出你的所有消息,如果有足够的消息,它将超出你的执行限制。

/** 
* Retrieve Messages in user's mailbox matching query. 
* 
* @param {String} query String used to filter the Messages listed. 
* @param {String} userId (optional) User's email address. Default: The special 
*       value 'me' is used to indicate the authenticated user. 
*/ 
function listMessages(query, userId) { 
    query = query || ''; 
    userId = userId || 'me'; 
    var msglist = []; 

    // see https://developers.google.com/gmail/api/v1/reference/users/messages/list 
    var url = 'https://www.googleapis.com/gmail/v1/users/${userId}/messages' 
    .replace("${userId}", userId) // The user's email address. The special value me can be used to indicate the authenticated user. 
    var headers = { 
    Authorization: 'Bearer ' + ScriptApp.getOAuthToken() 
    }; 
    var request = { 
    'q': query 
    }; 
    var params = { 
    method: "get", 
    contentType: "application/json", 
    headers: headers, 
    muteHttpExceptions: true 
    }; 

    do { 

    // For GET, params must be URI Encoded in URL. 
    var urlPlus = url + "?" + serializeParams(request); 

    //var check = UrlFetchApp.getRequest(urlPlus, params); // for debugging 
    var response = UrlFetchApp.fetch(urlPlus, params); 

    var result = response.getResponseCode(); 
    if (result == '200') { // OK 
     var resp = JSON.parse(response.getContentText()); 
     msglist = msglist.concat(resp.messages); 
     request.pageToken = resp.nextPageToken; 
    } else { 
     // This is only needed when muteHttpExceptions == true 
     var err = JSON.parse(response.getContentText()); 
     throw new Error('Error (' + result + ") " + err.error.message); 
    } 

    } while (resp.nextPageToken); 

    return msglist; 
} 


// From http://stackoverflow.com/a/23639793 
function serializeParams(obj) { 
    var str = Object.keys(obj).map(function(key) { 
    return key + '=' + obj[key]; 
    }).join('&'); 
    return encodeURIComponent(str); 
} 

所以,你的删除功能变得像这样:

function deleteOldMessages(ageInDays) { 
    if (!ageInDays || typeof ageInDays !== "number") 
    throw new TypeError("Expecting number"); 

    // Build query and get all matching messages 
    var query = "older_than:{$age}d".replace("{$age}",ageInDays); 
    var messages = listMessages(query); 

    for (var i=0; i<messages.length; i++) { 
    GmailApp.getMessageById(messages[i].id).moveToTrash(); 
    } 
} 
+0

技术上比我的答案好得多,但没有解决线程保真度的A/B问题与准确的规则观察 – Jonathon

+0

@Jonathon - whachutalkinaboutwillis? (我感受到一个学习的机会......) – Mogsdad

+0

这意味着它是正确的解决方案,即他们要求的方法是要求一种方法来删除特定年龄段的所有消息。所以上面的答案显示了如何做到这一点。 “为什么你想要这样做?”的未经质询的问题?可能表明,即使完整和正确,所寻求的技术解决方案也可能无法解决实际问题。我怀疑删除所有消息超过一天的标准可能不是一个很好的解决方案,我猜测OP的问题。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem Jonathon

0

对于邮件的批量处理,最好使用完整又名“高级”的Gmail API。请确保首先在“资源 - >高级Google服务”下启用此功能。

// set MAX_RUNS according to 6min script execution limit 
var MAX_RUNS=1; 
var MAX_RESULTS = 10; 
function ScanMessages() { 
    var messageList = {'nextPageToken' : null}; 
    for(var i = 0; i < MAX_RUNS; i++){ 
    var options = { 
     maxResults: MAX_RESULTS, 
     // set this to your desired date range 
     q: 'before after:2015/12/25 before:2016/1/1' 
    }; 
    // init nextPageToken 
    if(messageList.nextPageToken != null){ 
     options.pageToken = messageList.nextPageToken; 
    } 
    // Use the "advanced" Gmail API to get messages directly. 
    messageList = Gmail.Users.Messages.list('[email protected]', options); 
    if(messageList.messages == undefined || messageList.messages.length < 1){ 
    continue; 
    } 
    for(var j = 0; j < messageList.messages.length; j++){ 
     var curMessage = GmailApp.getMessageById(messageList.messages[j].id); 
     //curMessage.moveToTrash(); 
     Logger.log("deleting message: " + JSON.stringify({subject: curMessage.getSubject(), date: curMessage.getDate()})); 
    } 
    } 
} 
相关问题