我已经创建了一个脚本,可以删除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天内被删除),并不能得到你想要的东西。 –