Cancellazione automatica dei messaggi da OS X Mail

3

Ok, quindi so che questo è un problema complicato dato che a OS X's Mail sembra manchi la possibilità di eliminare o archiviare automaticamente i vecchi messaggi, anche se per farlo ha le necessarie regole basate sulla data.

In questo modo, sto attualmente utilizzando una cartella intelligente per trovare tutti i vecchi messaggi (eccetto nelle cassette postali che preferisco mantenere) in modo da poterli eliminare periodicamente aprendo la cartella smart, selezionando tutto e premendo delete.

Questo è un po 'più comodo, ma preferirei che il processo fosse automatico. C'è un modo in cui potrei avere Mail, uno script di Automator, Applescript o qualcosa di simile per trovare vecchi messaggi con alcuni criteri (o usare la mia smart mailbox) ed eliminarli, in modo che possa programmare il processo per l'esecuzione automatica?

    
posta Haravikk 13.07.2014 - 21:45
fonte

1 risposta

0

Ok, quindi ho trovato una soluzione usando AppleScript, è uno script abbastanza grande ma in realtà non è poi così complicato; semplicemente scorre le caselle di posta di ogni conteggio, salta qualsiasi specificato in un elenco e cerca i messaggi letti, non eliminati, più vecchi del numero specificato di giorni.

 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

Lo script cancella i messaggi individuando la cartella cestino di un account (se ne ha uno) e spostandoli, il che è un processo molto lento se ha un sacco di e-mail da spostare inizialmente, tuttavia impedisce la necessità di eseguire nuovamente la scansione. Utilizzerà l'opzione di eliminazione normale solo se non è in grado di determinare la cartella del cestino (cioè non ne trova uno tra i nomi in trashMailboxes), mentre è più veloce potrebbe comportare la rielaborazione dei messaggi se lo script viene eseguito frequentemente ( es. - ogni giorno).

Per configurare le impostazioni dello script è possibile modificare defaultExpiryDays al numero di giorni di e-mail da conservare, tutto ciò che è più vecchio e letto viene cancellato. L'impostazione dryRun è impostata inizialmente su true , il che significa che lo script riporterà le corrispondenze, ma in realtà non eliminerà o non moverà nulla, una volta che lo script è compatibile con le e-mail che ti aspetti, puoi imposta questo false .

Il trashMailboxes elenca i nomi delle cassette postali che lo script trasferirà e-mail se trovato per un account. L'elenco ignoreTheseMailboxes contiene le cassette postali che non devono essere elaborate e copre le più comuni, incluse le cartelle che i normali comportamenti di Mailbox di Mail dovrebbero già coprire.

Lo script può essere eseguito da qualsiasi elemento che possa attivare un AppleScript, come iCal, nel qual caso utilizzerà i suoi valori predefiniti. Può anche essere attivato tramite uno script di shell o launchd utilizzando un comando come osascript /path/to/script.scpt , che utilizzerà analogamente i valori predefiniti, oppure è possibile specificare ulteriori argomenti, nel qual caso il primo è il numero di giorni da mantenere e qualsiasi ulteriori argomenti sono caselle di posta aggiuntive da saltare, ad esempio osascript /path/to/script.scpt 14 foo bar manterrà le ultime due settimane vale la pena leggere e-mail, e salterà qualsiasi casella di posta denominata "foo" o "bar" oltre ai valori predefiniti.

Se vuoi automatizzare il processo con launchd , puoi creare un file sotto ~/Library/LaunchAgents con l'estensione .plist e contenuti come:

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

Che manterrà 45 giorni di e-mail, e verrà eseguito ogni domenica alle 13:15 (ricordati di impostare il percorso del tuo script sotto argomenti del programma!).

Una volta salvato, l'agente di lancio caricherà la prossima volta il tuo arresto / riavvio, oppure puoi eseguire launchctl load ~/Library/LaunchAgents/agent.plist con il nome corretto per il tuo file plist.

    
risposta data 15.07.2014 - 20:43
fonte

Leggi altre domande sui tag