2015-06-24 37 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()})); 
    } 
    } 
} 
相關問題