var WORK_EMAIL = 'martin.ruiz@wellsfargo.com'; var WORK_LABEL = 'Fwd To Work'; var MAILBOX = '[Mailbox]'; var ARCHIVE_PREFIX = '>'; var MAILBOX_ARCHIVE_REGEX = new RegExp('^\\[Mailbox\\]/' + ARCHIVE_PREFIX); var MAILBOX_REGEX = new RegExp(/^\[Mailbox\]\/\>/); var TODO_LABEL = 'Todo'; var TODO_EMAIL = 'me@wunderlist.com'; var MESSAGE_URL_BASE = 'https://mail.google.com/mail/u/0/#all/'; var SPAM_LABEL = 'Spam'; /** * A simple wrapper for GmailApp API so I can minimize the * number of API calls and keep it below the service limit. * 10,000 calls is the limit. Using this wrapper I cache * the results and reuse across function calls. * https://developers.google.com/apps-script/class_gmailapp */ var Gmail = (function () { var labels = GmailApp.getUserLabels(); var labelMap = {}; for (var i in labels) { var label = labels[i]; labelMap[label.getName()] = label; } var getLabelByName = function (labelName) { return labelMap[labelName]; }; return { getUserLabels: function () { return labelMap; }, getUserLabelByName: getLabelByName }; })(); /** * Archive, Forwards and markAsSpam are called every minute */ function runMailboxCompanion() { doArchive(); forwardToWork(); sendTodo(); markAsSpam(); } /** * archives messages in [Mailbox]/>labelName to * labelName. It also sets the message as read. * Note that I use '>' to signal which labels to * archive. */ function archiveMessages(labelName) { var label, archiveLabel, page, mailboxLabel; mailboxLabel = MAILBOX + '/' + ARCHIVE_PREFIX + labelName; label = Gmail.getUserLabelByName(mailboxLabel); // create labelName if it doesn't already exist archiveLabel = Gmail.getUserLabelByName(labelName); if (!archiveLabel) { archiveLabel = GmailApp.createLabel(labelName); } page = null; while(!page || page.length == 100) { page = label.getThreads(0, 100); if (page.length > 0) { archiveLabel.addToThreads(page); label.removeFromThreads(page); GmailApp.markThreadsRead(page); } } } function doArchive() { var labelName, labels; labels = Gmail.getUserLabels(); // find and archive all labels in [Mailbox] with '>' prefix for (labelName in labels) { if (MAILBOX_ARCHIVE_REGEX.test(labelName)) { labelName = labelName.replace(MAILBOX_ARCHIVE_REGEX,''); archiveMessages(labelName); } } } /** * forward messages in [Mailbox]/labelName to email 'address' */ function forwardMessage(labelName, address) { var label, threads, message; label = Gmail.getUserLabelByName(MAILBOX + '/' + labelName); threads = label.getThreads(); for (var i in threads) { message = threads[i].getMessages()[0]; message.forward(address); label.removeFromThread(threads[i]); } } /** * I use this to forward emails to work */ function forwardToWork() { forwardMessage(WORK_LABEL, WORK_EMAIL); } /** * I use this to forward my email todo to wunderlist * Task = email.subject, Description = email.url */ function sendTodo() { var label, threads, message, messageURL; label = Gmail.getUserLabelByName(MAILBOX + '/' + TODO_LABEL); threads = label.getThreads(); for (var i in threads) { message = threads[i].getMessages()[0]; messageURL = MESSAGE_URL_BASE + message.getId(); GmailApp.sendEmail(TODO_EMAIL, message.getSubject(), messageURL); label.removeFromThread(threads[i]); } } /** * Move messages in [Mailbox]/Spam to Spam label */ function markAsSpam() { var label, threads, spam; spam = MAILBOX + '/' + SPAM_LABEL; label = Gmail.getUserLabelByName(spam); if (!label) { label = GmailApp.createLabel(spam); } threads = label.getThreads(); for (var i in threads) { threads[i].moveToSpam(); label.removeFromThread(threads[i]); } }