Eliminación automática de mensajes de OS X Mail

De acuerdo, sé que este es un problema complicado ya que el correo de OS X aparentemente carece de la capacidad de eliminar o archivar automáticamente los mensajes antiguos, a pesar de que tiene las reglas necesarias basadas en la fecha para hacerlo.

Como tal, actualmente estoy usando una carpeta inteligente para encontrar todos los mensajes antiguos (excepto en los buzones que prefiero conservar) para poder eliminarlos periódicamente abriendo la carpeta inteligente, seleccionando todo y presionando eliminar.

Esto es un poco más conveniente, pero aun así prefiero que el proceso sea automático. ¿Hay alguna manera de que Mail, un script de Automator, Applescript o algo similar encuentre mensajes antiguos con algunos criterios (o use mi buzón inteligente) y los elimine, de modo que pueda programar el proceso para que se ejecute automáticamente?

AppleScript, afaik, no puede interactuar con las carpetas inteligentes.
¿Probaste las reglas?
@Buscar웃 Sí, pero parece que solo se ejecutan en mensajes nuevos, así que no estoy seguro de si realmente hace algo. Además, mi criterio sobre qué eliminar no puede cumplirse con una regla (quiero eliminar los mensajes antiguos de todas las carpetas, excepto unas pocas seleccionadas)
Si pudiera especificar sus criterios, alguien podría pensar en algo.
Necesito eliminar todo el correo que tenga más de X días que no esté en mi bandeja de entrada o carpetas de archivo (o borradores, basura, enviados y papelera, ya que ya están cubiertos). Descubrí que AppleScript puede acceder a todos los mensajes en Mail, y que los mensajes tienen una lectura/escritura de deleted status, ¿alguien sabe si establecer esto en verdadero funcionará para eliminar mensajes?

Respuestas (1)

Bien, he encontrado una solución usando AppleScript, es un script bastante grande pero en realidad no es tan complicado; simplemente recorre los buzones de cada conteo, omitiendo cualquiera especificado en una lista, y busca mensajes leídos y no eliminados anteriores al número de días especificado.

 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

El script elimina mensajes localizando la carpeta de basura de una cuenta (si tiene una) y moviéndolos, lo cual es un proceso muy lento si tiene muchos correos electrónicos para mover inicialmente, sin embargo evita la necesidad de volver a escanear. Solo usará la opción de eliminación regular si no puede determinar la carpeta de la papelera (es decir, no encontró una de los nombres en los buzones de basura), aunque esto es más rápido, puede hacer que los mensajes se vuelvan a procesar si el script se ejecuta con frecuencia ( por ejemplo, todos los días).

Para configurar la configuración del script, puede cambiar defaultExpiryDaysla cantidad de días de correo electrónico para mantener, todo lo anterior y leído se elimina. La dryRunconfiguración se establece inicialmente en true, lo que significa que la secuencia de comandos informará coincidencias, pero en realidad no eliminará ni moverá nada, una vez que esté satisfecho de que la secuencia de comandos coincida con los correos electrónicos que espera, puede configurar esto false.

El trashMailboxesenumera los nombres de los buzones a los que la secuencia de comandos moverá el correo electrónico si se encuentra para una cuenta. La ignoreTheseMailboxeslista contiene buzones que no deben procesarse y cubre los más comunes, incluidas las carpetas que los comportamientos normales de los buzones de Mail ya deberían cubrir.

El script puede ejecutarse con cualquier cosa que pueda activar un AppleScript, como iCal, en cuyo caso utilizará sus valores predeterminados. También se puede activar a través de un script de shell o launchdusando un comando como osascript /path/to/script.scpt, que también usará los valores predeterminados, o puede especificar argumentos adicionales, en cuyo caso el primero es la cantidad de días que se deben mantener, y cualquier argumento adicional son buzones de correo adicionales para skip, por ejemplo, osascript /path/to/script.scpt 14 foo barconservará los correos electrónicos leídos de las últimas dos semanas y omitirá todos los buzones llamados "foo" o "bar", además de los predeterminados.

Si desea automatizar el proceso, launchdpuede crear un archivo ~/Library/LaunchAgentscon la extensión .plisty contenidos como:

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

Que conservará 45 días de correos electrónicos y se ejecutará todos los domingos a la 1:15 p. m. (¡recuerde establecer la ruta a su secuencia de comandos en los argumentos del programa!).

Una vez guardado, el agente de inicio se cargará la próxima vez que apague o reinicie, o puede ejecutarlo launchctl load ~/Library/LaunchAgents/agent.plistcon el nombre correcto para su archivo plist.

Es demasiado complicado. Ojalá pudiera ser tan fácil como en Thunderbird.