I’ll admit it. I got caught up in the MailboxApp fever and watched the little counter until I could get my hands on the app. Then I did and realized I didn’t particularly care for the interface or for giving up credentials to yet another service (though I do have 2 factor authentication setup). I like the Gmail interface. I think it’s done well. And I want control. So I asked that question that every engineer asks: “How can I do this better?”. Naturally the answer was smacking me in the face. Maybe a year ago I came across a Gmail snooze script, but didn’t really take the time to understand it or tweak it to my needs. This time was different.
Below you’ll find the setup instructions that will give you MailboxApp like functionality in something you completely control and that you can use from any email client. Just attach labels or move your messages to the any of the snooze labels and let the script do the rest. Personally, I’m using the script with a Dispatch “quick action” to easily triage my inbox.
See the “Setup” instructions in the comment block at the top of the code or refer to the images below…
Paste the code from below into the script
To use the functionality provided by the script just move any email to one of the snooze labels. For example, Move to –> _Z/Tonight to have the email reappear at the time you selected (default: 5pm). These are the suggested options to use, but there are more specific labels you can use for tighter control:
- _Z/Later
- _Z/Midnight
- _Z/Noon
- _Z/Tonight
- _Z/Tomorrow
- _Z/This Weekend
- _Z/Next Week
- _Z/Next Month
I hope you like it!
/*
* Author: Mark Jacobsen (http://mjg2.net/code)
*
* This is a massively modified and more powerful GMail snooze script that mirrors much of the functionality of
* the iPhone "Mailbox" app with the added benefit of not having to hand over your credentials, and being able to
* use from any mail client (web, Android, iPhone, etc). If you like it or have suggestions, please drop me a line
* from my blog at http://mjg2.net/code
*
* Setup:
* 1) Fill in the values below (or just use the defaults)
* 2) Run the "setup()" function using the method drop down and run arrow
* 3) Set time based triggers for:
* moveDailySnoozes() - Daily between Midnight to 1 am
* moveHourlySnoozes() - Every 5 minutes
*
* Changes:
* 2013-05-06 markjacobsen.net Fixed getLabelForHour to correctly handle am/pm thanks to "benlarge"
* 2014-02-23 markjacobsen.net Fixed moveDailySnoozes to correctly handle the current DOW thanks to "Jeff Hirsch"
* 2014-03-24 markjacobsen.net Added additional parseInt()s to moveHourlySnoozes
*/
// =============================================================================
// Set these values according to your needs
// =============================================================================
var TIMEZONE = "America/Detroit"; // Your timezone
var TONIGHT_HOUR = 17; // Hour (on a 24 hour clock. ex: 17=5pm) representing when something snoozed until "Tonight" should reappear
var HOURS_UNTIL_LATER = 3; // Number of hours when something snoozed until "Later" should appear
var REAPPEAR_LABEL = "_Action"; // Full label path to apply when a message reappears in the inbox (leave blank "" to not set a label)
var REAPPEAR_UNREAD = true; // Decide if you want to mark a thread as unread when it reappears in the inbox
// ==========================================================================================
// I wouldn't recommend changing these values but it shouldn't hurt anything if done right :)
// ==========================================================================================
var LABEL_BASE = "_Z"; // The label to create all snooze labels under (it's suggested that you don't change this)
var LABEL_BASE_DOW = LABEL_BASE + "/zDay";
var LABEL_BASE_MO = LABEL_BASE + "/zMonth";
var LABEL_BASE_TOD = LABEL_BASE + "/zTime";
// =============================================================================
// =============================================================================
// Do NOT change anything below here
// =============================================================================
// =============================================================================
var LABEL_LATER = LABEL_BASE + "/Later";
var LABEL_MIDNIGHT = LABEL_BASE + "/Midnight";
var LABEL_NOON = LABEL_BASE + "/Noon";
var LABEL_TONIGHT = LABEL_BASE + "/Tonight";
var LABEL_TOMORROW = LABEL_BASE + "/Tomorrow";
var LABEL_THIS_WEEKEND = LABEL_BASE + "/This Weekend";
var LABEL_NEXT_WEEK = LABEL_BASE + "/Next Week";
var LABEL_NEXT_MONTH = LABEL_BASE + "/Next Month";
function setup() {
GmailApp.createLabel(LABEL_BASE);
GmailApp.createLabel(LABEL_BASE_DOW);
GmailApp.createLabel(LABEL_BASE_MO);
GmailApp.createLabel(LABEL_BASE_TOD);
GmailApp.createLabel(LABEL_NEXT_WEEK);
GmailApp.createLabel(LABEL_NEXT_MONTH);
GmailApp.createLabel(LABEL_LATER);
GmailApp.createLabel(LABEL_MIDNIGHT);
GmailApp.createLabel(LABEL_NOON);
GmailApp.createLabel(LABEL_TONIGHT);
GmailApp.createLabel(LABEL_TOMORROW);
GmailApp.createLabel(LABEL_THIS_WEEKEND);
GmailApp.createLabel(getLabelForDayOfWeek("Sunday"));
GmailApp.createLabel(getLabelForDayOfWeek("Monday"));
GmailApp.createLabel(getLabelForDayOfWeek("Tuesday"));
GmailApp.createLabel(getLabelForDayOfWeek("Wednesday"));
GmailApp.createLabel(getLabelForDayOfWeek("Thursday"));
GmailApp.createLabel(getLabelForDayOfWeek("Friday"));
GmailApp.createLabel(getLabelForDayOfWeek("Saturday"));
// Time of day Labels
for (var i = 0; i <= 23; ++i) {
GmailApp.createLabel(getLabelForHour(i));
}
// Month Labels
for (var i = 0; i <= 11; ++i) {
GmailApp.createLabel(getLabelForMonth(i));
}
}
function test(){
Logger.log(getLabelForHour(0));
Logger.log(getLabelForHour(12));
Logger.log(getLabelForHour(13));
Logger.log(getLabelForHour(23));
}
function getLabelForHour(hr){
var ampm = "am";
if (hr > 12)
{
hr -= 12;
ampm = "pm";
}
else if (hr == 12)
{
ampm = "pm";
}
else if (hr == 0)
{
hr = 12;
ampm = "am";
}
return LABEL_BASE_TOD + "/" + parseInt(hr) + ampm;
}
function getLabelForMonth(mo){
var tmp;
if (mo == -1){
tmp = new Date();
}else{
tmp = new Date(2000, mo, 1);
}
return LABEL_BASE_MO + "/" + Utilities.formatDate(tmp, TIMEZONE, "MMMMM");
}
function getLabelForDayOfWeek(dow){
return LABEL_BASE_DOW + "/" + dow;
}
function moveDailySnoozes() {
var dow, dom, mo;
// Move anything that was snoozed until tomorrow
moveSnoozesToInbox(LABEL_TOMORROW);
dow = Utilities.formatDate(new Date(), TIMEZONE, "EEEE");
dom = Utilities.formatDate(new Date(), TIMEZONE, "d");
// Move anything that was snoozed until this DOW
moveSnoozesToInbox(getLabelForDayOfWeek(dow));
if ((dow == "Sunday") || (dow == "Saturday")){
// If something was snoozed until this weekend, that should be moved too
moveSnoozesToInbox(LABEL_THIS_WEEKEND);
}
// Move anything for "next week" to the DOW it should come off snooze (i.e. the current DOW).
// This works and doesn't move the messages pre-maturely because we moved
// msgs for the DOW, prior to this and this functions should only fire
// once a day
moveSnoozes(LABEL_NEXT_WEEK, getLabelForDayOfWeek(dow));
if (dom == 1){
// Move anything snoozed until "next month" or
// specifically for the current month on the 1st day
// of a new month
moveSnoozesToInbox(getLabelForMonth(-1));
moveSnoozesToInbox(LABEL_NEXT_MONTH);
}
}
function moveHourlySnoozes() {
var curHour, curHourLabel, hourForLater, curDateTime;
curHour = Utilities.formatDate(new Date(), TIMEZONE, "H");
curHourLabel = getLabelForHour(curHour);
moveSnoozes(LABEL_NOON, getLabelForHour(12));
moveSnoozes(LABEL_MIDNIGHT, getLabelForHour(0));
if (parseInt(curHour) == parseInt(TONIGHT_HOUR)){
moveSnoozesToInbox(LABEL_TONIGHT);
}
moveSnoozesToInbox(curHourLabel);
hourForLater = parseInt(parseInt(curHour) + HOURS_UNTIL_LATER);
if (hourForLater >= 24){
hourForLater = parseInt(hourForLater - 24);
}
moveSnoozes(LABEL_LATER, getLabelForHour(hourForLater));
}
function moveSnoozesToInbox(oldLabelName) {
var oldLabel, page, reappearLabel;
oldLabel = GmailApp.getUserLabelByName(oldLabelName);
page = null;
// Get threads in "pages" of 100 at a time
while(!page || page.length == 100) {
page = oldLabel.getThreads(0, 100);
if (page.length > 0) {
GmailApp.moveThreadsToInbox(page);
oldLabel.removeFromThreads(page);
if (REAPPEAR_LABEL != ""){
reappearLabel = GmailApp.getUserLabelByName(REAPPEAR_LABEL);
reappearLabel.addToThreads(page);
}
if (REAPPEAR_UNREAD == true){
GmailApp.markThreadsUnread(page);
}
}
}
}
function moveSnoozes(oldLabelName, newLabelName) {
var oldLabel, newLabel, page;
oldLabel = GmailApp.getUserLabelByName(oldLabelName);
newLabel = GmailApp.getUserLabelByName(newLabelName);
page = null;
// Get threads in "pages" of 100 at a time
while(!page || page.length == 100) {
page = oldLabel.getThreads(0, 100);
if (page.length > 0) {
newLabel.addToThreads(page);
oldLabel.removeFromThreads(page);
}
}
}
Please remember to subscribe to the newsletter to stay up to date!You or someone you know looking to buy or sell?
Disclaimer: Thoughts and opinions are my own, and do not reflect the views of any employer, family member, friend, or anyone else. Some links may be affiliate links, but I don't link to anything I don't use myself. You would think this should be self evident these days, but apparently not...