Deleting old spam messages with AppleScript | Dafacto
Dafacto

The personal website of Matt Henderson.

Deleting old spam messages with AppleScript

22 August 2012

Recently, I blogged about setting up my own “server-side” spam filtering system based on a home-based iMac running Mail with SpamSieve. I’m super-happy with the setup, as it’s keeping my inbox spam-free on my MacBook Air, iPhone and iPad.

The only feature I found missing in this setup, with respect to Apple’s own junk mail filter, was the ability to automatically delete old spam messages after a certain number of days.

The SpamSieve manual describes one option for doing this, but it involves renaming your Spam folder, re-enabling Mail’s junk mail feature, and setting some advanced options.

What I really wanted was an AppleScript that I could schedule to run periodically from Keyboard Maestro, that would automatically delete messages in my Spam folder older than 30 days.

Doing some Googling, I found this article at Macworld, that referenced an AppleScript for generally moving messages between folders. I hacked and simplified the script as follows:

  • It cleans only one folder, my Spam folder, rather than a list of folders.
  • It sends a message to Growl, alerting me to the number of messages that were deleted.

I setup a Keyboard Maestro task to run this script each morning at 6:00 am, and it’s working great!

In case you’re interested, here’s the AppleScript. (And for the record, I know very little about AppleScript, so I’ll update this code as soon as the wizards out there point out the problems/improvements that surely exist.)

set DestinFolderName to "" -- mailbox to move messages to. If you want to just delete them, leave it blank.
set StaleTime to 30 -- days old the message must be before moved or deleted
set ShowMailboxesProgress to false -- determines if you want the "Processing" box displayed for each mailbox
set CountMessages to 0

tell application "Mail"
	set thisAccount to account "Your IMAP or POP Account Name"
	set accountName to the name of thisAccount
	set mailboxName to the name of mailbox "Spam" in thisAccount
	if ShowMailboxesProgress then
		display dialog "Processing folder " & mailboxName & " in account " & accountName
	end if
	try
		set messages_list to every message of mailbox mailboxName in thisAccount
		set NumItems to number of items in messages_list
  -- display dialog "Number of items" & NumItems
		repeat with i from 1 to number of items in messages_list
			set theMessage to item i of messages_list
			set difference to ((current date) - (date sent of theMessage)) div days
			if difference is greater than StaleTime then
				if DestinFolderName is not equal to "" then
					move theMessage to mailbox DestinFolderName in thisAccount
				else
					delete theMessage
					set CountMessages to CountMessages + 1
				end if

			end if
		end repeat
	end try
	tell application "Growl"
		set the allNotificationsList to {"Cleaned up spam folder"}
		set the enabledNotificationsList to {"Cleaned up spam folder"}
		register as application "Spam Folder Cleanup" all notifications allNotificationsList default notifications enabledNotificationsList icon of application "SpamSieve"
		notify with name "Cleaned up spam folder" title "Cleaned up spam folder" description "I just deleted " & CountMessages & " messages in the Spam folder older than " & StaleTime & " days." application name "Spam Folder Cleanup"
	end tell
  -- display dialog "Finished!"
end tell
quit

Enjoy this article? — You can find similar content via the category and tag links below.

Questions or comments? — Feel free to email me using the contact form below, or reach out on Twitter.