Apple Mail - Server Junk Mailbox

Summary: Automatically applies SpamSieve to unread messages in server Junk mailboxes.
Requires: SpamSieve, Apple Mail
Install Location: ~/Library/Application Scripts/com.apple.mail or ~/Library/Scripts/Applications/Mail/
Last Modified: 2015-01-15

Description

The junk/spam filter on your mail server can cause problems. It is more likely than SpamSieve to mistakenly classify your good messages as spam, yet it rarely catches spam messages that SpamSieve would have missed. Additionally, most people don’t want to deal with two separate spam mailboxes, one for the server junk filter and one for SpamSieve. It’s often best simply to turn off the server junk filter, however some mail servers such as iCloud do not allow this.

This script solves two problems:

  1. It saves you from mistakes that the server junk filter made by moving any messages that it thinks are good back to the inbox.
  2. It consolidates the spam messages from all the accounts into a single spam mailbox (the same one where SpamSieve is already putting your spam).

To install:

  1. Download the script using one of the links below. On OS X 10.8 Mountain Lion or later, the script must be saved in the folder /Users/<username>/Library/Application Scripts/com.apple.mail. This is because Mail is sandboxed and only has access to run scripts in that folder. To access the Library folder, click on the Go menu in the Finder while holding down the Option key.
  2. Open the script in AppleScript Editor and enter your account and junk mailbox names in accountAndServerJunkMailboxNames(). The account name comes from the Description field in the Accounts tab of Mail’s preferences. For example, if you have one account called Account 1 and want to process its Junk mailbox, you would use:

    on accountAndServerJunkMailboxNames()
        return {{"Account 1", {"Junk"}}}
    end accountAndServerJunkMailboxNames

    If you want to process the Junk mailbox of the Personal account and the Junk and Bulk mailboxes of the Work account you would use:

    on accountAndServerJunkMailboxNames()
        return {{"Personal", {"Junk"}}, {"Work", {"Junk", "Bulk"}}}
    end accountAndServerJunkMailboxNames
  3. By default, SpamSieve consolidates the spam in a mailbox called Spam under On My Mac. This configuration is specified using:

    on mainSpamMailboxInfo()
        return {"", "Spam"}
    end mainSpamMailboxInfo

    You can also specify a particular mailbox in one of your accounts. For example, if you had created a SpamSieveSpam mailbox in the Personal account you could specify that using:

    on mainSpamMailboxInfo()
        return {"Personal", "SpamSieveSpam"}
    end mainSpamMailboxInfo
  4. Go to Mail’s Preferences window and create a new rule at the top of the list (above the SpamSieve rule) called Server Junk Mailbox SpamSieve.
  5. The rule conditions should say Every Message.
  6. The rule actions should say Run AppleScript […]apple-mail-server-junk-mailbox.scpt. First, choose Run AppleScript from the pop-up menu; then select the apple-mail-server-junk-mailbox.scpt file (using either the pop-up menu or the Choose… button).

Now, whenever you receive a new message in the inbox, SpamSieve will look in all the server junk mailboxes that you specified and check the unread messages. Any that are spam will be moved to the Spam mailbox. Any that are good will be moved to the inbox.

Installation Instructions · Download in Compiled Format · Download in Text Format

Script

property pMarkSpamMessagesRead : false
property pColorSpamMessages : true

on accountAndServerJunkMailboxNames()
    
return {{"Account 1", {"Junk"}}}
end accountAndServerJunkMailboxNames

on mainSpamMailboxInfo()
    
return {"", "Spam"}
end mainSpamMailboxInfo

-- Do not modify below this line.

on run
    
-- This is executed when you run the script directly.
    
my filterServerJunkMailboxes()
end run

using terms from application "Mail"
    
on perform mail action with messages _messages
        
-- This is executed when Mail runs the rule.
        
my filterServerJunkMailboxes()
    
end perform mail action with messages
end using terms from

on filterServerJunkMailboxes()
    
tell application "Mail"
        
repeat with _pair in my accountAndServerJunkMailboxNames()
            
set {_accountName, _mailboxNames} to _pair
            
set _account to account _accountName
            
repeat with _mailboxName in _mailboxNames
                
my filterAccountMailboxNamed(_account, _mailboxName)
            
end repeat
        
end repeat
    
end tell
end filterServerJunkMailboxes

on filterAccountMailboxNamed(_account, _mailboxName)
    
tell application "Mail"
        
set _mailbox to _account's mailbox _mailboxName
        
set _spamMailbox to my mainSpamMailbox()
        
set _inbox to my inboxFromAccount(_account)
        
set _messages to messages of _mailbox whose read status is false and deleted status is false
        
repeat with _message in _messages
            
if my scoreAndMarkMessage(_message) then
                
set _message's mailbox to _spamMailbox
            
else
                
set _message's mailbox to _inbox
            
end if
        
end repeat
    
end tell
end filterAccountMailboxNamed

on scoreAndMarkMessage(_message)
    
tell application "Mail"
        
set _source to _message's source
    
end tell
    
tell application "SpamSieve"
        
set _score to score message _source
    
end tell
    
tell application "Mail"
        
set _isSpam to _score ≥ 50
        
set _message's junk mail status to _isSpam
        
if _isSpam then
            
if pMarkSpamMessagesRead then
                
set _message's read status to true
            
end if
        
end if
        
if pColorSpamMessages then
            
if _score ≥ 99 then
                
set _message's background color to blue
            
else if _score ≥ 95 then
                
set _message's background color to gray
            
else if _score ≥ 88 then
                
set _message's background color to purple
            
else if _score ≥ 81 then
                
set _message's background color to red
            
else if _score ≥ 75 then
                
set _message's background color to orange
            
else if _score ≥ 50 then
                
set _message's background color to yellow
            
else
                
set _message's background color to none
            
end if
        
end if
        
return _isSpam
    
end tell
end scoreAndMarkMessage

on mainSpamMailbox()
    
set {_accountName, _mailboxName} to my mainSpamMailboxInfo()
    
tell application "Mail"
        
if _accountName is "" then
            
return mailbox _mailboxName
        
else
            
return mailbox _mailboxName of account _accountName
        
end if
    
end tell
end mainSpamMailbox

on inboxFromAccount(_account)
    
tell application "Mail"
        
set _names to {"INBOX", "Inbox", "innboks", "Posteingang", "Boite de reception"}
        
repeat with _name in _names
            
try
                
set _mailbox to mailbox _name of _account
                
return _mailbox
            
end try
        
end repeat
        
return inbox
    
end tell
end inboxFromAccount