Bueno, he encontrado una solución usando AppleScript, es un script bastante grande pero en realidad no es tan complicado; simplemente recorre los buzones de correo de cada recuento, omite los datos especificados en una lista y busca los 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 los mensajes al ubicar la carpeta de la papelera de una cuenta (si tiene una) y al moverlos, lo que es un proceso muy lento si tiene muchos correos electrónicos que mover inicialmente, sin embargo, evita la necesidad de volver a explorar. Solo utilizará 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 correo de la papelera). Si bien es más rápido, puede que se reprocesen los mensajes si el script se ejecuta con frecuencia ( por ejemplo, todos los días.
Para configurar los ajustes de la secuencia de comandos, puede cambiar defaultExpiryDays
a la cantidad de días de correo electrónico que se guardarán, todo lo anterior y lo anterior se eliminarán. La configuración dryRun
se establece inicialmente en true
, lo que significa que la secuencia de comandos informará las 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 que pueda establece este false
.
El trashMailboxes
enumera los nombres de los buzones de correo a los que se moverá el script si se encuentran para una cuenta. La lista ignoreTheseMailboxes
contiene buzones de correo que no deberían procesarse y cubre los más comunes, incluidas las carpetas que los comportamientos normales de los buzones de correo 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 puede activarse a través de un script de shell o launchd
usando un comando como osascript /path/to/script.scpt
, que también utilizará los valores predeterminados, o puede especificar argumentos adicionales, en cuyo caso el primero es el número de días que se conservarán y cualquier otros argumentos son buzones adicionales para omitir, por ejemplo, osascript /path/to/script.scpt 14 foo bar
mantendrá las dos últimas semanas de correos electrónicos leídos y omitirá cualquier buzón llamado "foo" o "barra" además de los valores predeterminados.
Si desea automatizar el proceso con launchd
, puede crear un archivo con ~/Library/LaunchAgents
con la extensión .plist
y 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>
Lo que mantendrá el valor de 45 días de correos electrónicos y se ejecutará todos los domingos a la 1:15 p.m. (¡recuerde establecer la ruta de acceso a su script en los argumentos del programa!).
Una vez guardado, el agente de inicio se cargará la próxima vez que cierre / reinicie, o puede ejecutar launchctl load ~/Library/LaunchAgents/agent.plist
con el nombre correcto para su archivo plist.