Created with www.instacod.es

Serienmails

Update: Der untenstehende Code wurde freundlicherweise in den Kommentaren erweitert und verbessert. Die aktuellste Version liegt hier bei Github. Vielen Dank für die Mitarbeit!

Im Rahmen meiner Bachelorarbeit wollte ich für eine Online-Befragung möglichst viele Menschen erreichen. Aus einem Verzeichnis bekam ich die E-Mail-Adressen und stellte nun Überlegungen an, wie ich am besten vorgehen sollte. Insgesamt handelte es sich dabei um über 3000 Adressen, die erreicht werden sollten.

Alle Empfänger einfach in das normale Adressfeld zu schmeißen schied natürlich von vornherein aus. Das geht datenschutzrechtlich einfach nicht. Auch wenn alle Adressen „frei zugänglich“, also mit etwas Aufwand aber ohne Probleme im Netz klickbar sind, sollten nicht alle Emfpfänger sehen können, wer die Mail noch bekommen hat. Oder sogar direkt mal allen antworten.

Die zweite Möglichkeit war, alle Empfänger in das BCC-Feld einzutragen. Dann allerdings wird gar kein Empfänger angezeigt. Und vermutlich hätte jedes halbwegs intelligente Mailprogramm dies als Spam aufgefasst, immerhin hatte ich mit den Empfängern ja vorher noch keinerlei Kontakt. Dementsprechend fiel diese Option auch weg. Die Zwischenlösung, nur eine Person ins Adressfeld und den Rest ins BCC zu schreiben, verwarf ich auch, weil das letztendlich auch verdächtig aussieht. Denn komisch wäre das ja schon, den Mailverkehr von zwei wildfremden Menschen zu lesen, wenn man nicht selbst als Empfänger drin steht.

Also musste quasi an jeden Empfänger eine separate Mail verschickt werden. Dafür gab es auch einige Programme im AppStore (z.B. SerialMailer oder AutoMailer). Allerdings waren mir rund 20€ für so eine einmalige Aktion doch zuviel, zumal das mit all den grafischen Features eher Overkill gewesen wäre. Denn mir reichte eine simple Plain-Text-Mail mit meinem Anliegen und einem Link zur Befragung.

Glücklicherweise ist Mac OS X mit nützlichen Tools wie Automator und AppleScript ausgestattet. Mein erster Versuch mit Automator, welches Serienmails ausdrücklich anbietet scheiterte an einem komplizierten Fehler:
-[__NSArrayM numberOfItems]: unrecognized selector sent to instance
Da sich darüber auch nichts im Netz finden ließ, beschloss ich, mich in AppleScript einzuarbeiten, zumindest so weit, dass ich in der Lage war, automatisiert meine rund 3000 Mails zu verschicken.

Da ich zum Glück schon rudimentäre Programmiererfahrung hatte, fiel mir das Einarbeiten in AppleScript zum Glück nicht allzu schwer. Zumal ich mir auch von überall kleine Codeschnipsel aus dem Internet zusammensammelte, wenn ich irgendwo nicht weiter kam. Zumindest solange ich verstand, was sie taten, nicht dass ich die Kontrolle über meine Riesenmenge von Mails verliere. Überrascht war ich übrigens auch, dass es alles Mögliche an Lösungen für Serienmails mit Anhängen und Adressen aus den Kontakten etc. gibt, jedoch keine explizite Lösung für meine minimalistische Variante.

Aus diesem Grund möchte ich mein Script an dieser Stelle mit dem Netz teilen, falls jemand zufällig mal das gleiche Problem/Anliegen hat. Was das Script noch benötigt: jeweils eine Textdatei mit den Mailadressen (eine pro Zeile) und eine mit dem Mailtext. Zu beachten ist außerdem, dass sich das Script irgendwann, bei etwa 1200 komplett übernimmt; die Mail.app kommt anscheinend nicht hinterher oder AppleScript ist mit der Masse überfordert. Deshalb legt euch lieber mehrere Adressdateien mit maximal etwa 800 Adressen an! Dank «class utf8» sind Umlaute übrigens kein Problem für das Script.

Viel Spaß und viel Erfolg!

 



set MailSubject to "[YourSubject]"

— Liste 1: All Recipients
tell application „Finder“
set emailList to {}
set Adresses to paragraphs of (read (choose file with prompt „Choose the text file with the recipients“) as «class utf8»)
repeat with nextLine in Adresses
if length of nextLine is greater than 0 then
set end of emailList to nextLine
end if
end repeat
end tell

set count1 to count of emailList

— Email text
tell application „Finder“
set emailText to (read (choose file with prompt „Choose the text file with the content“) as «class utf8»)
end tell

— create serial mails and send them
tell application „Mail“
activate
repeat with i from 1 to count1
set theAdress to (item i of emailList)
set theMex to (make new outgoing message at end of outgoing messages with properties {visible:true, subject:MailSubject, content:emailText})
tell theMex
make new to recipient at end of to recipients with properties {address:theAdress}
end tell
send theMex
end repeat
end tell

display dialog (count1 as string) & “ messages sent.“


For my english guests:

Above, you can see the AppleScript code for a simple serial mail. What you need (besides a Mac, obviously) is two text files: One contains the addresses with a single address per line. The other contains your mail content as plain text. Once you run the script, you will be prompted to choose first the address file, then the content file. Be careful though, some part of my Mail.app or the AppleScript couldn’t handle more than about 1200 addresses at once, so you should play it safe and divide the address files to contain only about 800 mail addresses. Have fun!

4 Gedanken zu „Serienmails“

  1. Vielen Dank für diesen tollen Beitrag, denn er löst genau mein Problem, 4 Jahre später… Nachdem ich einige Stunden nach einem geeigneten Programm gesucht hatte (und ebenfalls der Unwille, 30 Euro für ein Gmail-Plugin oder ähnliches auszugeben) war ich heilfroh, dein Skript gefunden zu haben. Ich erweiterte es um eine kleine Delayfunktion (delay 1) nach dem Senden, da ich sonst Fehler von meinem SMTP-Server bekam.

    Super!!

    Viele Grüße und weiter frohes Schreiben, Recherchieren und Lösungen finden,

    Oliver

    1. Toll, da hat es sich ja tatsächlich gelohnt, dieses Script zu veröffentlichen! Vielen Dank für deinen Kommentar und die nette Rückmeldung!

  2. wunderbar – herzlichen dank.

    auch für mich eine super hilfe, um einfach ein paar mails zu versenden ohne eine software kaufen zu müssen.

    ich habe noch folgende erweiterungen eingearbeitet:
    1.
    »set MailSubject to „[YourSubject]“« ersetzt mit
    »set MailSubject to the text returned of (display dialog „Mail Subject Zeile angeben“ default answer „“)« um die subjectzeile der mail in einem dialog abzufragen.
    2.
    diese fand and replace funktion eingefügt, um im mail-body-text eine variable {mail} durch die verwendete mail-adresse zu ersetzen:
    — function find and replace
    on findAndReplaceInTextMAIL(theText, theSearchString, theReplacementString)
    set AppleScript’s text item delimiters to theSearchString
    set theTextItems to every text item of theText
    set AppleScript’s text item delimiters to theReplacementString
    set theText to theTextItems as string
    set AppleScript’s text item delimiters to „“
    return theText
    end findAndReplaceInTextMAIL

    aufruf dann so:
    — create serial mails and send them
    tell application „Mail“
    activate
    repeat with i from 1 to count1
    set theAdress to (item i of emailList)

    set theText to my findAndReplaceInTextMAIL(emailText, „{mail}“, theAdress as rich text)

    set theMex to (make new outgoing message at end of outgoing messages with properties {visible:true, subject:MailSubject, content:theText})

    tell theMex
    make new to recipient at end of to recipients with properties {address:theAdress}
    end tell
    send theMex
    delay 1
    end repeat
    end tell

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *