3 votes

Suppression automatique des messages de OS X Mail

Bon, je sais qu'il s'agit d'une question délicate, car il semble que Mail sous OS X n'ait pas la capacité de supprimer ou d'archiver automatiquement les anciens messages, même s'il dispose des règles nécessaires basées sur la date pour le faire.

C'est pourquoi j'utilise actuellement un dossier intelligent pour trouver tous les anciens messages (sauf dans les boîtes aux lettres que je préfère conserver) afin de pouvoir les supprimer périodiquement en ouvrant le dossier intelligent, en sélectionnant tout et en appuyant sur la touche de suppression.

C'est un peu plus pratique, mais je préférerais encore que le processus soit automatique. Existe-t-il un moyen de faire en sorte que Mail, un script d'Automator, Applescript ou quelque chose de similaire trouve les anciens messages selon certains critères (ou utilise ma boîte aux lettres intelligente) et les supprime, afin que je puisse programmer l'exécution automatique du processus ?

0voto

Haravikk Points 1128

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.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X