我已經創建了一個腳本,可以刪除400天以上(大約13個月)的郵件。我搜索了可用的GS幫助,找不到一個獲取「All Mail」文件夾句柄的方法,這是我想要從中刪除郵件的地方。有沒有辦法做到這一點,我沒有看到?需要處理「全部郵件」文件夾以刪除舊郵件
回答
感謝您的信息。能夠建立一個完全符合我想要的功能。
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);
}
執行搜索。它的工作方式與GMail UI相同。
var threads = GmailApp.search('older_than:400d … plus whatever other criteria you want');
它會給出與GMail相同的結果,即使用All Mail作爲搜索存儲庫。
如果你想找到尚未提交到任何標籤,那麼廣告'has:nouserlabels'
作爲一個標準的郵件,但要注意線程是調皮的傢伙特別是當過濾器已經自動標記收到的消息在對話中沒有標籤等
如果此調用可能返回大量結果,則可能需要分頁。
更新 遍歷結果檢查每個線程的最後一條消息退換也符合使用.getLastMessageDate()
在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();
}
}
技術上比我的答案好得多,但沒有解決線程保真度的A/B問題與準確的規則觀察 – Jonathon
@Jonathon - whachutalkinaboutwillis? (我感受到一個學習的機會......) – Mogsdad
這意味着它是正確的解決方案,即他們要求的方法是要求一種方法來刪除特定年齡段的所有消息。所以上面的答案顯示瞭如何做到這一點。 「爲什麼你想要這樣做?」的未經質詢的問題?可能表明,即使完整和正確,所尋求的技術解決方案也可能無法解決實際問題。我懷疑刪除所有消息超過一天的標準可能不是一個很好的解決方案,我猜測OP的問題。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
對於郵件的批量處理,最好使用完整又名「高級」的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()}));
}
}
}
- 1. 需要從Thunderbird導出的.eml文件中去除舊郵件。
- 2. 批處理文件刪除文件夾
- 3. MailItem.Delete拒絕刪除已刪除郵件文件夾中的郵件
- 4. 批處理文件以刪除文件和文件夾
- 5. 爲什麼芹菜不會處理郵件並刪除郵件?
- 6. 刪除批處理文件夾中的文件和文件夾
- 7. 批處理腳本刪除給定文件夾中最舊的文件夾
- 8. 從新郵件中刪除從舊郵件複製的簽名
- 9. 郵編 - 添加文件和較新的文件夾,刪除舊的
- 10. 批處理文件,刪除文件和文件夾,除了
- 11. 刪除不需要的頭從電子郵件(安全風險)
- 12. ActiveMQ JMS主題 - 刪除舊郵件
- 13. elasticsearch ttl force刪除舊郵件
- 14. 郵件中垃圾郵件文件夾
- 15. MPDF刪除不需要的文件夾
- 16. 需要幫助處理子文件夾
- 17. 通過IMAP從Gmail「所有郵件」文件夾中刪除郵件
- 18. 幫助刪除收件箱文件夾中的郵件
- 19. CRM 2013郵箱刪除電子郵件同步處理
- 20. 批處理文件需要根據文件夾名稱刪除文件夾的子集
- 21. 批處理文件刪除文件夾中的文件
- 22. 需要將郵件發送到Extrnal郵件ID,而沒有內部郵件ID
- 23. Microsoft Graph - 已刪除郵件文件夾中的已刪除事件
- 24. 刪除郵件JSQMessagesViewController
- 25. imap刪除郵件
- 26. 需要電子郵件下載文件
- 27. 批處理刪除文件夾+子文件夾中除文件類型以外的所有文件
- 28. PowerShell的 - 刪除舊文件夾,而不是舊的文件
- 29. 我需要使用批處理文件刪除符合所有子文件夾條件的文件
- 30. 從發送郵件郵件隊列中刪除郵件
我認爲你可以使用'getUserLabelByName()'[谷歌文檔(https://developers.google.com/apps-script/reference/gmail/gmail-app#getUserLabelByName(字符串))的Gmail沒有按't叫一個文件夾的文件夾,這是一個「標籤」 –
@SandyGood - 「所有消息」不是「用戶標籤」,所以它不能以這種方式訪問。但是,標籤和文件夾之間非常重要的區別! – Mogsdad
自從昨天以來,我一直在試圖解決這個問題,並且「很輕易的」意識到該函數中的關鍵詞是USER。我還發現,除「所有郵件」和「已發送郵件」之外,所有Google標籤均可訪問有垃圾郵件和垃圾郵件的GET功能。去數字,你可以得到你不想要的東西(並在30天內被刪除),並不能得到你想要的東西。 –