Editar reglas de correo manualmente

Quiero editar manualmente el siguiente archivo .plist:

/Users/<myname>/Library/Mail/V5/MailData/SyncedRules.plist

Porque recibo mucho spam y agregar cada dirección de spam a las reglas usando Mail es impracticable:

ingrese la descripción de la imagen aquí

y hay muchas direcciones para agregar. Como sé un poco de secuencias de comandos bash, sed y awk, estoy pensando en escribir una secuencia de comandos que agregue automáticamente las direcciones del correo electrónico seleccionado al archivo plist anterior.

ingrese la descripción de la imagen aquí


Entonces, ¿cuál es mi pregunta?

En conclusión, para cada dirección de spammer, el script debe agregar una nueva dictentrada con los siguientes campos:

        <dict>
            <key>CriterionUniqueId</key>
            <string>CC4CB669-0D44-4A32-80B1-02D069718304</string> (*)
            <key>Expression</key>
            <string>spammer@address.spam</string>
            <key>Header</key>
            <string>From</string>
        </dict>

¿Cómo se genera la cadena en (*)? ¿Cómo puedo llenarlo?

Podrías invertir en algo como SpamSieve que lo manejará todo por ti. Sin afiliación, solo lo he estado usando durante tanto tiempo que olvidé que está allí;)
Agradezco tu comentario ☺️ pero SpamSieve cuesta 30$ 🤨 ¿Por qué comprarlo cuando podría hacerlo yo mismo? 🤗

Respuestas (1)

Tal vez usted apreciará este guión. Básicamente, el código obtendrá todas las direcciones de correo electrónico de los remitentes de todos los correos electrónicos ubicados en su buzón de correo no deseado y creará una nueva regla de correo para cada uno...;. Establecer el nombre de la regla en la dirección de correo electrónico extraída. En caso de que haya elementos duplicados en la lista de remitentes, todos los duplicados se eliminarán antes de agregar las reglas. Además, aparecerá un cuadro de diálogo que le dará la opción de habilitar las reglas recién creadas. Este código debería resultar un gran ahorro de tiempo.

Esto funciona para mí usando la última versión de macOS High Sierra

set isRunning to application "Mail" is running

tell application "Mail"
    activate
    if isRunning is false then
        delay 12
    else
        delay 2
    end if
    set junkEmailAddressesNoDupes to {}
    set junkEmailAddresses to sender of every message of junk mailbox
    if (count of junkEmailAddresses) is 0 then
        set zeroJunkMail to button returned of (display dialog "You Currently Have 0 Junk Mail Messages" buttons {"OK"} with icon 1 default button "OK" giving up after 10)
        if zeroJunkMail is "OK" then
            if isRunning is false then
                tell application "Mail" to quit
            end if
            return
        end if
        if isRunning is false then
            tell application "Mail" to quit
        end if
        return
    end if
    activate
    display alert ¬
        "IMPORTANT" message "Please Make Sure The Top Level Junk Mail Folder labeled" & " " & quote & "JUNK" & quote & ¬
        " Is Selected" as warning ¬
        buttons {"Cancel", "OK"} ¬
        default button 2 ¬
        cancel button 1 ¬
        giving up after 30
    delay 10
    repeat with i from 1 to count of junkEmailAddresses
        set thisItem to item i of junkEmailAddresses
        set thisEmail to extract address from thisItem
        set end of junkEmailAddressesNoDupes to thisEmail
    end repeat
end tell

set junkEmailAddressesNoDupes2 to removeDuplicates(junkEmailAddressesNoDupes)

tell application "Mail"
    activate
    set checkRulez to button returned of (display dialog ¬
        "Please Make Sure These New Junk Mail Rules Do Not Contain Any Valid Email Addresses That You Don't Want Tagged As Junk" & linefeed & linefeed & (junkEmailAddressesNoDupes2 as list) buttons {"CANCEL", "OK"} ¬
        default button 2 ¬
        cancel button 1 ¬
        with title ¬
        "NEW JUNK MAIL RULES" with icon 1 ¬
        giving up after 120)
end tell

if checkRulez is "CANCEL" then
    return
end if

repeat with i from 1 to count of junkEmailAddressesNoDupes2
    set thisItem to item i of junkEmailAddressesNoDupes2
    tell application "Mail"
        if not (exists of rule thisItem) then
            make new rule ¬
                with properties {name:thisItem}
            tell its rule thisItem
                make new rule condition ¬
                    with properties {header:"", expression:thisItem, rule type:from header, qualifier:equal to value}
                delay 0.1
                set delete message to true
            end tell
        end if
    end tell
end repeat

tell application "Mail"
    activate
    set enableRulez to button returned of (display dialog ¬
        "Enable New Rules?" buttons {"Cancel", "No", "Yes"} ¬
        default button 3 ¬
        cancel button 1 ¬
        with title ¬
        "New Rulez" giving up after 30)
end tell

if enableRulez is "Yes" then
    tell application "Mail" to set enabled of every rule to true
else
    return
end if

tell application "Mail"
    activate
    set applyRulez to button returned of (display dialog ¬
        "Would You Like To Apply Your New Junk Mail Rules To Your Current Junk Mail?" buttons {"No", "Yes"} ¬
        default button 2 ¬
        cancel button 1 ¬
        with title ¬
        "APPLY THE NEW RULES?" with icon 1 ¬
        giving up after 30)
end tell

if applyRulez is "Yes" then
    tell application "System Events"
        tell application "Mail" to activate
        click static text 1 of UI element 1 of row 5 of outline 1 of scroll area 1 ¬
            of splitter group 1 of window 1 of application process "Mail"
        delay 1
        keystroke "a" using command down
        delay 0.5
        keystroke "l" using {option down, command down}
    end tell
else
    return
end if


on removeDuplicates(lst)
    try
        if lst's class is not list then error "not a list." number -1704
        script k
            property l : lst
            property res : {}
        end script
        repeat with itemRef in k's l
            set itm to itemRef's contents
            if k's res does not contain {itm} then ¬
                set k's res's beginning to itm
        end repeat
        return k's res's reverse
    on error eMsg number eNum
        error "Can't removeDuplicates: " & eMsg number eNum
    end try
end removeDuplicates

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Si estoy leyendo esto correctamente, estoy obteniendo todas las direcciones de correo electrónico del correo basura y eliminando todos los correos electrónicos con esas direcciones de correo electrónico. ¿Por qué no simplemente eliminar todos los correos electrónicos en el correo no deseado? Mail moverá automáticamente los correos electrónicos marcados como correo no deseado a la carpeta de correo no deseado.
@JBis No, no estás leyendo eso correctamente. El código tomará todas las direcciones de correo electrónico de los remitentes en su buzón de correo no deseado y creará una nueva regla de correo no deseado para cada uno de los remitentes. El usuario todavía tendrá que activar las reglas recién creadas. Esta es una protección contra fallas en caso de que algunos correos electrónicos legítimos terminen en el buzón de correo no deseado. Para que se eliminen esos mensajes, el usuario aún debe activar las reglas, luego seleccionar los correos electrónicos no deseados en el buzón de correo no deseado y "Aplicar reglas"
Pero la regla está configurada para eliminarlos, ¿correcto? Entonces, el objetivo del script es permitirle eliminar el correo no deseado según la dirección de correo electrónico.
Esa es solo la acción de regla que configuré. Siéntase libre de ajustar el código para que realice cualquier acción que elija.
De acuerdo. Entiendo la idea detrás de esto ahora.
Realmente, el objetivo del script es simplemente crear nuevas reglas de correo no deseado en lugar de tener que crearlas manualmente una por una.