Okay, we are definitely onto something here. I ran the script with all the colors set to true (I will paste in the script I ran below). Out of 1062 messages in Junk, there were 325 left. A bunch moved to Trash, though they were still marked unread. There were still some emails marked by SpamSieve in the Junk mailbox.
A bunch also moved to my inbox, because either they weren’t spam (I needed to unsubscribe from a bunch of things) or they weren’t identified as such by SpamSieve (I identified a bunch). I did the above for a few days.
I ran the script again today, and out of 455 emails in the Junk folder, 265 were moved to trash. However, of the 190 left in Junk, at least half of them were marked with color bars by SpamSieve and so should have been moved to trash. Running the script again did not move any more messages.
So a few questions:
(1) What should I change in the script to mark the messages moved to Trash as read? Right now it is kind of useful to see which ones are unread, as those are probably the ones moved by the script. But once everything is working, I will want to have those marked as read.
(2) What is up with the emails marked by SpamSieve with color bars, in the Junk folder, that don’t move? I can’t figure out anything different about them. They are all gray and blue, but most junk messages are. The dates are from March 30 to April 10. All of the untagged junk is since then.
(3) I have both marked and unmarked junk from the same email: infona@namr.motorolasolutions.com (22 messages). The unmarked junk is later, so I am not sure why that is happening. I also have a million (161 messages) from info.nnn@nnnnn.savethekoala.com. The "n"s are numbers, so these aren’t identical, but it seems like anything from savethekoala.com should be marked.
(4) Similar to (3): I have 17 messages that have the name listed as “Sex Secrets”, some from motorola and some from koala. Marked and unmarked. Shouldn’t they all be marked by now? Is there a black list? I am confident I will never need an email from Sex Secrets.
Here is the script. All I did was change all the colors to true:
– Apple Mail - Rescue Good Messages
– Apple Mail - Rescue Good Messages - SpamSieve AppleScripts
– Summary: Automatically filter messages caught by server junk filters, moving the good messages to the inbox.
– Requires: SpamSieve, Apple Mail
– Install Location: ~/Library/Application Scripts/com.apple.mail
– Last Modified: 2022-12-29
property pMarkSpamMessagesRead : false
property pMarkGoodMessagesRead : false
property pChangeJunkStatus : true
property pColorSpamMessages : true
property pFlagSpamMessages : false
property pUnflagSpamMessages : false
property pMoveBlueMessagesToTrash : true
property pMoveGrayMessagesToTrash : true
property pMovePurpleMessagesToTrash : true
property pMoveRedMessagesToTrash : true
property pMoveOrangeMessagesToTrash : true
property pMoveYellowMessagesToTrash : true
property pEnableDebugLogging : false
on run
– This is executed when you run the script directly.
my filterServerJunkMailboxes()
end run
on idle
– This is executed periodically when the script is run as a stay-open application.
my filterServerJunkMailboxes()
return 60 * 5 – Run again in 5 minutes.
end idle
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()
if application “Mail” is not running then return
try
tell application “Mail” to get version
on error _error number _errorNumber
if _errorNumber is -1743 then – errAEEventNotPermitted
set _alertMessage to "You can give “Apple Mail - Rescue Good Messages” access to control Mail and SpamSieve from System Preferences > Security & Privacy > Privacy > Automation. For more information, please see:
SpamSieve Manual: Security & Privacy Access"
display alert _error message _alertMessage
end if
end try
tell application “Mail”
try
set _mailboxes to mailboxes of junk mailbox
repeat with _mailbox in _mailboxes
try
my filterMailbox(_mailbox)
on error _error number _errorNumber
my logToConsole(“Error " & _errorNumber & " filtering mailbox “” & _mailbox’s name & “” of account “” & _mailbox’s account’s name & "”: " & _error)
end try
end repeat
on error _error
my logToConsole("Error filtering junk mailboxes: " & _error)
end try
end tell
end filterServerJunkMailboxes
on filterMailbox(_mailbox)
tell application “Mail”
my debugLog(my makeLogMessage(“Start checking mailbox”, _mailbox, “”))
set _total to count of messages of _mailbox
my debugLog(my makeLogMessage(“Total messages in mailbox”, _mailbox, _total))
my debugLog(my makeLogMessage(“Getting unprocessed messages in mailbox”, _mailbox, “”))
with timeout of 3 * 60 seconds
set _messages to messages of _mailbox whose read status is false and deleted status is false and background color is none
end timeout
my debugLog(my makeLogMessage(“Messages to process in mailbox”, _mailbox, count of _messages))
repeat with _message in _messages
if not my processMessageIfSpam(_message) then
if pMarkGoodMessagesRead then set _message’s read status to true
my debugLog("Moving message to inbox: " & _message’s subject)
move _message to inbox
end if
end repeat
my debugLog(my makeLogMessage(“Finished checking mailbox”, _mailbox, “”))
end tell
end filterMailbox
on processMessageIfSpam(_message)
set _source to my sourceFromMessage(_message)
tell application “SpamSieve”
set _score to score message _source without auto training
end tell
tell application “Mail”
my debugLog("Spam score of message is " & _score & ": " & _message’s subject)
set _isSpam to _score ≥ 50
if pChangeJunkStatus then
set _message’s junk mail status to _isSpam
end if
if _isSpam and pMarkSpamMessagesRead then
set _message’s read status to true
end if
set _moveToTrash to my colorMessageAndDecideIfShouldMoveToTrash(_message, _score)
if _moveToTrash then
delete _message
else if _isSpam then
my debugLog("Leaving spam message in Junk: " & _message’s subject)
end if
return _isSpam
end tell
end processMessageIfSpam
on colorMessageAndDecideIfShouldMoveToTrash(_message, _score)
tell application “Mail”
set _table to {¬
{99, blue, pMoveBlueMessagesToTrash, 6}, ¬
{95, gray, pMoveGrayMessagesToTrash, 5}, ¬
{88, purple, pMovePurpleMessagesToTrash, 4}, ¬
{81, red, pMoveRedMessagesToTrash, 3}, ¬
{75, orange, pMoveOrangeMessagesToTrash, 2}, ¬
{50, yellow, pMoveYellowMessagesToTrash, 1}, ¬
{0, none, false, -1}}
– Flag colors chosen so that messages sort by spamminess: gray, purple, blue, green, yellow, orange, none
repeat with _row in _table
set {_threshold, _color, _moveToTrash, _flagColor} to _row
if _score ≥ _threshold then
if pColorSpamMessages then
set _message’s background color to _color
end if
if pUnflagSpamMessages then
set _message’s flag index to -1
end if
if pFlagSpamMessages then
set _message’s flag index to _flagColor
end if
return _moveToTrash
end if
end repeat
end tell
end colorMessageAndDecideIfShouldMoveToTrash
– Logging
on debugLog(_message)
if pEnableDebugLogging then my logToConsole(_message)
end debugLog
on logToConsole(_message)
set _logMessage to "SpamSieve [Apple Mail Rescue Good Messages] " & _message
do shell script "/usr/bin/logger -s " & _logMessage’s quoted form
end logToConsole
on makeLogMessage(_action, _mailbox, _detail)
return _action & " " & my describeMailbox(_mailbox) & ": " & _detail
end makeLogMessage
on describeMailbox(_mailbox)
tell application “Mail”
set _mailboxName to _mailbox’s name
try
set _accountName to name of _mailbox’s account
on error
set _accountName to “On My Mac”
end try
return ““” & _accountName & “” / “” & _mailboxName & “””
end tell
end describeMailbox
– Logging Helpers
on sourceFromMessage(_message)
tell application “Mail”
my debugLog(my makeLogMessage(“Getting source of message in”, _message’s mailbox, _message’s subject))
return _message’s source
end tell
end sourceFromMessage