Automatisches Löschen von Nachrichten aus OS X Mail

Okay, ich weiß, dass dies ein kniffliges Problem ist, da Mail von OS X scheinbar nicht in der Lage ist, alte Nachrichten automatisch zu löschen oder zu archivieren, obwohl es die erforderlichen datumsbasierten Regeln dafür hat.

Daher verwende ich derzeit einen intelligenten Ordner, um alle alten Nachrichten zu finden (außer in Postfächern, die ich lieber behalten möchte), damit ich sie regelmäßig löschen kann, indem ich den intelligenten Ordner öffne, alles auswähle und auf „Löschen“ klicke.

Das ist etwas bequemer, aber ich würde es immer noch vorziehen, wenn der Prozess automatisch abläuft. Gibt es eine Möglichkeit, dass Mail, ein Automator-Skript, Applescript oder ähnliches alte Nachrichten mit bestimmten Kriterien finden (oder meine intelligente Mailbox verwenden) und löschen können, damit ich den Prozess so planen kann, dass er automatisch ausgeführt wird?

AppleScript, afaik, kann nicht mit Smart Folders interagieren.
Hast du Regeln ausprobiert?
@Buscar웃 Ja, das habe ich, aber sie scheinen nur bei neuen Nachrichten ausgeführt zu werden, also bin ich mir nicht sicher, ob es tatsächlich etwas bewirkt. Außerdem können meine Kriterien, was gelöscht werden soll, nicht von einer Regel erfüllt werden (ich möchte alte Nachrichten aus allen Ordnern außer einigen wenigen löschen).
Wenn Sie Ihre Kriterien buchstabieren könnten, könnte sich jemand etwas einfallen lassen.
Ich muss alle E-Mails löschen, die älter als X Tage sind und sich nicht in meinem Posteingang oder meinen Archivordnern befinden (oder Entwürfe, Junk, Gesendet und Papierkorb, da sie bereits abgedeckt sind). Ich habe festgestellt, dass AppleScript auf alle Nachrichten in Mail zugreifen kann und dass Nachrichten einen Lese-/Schreibzugriff von haben deleted status. Weiß jemand, ob es funktioniert, wenn Sie dies auf true setzen, um Nachrichten zu löschen?

Antworten (1)

Okay, ich habe eine Lösung mit AppleScript gefunden, es ist ein ziemlich großes Skript, aber eigentlich nicht so kompliziert; es durchläuft einfach die Mailboxen jeder Zählung, überspringt alle in einer Liste angegebenen und sucht nach gelesenen, nicht gelöschten Nachrichten, die älter als die angegebene Anzahl von Tagen sind.

 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

Das Skript löscht Nachrichten, indem es den Papierkorb eines Kontos findet (falls vorhanden) und sie verschiebt, was ein sehr langsamer Prozess ist, wenn anfangs viele E-Mails verschoben werden müssen, es verhindert jedoch die Notwendigkeit eines erneuten Scannens. Es wird die reguläre Löschoption nur verwenden, wenn es den Papierkorbordner nicht bestimmen kann (dh - keinen anhand der Namen in trashMailboxes gefunden hat), obwohl dies schneller ist, kann es dazu führen, dass Nachrichten erneut verarbeitet werden, wenn das Skript häufig ausgeführt wird ( zB - täglich).

Um die Einstellung des Skripts zu konfigurieren, können Sie defaultExpiryDaysdie Anzahl der Tage ändern, die E-Mails aufbewahrt werden sollen, alles ältere und gelesene wird gelöscht. Die dryRunEinstellung ist anfangs auf gesetzt true, was bedeutet, dass das Skript Übereinstimmungen meldet, aber nichts wirklich löscht oder verschiebt, sobald Sie zufrieden sind, dass das Skript mit den erwarteten E-Mails übereinstimmt, können Sie dies festlegen false.

Das trashMailboxeslistet die Postfachnamen auf, in die das Skript E-Mails verschiebt, wenn es für ein Konto gefunden wird. Die ignoreTheseMailboxesListe enthält Postfächer, die nicht verarbeitet werden sollten, und deckt die häufigsten ab, einschließlich Ordnern, die das normale Postfachverhalten von Mail bereits abdecken sollte.

Das Skript kann von jedem ausgeführt werden, das ein AppleScript auslösen kann, z. B. iCal. In diesem Fall verwendet es seine Standardeinstellungen. Es kann auch über ein Shell-Skript oder launchdmit einem Befehl wie osascript /path/to/script.scptausgelöst werden, der ebenfalls die Standardwerte verwendet, oder Sie können zusätzliche Argumente angeben, wobei das erste die Anzahl der Tage ist, die aufbewahrt werden sollen, und alle weiteren Argumente zusätzliche Postfächer sind skip behält beispielsweise osascript /path/to/script.scpt 14 foo bardie gelesenen E-Mails der letzten zwei Wochen und überspringt zusätzlich zu den Standardeinstellungen alle Postfächer mit den Namen "foo" oder "bar".

Wenn Sie den Prozess mit automatisieren möchten, launchdkönnen Sie eine Datei unter ~/Library/LaunchAgentsmit der Erweiterung .plistund Inhalten wie:

<?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>

Das wird E-Mails für 45 Tage speichern und wird jeden Sonntag um 13:15 Uhr ausgeführt (denken Sie daran, den Pfad zu Ihrem Skript unter Programmargumenten festzulegen!).

Nach dem Speichern wird der Startagent entweder beim nächsten Herunterfahren/Neustart geladen, oder Sie können launchctl load ~/Library/LaunchAgents/agent.plistmit dem richtigen Namen für Ihre Plist-Datei ausführen.

Es ist viel zu kompliziert. Wünschte, es könnte so einfach sein wie in Thunderbird.