Ok, donc j'ai trouvé une solution en utilisant AppleScript, c'est un script assez gros mais il n'est en fait pas si compliqué que ça ; il boucle simplement à travers les boîtes aux lettres de chaque compte, en sautant tout ce qui est spécifié dans une liste, et cherche les messages lus, non supprimés, plus vieux que le nombre de jours spécifié.
on run arguments
# Don't run if Mail isn't open
if application "Mail" is not running then return
set defaultExpiryDays to 45
set dryRun to true
# Standard deleted message mailboxes, used to relocate mail when "deleted"
set trashMailboxes to {"bin", "trash", "deleted messages", "deleted items"}
# These mailboxes will be ignored (messages won't be processed)
set ignoreTheseMailboxes to trashMailboxes & {"all mail", "archive", "archived", "drafts", "junk", "junk e-mail", "sent", "sent items", "sent messages", "spam"}
set numberOfArguments to number of items in arguments
if numberOfArguments is greater than 0 then
set expiryDate to item 1 of arguments
if number of arguments is greater than 1 then
set ignoreTheseMailboxes to ignoreTheseMailboxes & rest of arguments
end if
else
set expiryDate to defaultExpiryDays
end if
set expiryDate to (current date) - (expiryDate * days)
set countdown to 10
repeat while countdown is greater than 0
try
return processMail(expiryDate, ignoreTheseMailboxes, trashMailboxes, dryRun)
on error number -1712
set countdown to countdown - 1
end try
end repeat
return "Communication with Mail timed out"
end run
on processMail(expiryDate, ignoreTheseMailboxes, trashMailboxes, dryRun)
set messagesDeleted to 0
set messagesMoved to 0
set results to {}
set newline to "
"
tell application "Mail"
set theAccounts to every account
repeat with eachAccount in theAccounts
set accountName to name of eachAccount
set accountNameWritten to false
set accountTrashMailbox to false
set theMailboxes to every mailbox of eachAccount
repeat with eachMailbox in theMailboxes
set mailboxName to name of eachMailbox
set mailboxNameWritten to false
if ignoreTheseMailboxes does not contain mailboxName then
set theMessages to (every message of eachMailbox whose (deleted status is false) and (read status is true) and (date received is less than or equal to expiryDate))
set mailboxResults to {}
repeat with eachMessage in theMessages
try
if accountNameWritten is false then
set the end of mailboxResults to accountName
set accountNameWritten to true
end if
if mailboxNameWritten is false then
set the end of mailboxResults to " " & mailboxName
set mailboxNameWritten to true
end if
# Find this account's trash mailbox (if we haven't already)
if accountTrashMailbox is false then
repeat with mailboxName in trashMailboxes
set foundMailboxes to (every mailbox in eachAccount whose name is mailboxName)
if number of items in foundMailboxes is greater than 0 then
set accountTrashMailbox to first item of foundMailboxes
exit repeat
end if
end repeat
if accountTrashMailbox is false then set accountTrashMailbox to missing value
end if
if accountTrashMailbox is not missing value then
set the end of mailboxResults to " Moved: " & (subject of eachMessage)
if not dryRun then move eachMessage to accountTrashMailbox
set messagesMoved to messagesMoved + 1
else
set the end of mailboxResults to " Deleted: " & (subject of eachMessage)
if not dryRun then delete eachMessage
set messagesDeleted to messagesDeleted + 1
end if
end try
end repeat
if number of items in mailboxResults is greater than 0 then
set AppleScript's text item delimiters to newline
set end of results to mailboxResults as rich text
end if
end if
end repeat
end repeat
end tell
set messagesMatches to messagesDeleted + messagesMoved
if messagesMatches is greater than 0 then
set statistics to {}
set AppleScript's text item delimiters to ""
if messagesDeleted is greater than 0 then
set the end of statistics to (messagesDeleted & " message(s) deleted") as text
end if
if messagesMoved is greater than 0 then
set the end of statistics to (messagesMoved & " message(s) moved") as text
end if
set AppleScript's text item delimiters to ", "
set the end of results to (statistics as text)
else
set the end of results to "No messages were deleted."
end if
set AppleScript's text item delimiters to newline
return results as text
end processMail
Le script supprime les messages en localisant le dossier poubelle d'un compte (s'il en a un) et en les déplaçant, ce qui est un processus très lent s'il a beaucoup d'e-mails à déplacer au départ, cependant il évite d'avoir à rescanner. Il n'utilisera l'option de suppression régulière que s'il ne peut pas déterminer le dossier de la corbeille (c'est-à-dire s'il n'en a pas trouvé un à partir des noms dans trashMailboxes), bien que cela soit plus rapide, il peut en résulter un retraitement des messages si le script est exécuté fréquemment (par exemple, quotidiennement).
Pour configurer les paramètres du script, vous pouvez modifier defaultExpiryDays
au nombre de jours d'e-mails à conserver, tout ce qui est plus ancien et lu est supprimé. Le site dryRun
est réglé initialement sur true
ce qui signifie que le script signalera les correspondances mais ne supprimera ou ne déplacera rien. Une fois que vous êtes satisfait que le script corresponde aux e-mails que vous attendez, vous pouvez définir ceci false
.
Le site trashMailboxes
liste les noms de boîtes aux lettres vers lesquelles le script déplacera les e-mails s'il les trouve pour un compte. Le site ignoreTheseMailboxes
La liste contient les boîtes aux lettres qui ne doivent pas être traitées, et couvre les plus courantes, y compris les dossiers que les comportements normaux des boîtes aux lettres de Mail devraient déjà couvrir.
Le script peut être exécuté par tout ce qui peut déclencher un AppleScript, comme iCal, auquel cas il utilisera ses valeurs par défaut. Il peut également être déclenché via un shell script ou launchd
en utilisant une commande telle que osascript /path/to/script.scpt
qui utilisera également les valeurs par défaut, ou vous pouvez spécifier des arguments supplémentaires, auquel cas le premier est le nombre de jours à conserver, et tous les autres arguments sont des boîtes aux lettres supplémentaires à ignorer, par exemple osascript /path/to/script.scpt 14 foo bar
conservera les deux dernières semaines d'e-mails lus, et ignorera toutes les boîtes aux lettres nommées "foo" ou "bar" en plus des valeurs par défaut.
Si vous voulez automatiser le processus avec launchd
alors vous pouvez créer un fichier sous ~/Library/LaunchAgents
avec l'extension .plist
et des contenus tels que :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.example.Mail.Clean</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>~/path/to/script.scpt</string>
<string>45</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>15</integer>
<key>Hour</key>
<integer>13</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
</dict>
</plist>
Qui conservera 45 jours d'e-mails, et fonctionnera tous les dimanches à 13h15 (n'oubliez pas de définir le chemin de votre script dans les arguments du programme !)
Une fois sauvegardé, l'agent de lancement se chargera lors de votre prochain arrêt/redémarrage, ou vous pouvez exécuter launchctl load ~/Library/LaunchAgents/agent.plist
avec le nom correct pour votre fichier plist.