Serienmail mit unterschiedlichem Anhang, Hilfe!

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Liebe MacUser-Experten,

für mein Diplomarbeit in Psychologie habe ich 1056 Teilnehmer,
die von mir im Laufe der Woche eine Mail über Ihre individuellen Ergebnisse
an meiner Studie erwarten.

Dazu habe ich in den letzten Wochen 1056 .doc Dateien (Beziehungsprofile)
erstellt nach dem Muster "Beziehungsprofil_1.doc ; Beziehungsprofil_2.doc, Beziehungsprofil_3.doc .... etc."

Nun habe ich eine Verteilerliste im Adressbuch von Leopard
mit den E-Mails der Teilnehmer

1. ABC@hotmail.com
2. BBC@gmx.de
3. CGG@web.de
4. DEF@mail.de
usw.

Ich würde nun gerne automatisch eine Mail an den ersten Teilnehmer senden und das mit dem Anhang "Beziehungsprofil_1.doc".

In diesem Fall wäre das Beziehungsprofil_1.doc + Mail an ABC@hotmail.com.
Die nächste Mail würde an BBC@gmx.de gehen + Beziehungsprofil_2.doc.

Die Verteilerliste würde also alphabetisch abgearbeitet werden und die Beziehungsprofile in aufsteigender Reihenfolge an die Teilnehmer versendet werden.

Ich beiße mir leider gerade die Zähne an diesem Problem aus.

Habt ihr vielleicht eine pfiffige Idee wie man das realisieren könnte ?
Bin für jeden Tipp sehr sehr dankbar.

Ganz lieben Gruß
Manu :rolleyes:
 

chebfarid

Mitglied
Registriert
05.10.2005
Beiträge
894
Zwei Listen werden mittels AppleScript erstellt:
1) alle anzuhängenden Files (befinden sich, wie ich annehme, in einem Ordner)
2) alle Empfänger aus Deiner Verteilerliste
Daß die Reihenfolge der Files und der Empfänger übereinstimmen, hast Du bestimmt schon überprüft

Dann kümmert sich Mail darum, die beiden Listen auszulesen und der Reihe nach Message + Anhang zu versenden:
(den Feinschliff mußt Du natürlich selbst übernehmen...)

PHP:
with timeout of 600 seconds -- kann länger dauern...
	
	-- Liste 1: Alle attachments
	tell application "Finder"
		set attachmentFolder to (choose folder)
		set attachmentList to entire contents of attachmentFolder
	end tell
	
	-- Liste 2: Alle Empfänger
	tell application "Address Book"
		set emailList to {}
		set testPersons to every person of group "TestGroup"
		repeat with thisTestPerson in testPersons
			set end of emailList to (value of email of thisTestPerson) as string
		end repeat
	end tell
	
	-- Sicherheits-Check (you never know...)
	set count1 to count of attachmentList
	set count2 to count of emailList
	if count1 is not equal to count2 then
		display dialog "Houston, we have a problem:" & return & "Die beiden Listen sind nicht gleich lang..." buttons {"Shit"} with icon 2
		return
	end if
	
	-- Serienmails erstellen und abschicken:
	tell application "Mail"
		activate
		repeat with i from 1 to count1
			set theFile to (item i of attachmentList) as alias
			set theAddress to (item i of emailList)
			set theMex to (make new outgoing message at end of outgoing messages with properties {visible:true, subject:"Just a test", content:"Kölle Alaaf"})
			tell content of theMex
				make new attachment with properties {file name:theFile} at after last paragraph
			end tell
			tell theMex
				make new to recipient at end of to recipients with properties {address:theAddress}
			end tell
			send theMex
		end repeat
	end tell
	
	display dialog (count1 as string) & " Nachrichten verschickt."
	
end timeout

Ciao
Farid
 

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Erstmal vielen lieben Dank für den tollen Tipp !

Habe das mit meinen 907 Profilen versucht, aber es hat
leider nicht geklappt. An einer Stelle hängt es und ich verstehe
den Fehler nicht.

Problem ist, dass das Skript die Reihenfolge der Teilnehmer
im Adressbuch durcheinanderwirft. Könnte das an der zu kurzen
Zeitspanne während der Zuweisung liegen ?

Die Reihenfolge der Attachments bleibt dabei völlig in Ordnung...
sie werden korrekt zugewiesen (Beziehungsprofil_1, Beziehungsprofil_2... etc.)

Aber die "Empfängerliste" ist durcheinandergewürfelt...

... habe Teilnehmer im Adressbuch alphabetisch sortiert ...

1. AAA@gmx.de
2. AAC@gmx.de
3. BBB@hotmail.com
4. BBC@hotmail.com
...
907. ZZZ@web.de

Leider sendet das Skript die Mails dann aber chaotisch
raus - mal zuerst an Teilnehmer 512, dann Teilnehmer 306 usw.
Die Reihenfolge wird nicht eingehalten also von AAA@gmx.de bis ZZZ@web.de :-(

Bin ziemlich verzweifelt. Habe jetzt drei Stunden versucht das Problem
unter Kontrolle zu bekommen, finde aber den Fehler nicht.

Weiß einer von euch Rat ???

Würd mich so über einen Tipp freuen.

Lieben Gruß,
Manuel :rolleyes:

PS
Habe im Anhang mal mein aktuelles Apple-Skript zitiert:

PHP:
with timeout of 600 seconds -- kann länger dauern...
	
	-- Liste 1: Alle attachments
	tell application "Finder"
		set attachmentFolder to (choose folder)
		set attachmentList to entire contents of attachmentFolder
	end tell
	
	-- Liste 2: Alle Empfänger 
        
       [B](Hier entsteht wahrscheinlich der Fehler!) Aber warum ?[/B]

	tell application "Address Book"
		set emailList to {}
		set testPersons to every person of group "Testverteiler"
		repeat with thisTestPerson in testPersons
			set end of emailList to (value of email of thisTestPerson) as string
		end repeat
	end tell
	
	-- Sicherheits-Check (you never know...)
	set count1 to count of attachmentList
	set count2 to count of emailList
	if count1 is not equal to count2 then
		display dialog "Houston, we have a problem:" & return & "Die beiden Listen sind nicht gleich lang..." buttons {"Shit"} with icon 2
		return
	end if
	
	-- Serienmails erstellen und abschicken:
	tell application "Mail"
		activate
		repeat with i from 1 to count1
			set theFile to (item i of attachmentList) as alias
			set theAddress to (item i of emailList)
			set theMex to (make new outgoing message at end of outgoing messages with properties {visible:true, subject:"Dein Beziehungsprofil ist da !", content:"Lieber Teilnehmer, im Anhang findest Du Dein Beziehungsprofil. Lieben Gruß, Manuel Drews"})
			tell content of theMex
				make new attachment with properties {file name:theFile} at after last paragraph
			end tell
			tell theMex
				make new to recipient at end of to recipients with properties {address:theAddress}
			end tell
			send theMex
		end repeat
	end tell
	
	display dialog (count1 as string) & " Nachrichten verschickt."
	
end timeout
 

chebfarid

Mitglied
Registriert
05.10.2005
Beiträge
894
Aber die "Empfängerliste" ist durcheinandergewürfelt...
Das ist natürlich nicht Sinn der Sache :confused:
Auf die schnelle könnte ich mir vorstellen, daß das ein Problem von "Address Book" ist: eventuell wird der Inhalt der Empfängergruppe nicht alfabetisch an das Skript weitergegeben, auch wenn er in der Darstellung sortiert erscheint. (Wahrscheinlich sind die Records intern anhand einer automatisch erstellten Indexnummer sortiert)

Das kannst Du leicht überprüfen, indem Du einfach nur diesen Teil des Skripts ausführst:
PHP:
tell application "Address Book"
        set emailList to {}
        set testPersons to every person of group "Testverteiler"
        repeat with thisTestPerson in testPersons
            set end of emailList to (value of email of thisTestPerson) as string
        end repeat
    end tell
emailList

Wenn die Liste, die Du als Ergebnis siehst, nicht alfabetisch sortiert ist, dann müssen wir noch einen Schritt einbauen, der sich um die korrekte Sortierung kümmert, bevor Mail mit dem Verschicken beginnt.

Good scripting
Farid
 
Zuletzt bearbeitet:

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Lieber chebfarid,

danke, dass Du Dir Zeit für mich nimmst !! Das ist echt lieb :)

Ich habe das Empfängerskript Deinem Tipp zufolge mal ohne alles andere laufen lassen und es ist so wie Du vermutet hast... die Empfängeradressen, die das Skript dann ausspruckt sind durcheinandergewirbelt und nicht alphabetisch sortiert.

Eine Idee wie man das sortieren kann vorher ?

Danke, dass Du mir da ein wenig unter die Arme greifst.

Glg
Manuel
 

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Habe jetzt nochmal einen kleinen Test gefahren mit einer Testgruppe im Adressbuch: 3 Adressen, die alphabetisch sortierbar sind, angelegt.

Das Email-List Skript spuckt folgende Reihenfolge aus:

{"bbb@gmx.de", "aaa@hotmail.com", "zzz@t-online.de"}

Das ist doch echt merkwürdig.
 

chebfarid

Mitglied
Registriert
05.10.2005
Beiträge
894
Ist nicht weiter schlimm, dann wird die Liste halt sortiert, bevor sie an Mail weitergegeben wird:

PHP:
set the_list to {"bbb@gmx.de", "aaa@hotmail.com", "zzz@t-online.de"}
set otid to AppleScript's text item delimiters
set AppleScript's text item delimiters to {ASCII character 10} -- always a linefeed
set list_string to (the_list as string)
set new_string to do shell script "echo " & quoted form of list_string & " | sort -f"
set new_list to (paragraphs of new_string)
set AppleScript's text item delimiters to otid

new_list
--> {"aaa@hotmail.com", "bbb@gmx.de", "zzz@t-online.de"}

Das Beispiel habe ich hier entliehen.

Good scripting
Farid
 

Martin Michel

Mitglied
Registriert
06.09.2008
Beiträge
96
Ein kleiner Hinweis, der irgendwann von Interesse sein könnte: Das Adressbuch erlaubt ja die Bearbeitung der Verteilerlisten (Adressbuch > Bearbeiten > Verteilerlisten bearbeiten).

So kann man dort zum Beispiel einstellen, welche von mehreren eMail-Adressen einer Person für Serienmails benutzt werden soll.

Aber Achtung: Beim Abfragen der Gruppe mit AppleScript wird diese Einstellung nicht berücksichtigt! Eine leidvolle Erfahrung für mich :D

Man kann sich aber sehr einfach behelfen, und zwar wie hier von mir beschrieben:

Get Distribution List email addresses from an Address Book Group

Auf diese Weise konnte ich schon recht komplexe Mailings ohne Zusatzsoftware realisieren. Nur mit AppleScript, Mail, Adressbuch und einer skriptbaren Textverarbeitung.
 

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Lieber Martin, danke Dir für den Zusatztipp !!

Lieber Farid,

mit Deinem Skript hats funktioniert.
Hab nun alles wie folgt zusammengebastelt... es läuft wie geschmiert !

PHP:
with timeout of 600 seconds -- kann länger dauern...
	
	-- Liste 1: Alle attachments
	
	tell application "Finder"
		set attachmentFolder to (choose folder)
		set attachmentList to entire contents of attachmentFolder
	end tell
	
	-- Liste 2: Alle Empfänger 
	
	tell application "Address Book"
		set emailList to {}
		set testPersons to every person of group "Studieverteiler"
		repeat with thisTestPerson in testPersons
			set end of emailList to (value of email of thisTestPerson) as string
		end repeat
	end tell
	
	-- Liste fuer die Übergabe alphabetisch sortieren
	
	set the_list to emailList
	set otid to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {ASCII character 10} -- always a linefeed
	set list_string to (the_list as string)
	set new_string to do shell script "echo " & quoted form of list_string & " | sort -f"
	set new_list to (paragraphs of new_string)
	set AppleScript's text item delimiters to otid
	
	-- Sicherheits-Check (you never know...)
	
	set count1 to count of attachmentList
	set count2 to count of new_list
	if count1 is not equal to count2 then
		display dialog "Houston, we have a problem:" & return & "Die beiden Listen sind nicht gleich lang..." buttons {"Shit"} with icon 2
		return
	end if
	
	-- Serienmails erstellen und abschicken:
	
	tell application "Mail"
		activate
		repeat with i from 1 to count1
			set theFile to (item i of attachmentList) as alias
			set theAddress to (item i of new_list)
			set theMex to (make new outgoing message at end of outgoing messages with properties {visible:true, subject:"Dein Beziehungsprofil ist da !", content:"Lieber Teilnehmer, im Anhang findest Du Dein Beziehungsprofil. Lieben Gruß, Manuel Drews"})
			tell content of theMex
				make new attachment with properties {file name:theFile} at after last paragraph
			end tell
			tell theMex
				make new to recipient at end of to recipients with properties {address:theAddress}
			end tell
			send theMex
		end repeat
	end tell
	
	display dialog (count1 as string) & " Nachrichten verschickt."
	
end timeout

Vielen Vieln Dank nochmal für Deine Mühe.
Du hast mir damit wirklich sehr geholfen, echt super !

:cake:
 

macmanu

Neues Mitglied
Thread Starter
Registriert
09.03.2007
Beiträge
27
Ohje, leider gibts doch noch ein Problem.

Die Sortierroutine sortiert zwar alphabetisch, setzt aber
E-Mail-Adressen mit Sonderzeichen an das Ende:

Zum Beispiel:

1. Alexander_Berlin@xxx.de
2. Alex_Schmidt@xxx.de
3. al_ge@xxx.de
...
...

Im Adressbuch sind diese Adressen alphabetisch aber ganz oben angesetzt:

1. al_ge@gmx.de
2. Alexander_Berlin@xxx.de
3. Alex_Schmidt@xxx.de

Das wirft leider wieder die Reihenfolge durcheinander :-(

Ohje, ich glaube, das Problem bekomme ich nie wirklich gelöst.
Vielleicht muss ich mir ein Wochenende Zeit nehmen und die 1000 Mails per Hand aussenden. Schade, kurz vor dem Ziel.
 

chebfarid

Mitglied
Registriert
05.10.2005
Beiträge
894
Aber, aber, wer wird denn gleich die Flinte in's Korn werfen? :D

Das Sortierskript aud der ersten Antwort basiert auf dem Unix-Befehl sort. Das klappt normalerweise ganz gut, das Problem ist, daß die Sortierroutine auf dem ASCII-System (aus den 70er Jahren) aufbaut, was in Zeiten von Unicode nicht mehr ganz aktuell ist ;)

Auf der gleichen Webseite von maxosxhints findest Du eine komplett in AppleScript geschriebene Routine, die zwar langsamer ist, aber den gleichen Sortierschlüssel benutzt wie alle anderen Macprogramme.

PHP:
-- (...)

-- Liste fuer die Übergabe alphabetisch sortieren:
-- schmeiß den alten Sortierblock weg und ersetze ihn hiermit:
set emailList to my sortedList(emailList)

-- weiter geht's wie gehabt mit: Serienmails erstellen und abschicken:
-- (...)

-- AN'S ENDE des Skripts, nach "end timeout", diesen HANDLER anhängen:

on sortedList(theList)
    if class of theList is list then
        set theSize to length of theList
        repeat with i from 1 to theSize
            repeat with j from 2 to (theSize - i + 1)
                if ((item (j - 1) of theList) > (item j of theList)) then
                    set temp to (item (j - 1) of theList)
                    set (item (j - 1) of theList) to (item j of theList)
                    set (item j of theList) to temp
                end if
            end repeat
        end repeat
        return theList
    else
        return false
    end if
end sortedList

So müßte es gehen.
Ich glaube, in Deiner Antwort war auch ein kleiner Fehler, die alphabetische Sortierfolge in Address-Book müßte diese hier sein (so sehe ich sie auch in meinem Address-Book):
  • al_ge@gmx.de
  • Alex_Schmidt@xxx.de
  • Alexander_Berlin@xxx.de
Und diese Reihenfolge entspricht auch exakt der mit der neuen Routine erstellten.

Good scripting
Farid
 
Oben Unten