Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
PurgeOldEmails

PurgeOldEmails

A Google Apps Script script to automatically delete unarchived mail after 7 days that hasn't been starred or marked as important

Quick Start

  1. Backup your emails using Google Takeout.
  2. Load this script into a new Google Apps Script project.
  3. Execute the setPurgeTrigger() function to set a trigger that will call the purge() function every day.

A detailed blog post with more information can be found at https://benbjurstrom.com/purge-email

Acknowledgements

Thanks to this gist by jamesramsay for getting me started in the right direction.

/*
|--------------------------------------------------------------------------
| PurgeOldEmails
|--------------------------------------------------------------------------
| https://gist.github.com/benbjurstrom/00cdfdb24e39c59c124e812d5effa39a
|
*/
// Purge messages automatically after how many days?
var DELETE_AFTER_DAYS = 7
// Maximum number of message threads to process per run.
var PAGE_SIZE = 150
/**
* Create a trigger that executes the purge function every day.
* Execute this function to install the script.
*/
function setPurgeTrigger() {
ScriptApp
.newTrigger('purge')
.timeBased()
.everyDays(1)
.create()
}
/**
* Create a trigger that executes the purgeMore function two minutes from now
*/
function setPurgeMoreTrigger(){
ScriptApp.newTrigger('purgeMore')
.timeBased()
.at(new Date((new Date()).getTime() + 1000 * 60 * 2))
.create()
}
/**
* Deletes all triggers that call the purgeMore function.
*/
function removePurgeMoreTriggers(){
var triggers = ScriptApp.getProjectTriggers()
for (var i = 0; i < triggers.length; i++) {
var trigger = triggers[i]
if(trigger.getHandlerFunction() === 'purgeMore'){
ScriptApp.deleteTrigger(trigger)
}
}
}
/**
* Deletes all of the project's triggers
* Execute this function to unintstall the script.
*/
function removeAllTriggers() {
var triggers = ScriptApp.getProjectTriggers()
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i])
}
}
/**
* Wrapper for the purge function
*/
function purgeMore() {
purge()
}
/**
* Deletes any emails from the inbox that are more then 7 days old
* and not starred or marked as important.
*/
function purge() {
removePurgeMoreTriggers()
var search = 'in:inbox -in:starred -in:important older_than:' + DELETE_AFTER_DAYS + 'd'
var threads = GmailApp.search(search, 0, PAGE_SIZE)
if (threads.length === PAGE_SIZE) {
console.log('PAGE_SIZE exceeded. Setting a trigger to call the purgeMore function in 2 minutes.')
setPurgeMoreTrigger()
}
console.log('Processing ' + threads.length + ' threads...')
var cutoff = new Date()
cutoff.setDate(cutoff.getDate() - DELETE_AFTER_DAYS)
// For each thread matching our search
for (var i = 0; i < threads.length; i++) {
var thread = threads[i]
// Only delete if the newest message in the thread is older then DELETE_AFTER_DAYS
if (thread.getLastMessageDate() < cutoff) {
thread.moveToTrash();
}
}
}
@Beginneronhunt

This comment has been minimized.

Copy link

@Beginneronhunt Beginneronhunt commented May 3, 2020

Thanks for sharing this code and really like your video on Youtube.
Kindly share some tips and video for learning Automation testing.

@mohmdshbbr

This comment has been minimized.

Copy link

@mohmdshbbr mohmdshbbr commented Oct 15, 2020

Hi,
My code is running only twice and doesn't trigger again after 2 mins. May I know what can be done?

Thank you.

chrome_4NjUtKWpfI

@sat2493

This comment has been minimized.

Copy link

@sat2493 sat2493 commented Oct 26, 2020

Thank you for sharing this code! :)

@blackstatic42

This comment has been minimized.

Copy link

@blackstatic42 blackstatic42 commented May 28, 2021

Is their somehow to make it skip by labeled messages as well? Any insight would be greatly appreciated.

@aaronsomek

This comment has been minimized.

Copy link

@aaronsomek aaronsomek commented Jun 17, 2021

I noticed that the script was picking up important and starred emails. Perhaps Gmail has updated their label parameters.
In line 76 I changed in:inbox -in:starred -in:important to -in:sent -is:starred -is:important
This searches ALL my mail - even archived, and doesn't grab any starred or important threads.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment