[GastForen Programmierung/Entwicklung AppleScript Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

6. Nov 2017, 11:14
Beitrag # 1 von 15
Bewertung:
(6012 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
ich habe mal wieder ein Problem bzw. Anforderung und komme damit nicht voran:

- Ich habe z.B. 10 PDF´s die per Mail an verschiedene Kunden verschickt werden müssen
- Anhand der Namensgebung der PDF´s kann ich sehen, welche PDF´s an welchen Kunden gesendet werden müssen
- xxxxx_1000.pdf muß an den Kunden mit der Kundennummer 1000
- xxxxx_1001.pdf muß an den Kunden mit der Kundennummer 1001
- Script muß also die Kundennummer in „richtige Mailadressen“ wandeln (z.B. 1000 in test1@test.de und 1001 in test2@test.com)
- weitere Mailadressen bzw. Kundennummern folgen nach und nach

Ist es möglich, die PDF´s auf ein „Droplet“ zu ziehen und das dann Mail geöffnet wird, PDF angehängt, Betreff ausgefüllt (Name des PDF´s) und natürlich der Empfänger ausgefüllt ist? Absenden soll nicht automatisch geschehen.
Icon des PDF nach der Aktion nach Möglichkeit einfärben (Etikett)

Ich hoffe das ist zu verstehen und jemand hat eine Idee

Gruß
Uwe
X

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

6. Nov 2017, 11:38
Beitrag # 2 von 15
Beitrag ID: #560406
Bewertung:
(6008 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

welcome back! :-)

Die Aufgabe ist verständlich und sollte gelöst werden können.
Wenn das System mitmacht.

Welche Version von Mac OS X benutzest Du heute?

Gruss, Hans


als Antwort auf: [#560402]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

6. Nov 2017, 11:51
Beitrag # 3 von 15
Beitrag ID: #560408
Bewertung:
(6006 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
auf dem Rechner, der das Script nachher verarbeitet, wird Mac OS X 10.11.6 eingesetzt.

Gruß
Uwe


als Antwort auf: [#560406]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

6. Nov 2017, 11:59
Beitrag # 4 von 15
Beitrag ID: #560410
Bewertung:
(6002 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
habe leider falsche Informationen bzgl. des Dateinamens weitergegeben.
Dateinamen wie folgt:
xxxx_zzzz_1000.pdf
xxxx_zzzz_1001.pdf

Also Kundennummer folgt nach dem zweiten Unterstrich
Gruß
Uwe


als Antwort auf: [#560406]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

6. Nov 2017, 12:25
Beitrag # 5 von 15
Beitrag ID: #560413
Bewertung:
(5994 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

kein Problem. Das Script wird eh die Zeichen –8 bis –5 erfassen.

Aber voraussichtlich werde ich erst gegen Abend einen ersten Versuch machen können.

Hoffentlich kommt mir jemand zuvor ...

Gruss, Hans


als Antwort auf: [#560410]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

7. Nov 2017, 11:18
Beitrag # 6 von 15
Beitrag ID: #560466
Bewertung:
(5924 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

eine erste Version des Scripts.

Den Code im Format "Programm" speichern. Das Script kann durch einen Doppelklick gestartet oder als Droplet benutzt werden.

Wenn mehrere Dateien gedroppt werden, wird nur mit der ersten eine Mitteilung erzeugt. Wenn aber ein Ordner gedroppt wird, welcher mehrere PDF-Dateien enthält, werden alle berücksichtigt.

Wie gewünscht, wird die Mitteilung nicht gesandt.

Wenn eine Nummer nicht korrekt ist, wird der Datei ein rotes Etikett verpasst. Wenn eine Adresse nicht vorhanden ist, ein gelbes. Korrekten Dateien wird ein grünes Etikett zugewiesen.

Code
 # 

[ Edit: Code gelöscht, weil überholt. ]

Gruss, Hans


als Antwort auf: [#560410]
(Dieser Beitrag wurde von Hans Haesler am 9. Nov 2017, 17:22 geändert)

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

7. Nov 2017, 11:46
Beitrag # 7 von 15
Beitrag ID: #560471
Bewertung:
(5919 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
vielen Dank für deine Arbeit.
Habe allerdings eine Frage:
Wo finde ich die Zuweisung bzw. Übersetzung, wenn Kundennummer 1000 dann Mailadresse test1@test.de oder Kundennummer 1001 dann Mailadresse test2@test.com usw?

Gruss
Uwe


als Antwort auf: [#560466]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

7. Nov 2017, 12:16
Beitrag # 8 von 15
Beitrag ID: #560475
Bewertung:
(5918 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

bitte sehr.

Das Script holt die Kundennummer aus dem Dateinamen und zieht 999 davon ab.
Das Ergebnis ist die Position in der Liste zu Beginn des Codes.

Gruss, Hans


als Antwort auf: [#560471]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

7. Nov 2017, 12:40
Beitrag # 9 von 15
Beitrag ID: #560478
Bewertung:
(5915 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

habe es verstanden.
Kann man es nicht so machen:
Wenn Kundennummer ist 1001 dann test1@pro-file-com.de
wenn Kundennummer ist 1020 dann test2@test.com?

Hintergrund ist der, das ich ca. 300 Kundennummer habe, aber nicht alle bekommen PDF´s per Mail zugeschickt.
Wenn ich es richtig verstehe, muß ich 300 Mailadressen (evtl. auch als Dummy) eingeben, damit das Script arbeitet.
Falls es aber nicht anders möglich ist, werde ich das so machen. Ist ja nur eine einmalige Aktion.

Gruss
Uwe


als Antwort auf: [#560475]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

7. Nov 2017, 13:01
Beitrag # 10 von 15
Beitrag ID: #560480
Bewertung:
(5910 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

bin beim Zahnarzt. Werde später antworten. Aber vermutlich erst gegen Abend.

Gruss, Hans


als Antwort auf: [#560478]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

7. Nov 2017, 14:39
Beitrag # 11 von 15
Beitrag ID: #560486
Bewertung:
(5889 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

ja es ist möglich, mit if/else die entsprechende Adresse zu finden. Aber ziemlich aufwendig und eine Fehlerquelle.

Eine andere Idee: Die Adressen in einer Textdatei erfassen. Zum Beispiel mit „TextWrangler“, mit welchem die Nummern der Zeilen ersichtlich sind.

Wenn kein PDF zugestellt werden muss, die Zeile (= Absatz) leer lassen. Das Script liest diese Datei in den Speicher und verwandelt sie in eine Liste. Die Position in der Liste entspricht der Nummer im Dateinamen.

Gut wäre, bei 1001 zu beginnen. Das ist einfacher beim Erstellen der Textdatei.

Gruss, Hans


als Antwort auf: [#560478]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

7. Nov 2017, 14:59
Beitrag # 12 von 15
Beitrag ID: #560489
Bewertung:
(5888 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das hört sich gut an. Die Kundennummer 1000 ist nicht vorhanden. Nur für mich zum testen. Los geht es ab 1001

Gruss
Uwe


als Antwort auf: [#560486]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

9. Nov 2017, 17:17
Beitrag # 13 von 15
Beitrag ID: #560606
Bewertung:
(5796 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

das gespeicherte Droplet ist an diesen Beitrag angehängt.

Wie per PM besprochen, werden nun mehrere PDF-Dateien mit derselben Nummer an die gleiche Mai-Message gehängt.
Das klappte auf Anhieb. Aber das Einfügen eines Returns nach jedem Anhang wollte nicht gelingen. Schliesslich fand ich eine Lösung: Beim Erzeugen der Mitteilung wird dem Inhalt des 'bodys' eine Menge Returns zugewiesen. Beim Anhängen wird ein Zählerwert benutzt, damit zwischen zwei Anhängen ein Return ist.

Die vierstelligen Nummern sind nicht fortlaufend. Also geht das Errechnen der Position in der Liste der Adressen nicht.
Damit das Erstellen der Liste mit den Kundenadressen einfacher ist, fordert das Script zu Beginn auf, die Textdatei zu wählen, welche die Kundennummern und die Adressen enthält.

Das Script merkt sich den Pfad zu dieser Datei. Der Dialog kommt erst wieder, wenn die Datei umbenannt oder verschoben wurde. Oder wenn das Script neu gespeichert wird.

Die Adressen-Datei wird eingelesen und in eine Liste verwandelt.

Die gedropptren PDF-Dateien werden zu einem Handler geschickt, welcher die Kundennummer speichert. Er geht die Liste durch und wenn eine Übereinstimmung der Nummer gefunden ist, wird aus dem Listenelement die Adresse herausgetrennt.

Code
(* 
Mailversand_02d.app
© 09.11.2017 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# die Datei der Kundenadressen
property adrFile : ""

# eine weitere 'property'
property msgBody : "Anbei: PDF-Datei(en)"

# drei Variablen als 'global' definieren
global adrList
global nAdr
global oldNbr
global notGood
global notFound
global pCtr


############################################################
# der 'Run Handler' erlaubt, die Ausführung mit einem Doppelklick zu starten
on run
# die Datei der Kundenadressen auswählen (falls nicht gefunden)
if adrFile is "" then
set adrFile to (choose file with prompt "Die Kundenadressen-Datei wählen:") as Unicode text
end if

# prüfen, ob die Datei existiert
set notFound to false
tell application "Finder"
if not (adrFile exists) then
set notFound to true
end if
end tell
# wenn nicht: auffordern, die Datei zu wählen
if notFound then
set adrFile to (choose file with prompt "Die Kundenadressen-Datei wählen:") as Unicode text
end if

# prüfen, ob es eine Textdatei ist
if not (adrFile ends with ".txt") then
display dialog "Bitte eine *Text*-Datei wählen." buttons "OK" default button 1 with icon 2
set adrFile to ""
error number -128
end if

# die Datei einlesen ...
set adrStr to read file adrFile
if adrStr contains return then
set retChar to ASCII character 13
else if adrStr contains linefeed then
set retChar to ASCII character 10
end if

# ... und in eine Liste verwandeln
set AppleScript's text item delimiters to retChar
set adrList to every text item of adrStr
set AppleScript's text item delimiters to {""}
set nAdr to count of adrList

# den Handler aufrufen, welcher einlädt, eine ".pdf"-Datei zu wählen
set pdfPath to (choose file with prompt "Die PDF-Datei wählen.") as Unicode text

# prüfen, ob eine PDF-Datei ausgewählt wurde
if not (pdfPath ends with ".pdf") then
display dialog "Nur PDF-Dateien, bitte." buttons "OK" default button 1 with icon 0
error number -128
end if

# zwei Variablen initialisieren
set oldNbr to -1
set notGood to 0
set notFound to 0

# die Datei zum Handler 'workFile()' schicken
set defString to workFile(pdfPath)

# das Ende der Aktion verkünden
activate me
if (notGood + notFound) is 0 then
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
else
if notGood is 1 then
display dialog "Ein Dateiname mit ungültiger Kundennummer." buttons "OK" default button 1 with icon 2
else if notGood is greater than 1 then
display dialog "" & notGood & " Dateinamen mit ungültiger Kundennummer." buttons "OK" default button 1 with icon 2
end if
if notFound is 1 then
display dialog "Eine Kunden-Adresse nicht gefunden." buttons "OK" default button 1 with icon 2
else if notFound is greater than 1 then
display dialog "" & notFound & " Kunden-Adressen nicht gefunden." buttons "OK" default button 1 with icon 2
end if
end if

end run


############################################################
# der 'Open Handler' reagiert, wenn Objekte auf das Icon des Scripts gedroppt werden
on open allObjects
global adrList
# die Datei der Kundenadressen auswählen (falls nicht gefunden)
if adrFile is "" then
set adrFile to (choose file with prompt "Die Kundenadressen-Datei wählen:") as Unicode text
end if

# prüfen, ob die Datei existiert
set notFound to false
tell application "Finder"
if not (adrFile exists) then
set notFound to true
end if
end tell
# wenn nicht: auffordern, die Datei zu wählen
if notFound then
set adrFile to (choose file with prompt "Die Kundenadressen-Datei wählen:") as Unicode text
end if

# prüfen, ob es eine Textdatei ist
if not (adrFile ends with ".txt") then
display dialog "Bitte eine *Text*-Datei wählen." buttons "OK" default button 1 with icon 2
set adrFile to ""
error number -128
end if

# die Datei einlesen ...
set adrStr to read file adrFile
if adrStr contains return then
set retChar to ASCII character 13
else if adrStr contains linefeed then
set retChar to ASCII character 10
end if

# ... und in eine Liste verwandeln
set AppleScript's text item delimiters to retChar
set adrList to every text item of adrStr
set AppleScript's text item delimiters to {""}
set nAdr to count of adrList

# zwei Variablen initialisieren
set oldNbr to -1
set notGood to 0
set notFound to 0

# Wiederholschleife, welche die gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat

# das Ende der Aktion verkünden
activate me
if (notGood + notFound) is 0 then
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
else
if notGood is 1 then
display dialog "Ein Dateiname mit ungültiger Kundennummer." buttons "OK" default button 1 with icon 2
else if notGood is greater than 1 then
display dialog "" & notGood & " Dateinamen mit ungültiger Kundennummer." buttons "OK" default button 1 with icon 2
end if
if notFound is 1 then
display dialog "Eine Kunden-Adresse nicht gefunden." buttons "OK" default button 1 with icon 2
else if notFound is greater than 1 then
display dialog "" & notFound & " Kunden-Adressen nicht gefunden." buttons "OK" default button 1 with icon 2
end if
end if

end open

############################################################
# im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist;
# der Inhalt des Hauptordners wird aufgelistet; Dateien werden zum Handler 'processFile' gesandt.
on processObject(aObject)
# wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner oder eine App ...
set curObject to aObject as string
if curObject ends with ":" then
# Ordner und Apps werden nicht berücksichtigt
else
if curObject ends with ".pdf" then
# die Datei zum Handler 'workFile()' schicken
workFile(curObject)
end if
end if
end processObject

############################################################
# der Handler, welcher die PDF-Dateien an "Mail" übergibt
on workFile(pdfPath)
# drei Variablen initialisieren
set curNbr to 0
set okay to true

# die Nummer ausziehen
try
set strNbr to (text -8 thru -5 of pdfPath)
set curNbr to strNbr as integer
on error
# die PDF-Datei hat keine gültige Nummer: eine Etikette zuweisen
tell application "Finder"
set label index of file pdfPath to 2
end tell
set okay to false
set notGood to notGood + 1
end try

# die Nummer prüfen und die Adresse zuweisen
if okay then
if curNbr is greater than 999 then
# die Adresse zuweisen
set msgAddress to ""
repeat with n from 1 to nAdr
set curItem to item n of my adrList
if curItem starts with strNbr then
set msgAddress to text 6 thru -1 of curItem
exit repeat
end if
end repeat
if msgAddress is "" then
# die aktuelle Adresse ist nicht vorhanden: eine Etikette zuweisen
tell application "Finder"
set label index of file pdfPath to 3
end tell
set okay to false
set notFound to notFound + 1
end if
if okay then
# die aktuelle Nummer ist nicht die vorherige
if curNbr is not oldNbr then
# die Mail-Message vorbereiten
set msgSubject to name of (info for (file pdfPath))
tell application "Mail"
activate
set newMessage to make new outgoing message with properties ¬
{subject:msgSubject, content:msgBody & return & return & return & return & return & ¬
return & return & return & return & return & return & return & return & return & return & ¬
return & return & return & return & return & return & return & return & return & return}
tell newMessage
set visible to true
make new to recipient at end of to recipients with properties {address:msgAddress}
tell content
# die erste Datei anhängen
set pCtr to 2
make new attachment with properties {file name:pdfPath as alias} at after paragraph pCtr
end tell
end tell
end tell
# eine Etikette zuweisen
tell application "Finder"
set label index of file pdfPath to 6
end tell
set oldNbr to curNbr
# die aktuelle Nummer ist gleich wie die vorherige
else if curNbr is oldNbr then
set pCtr to pCtr + 2
tell application "Mail"
tell outgoing message 1
tell content
# die weiteren Dateien anhängen
make new attachment with properties {file name:pdfPath as alias} at after paragraph pCtr
end tell
end tell
end tell
# eine Etikette zuweisen
tell application "Finder"
set label index of file pdfPath to 6
end tell
end if
end if
end if
end if
end workFile

Als Betreff wird der Name der ersten PDF-Datei eingefügt und die erste Zeile der Mitteilung ist: "Anbei: PDF-Datei(en)". Das kann geändert werden.

Gruss, Hans


als Antwort auf: [#560489]
Anhang:
Mailversand_02d.zip (71.3 KB)

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Uwe Beutler-Bußmann
Beiträge gesamt: 95

10. Nov 2017, 08:20
Beitrag # 14 von 15
Beitrag ID: #560614
Bewertung:
(5697 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,
vielen Dank für die Ausarbeitung und Zusendung des Scripts.
Ich habe es ausprobiert, es funktioniert super.
Genau das, was ich wollte.
Ich hätte es alleine nicht hinbekommen. Ich werde es der Kollegin, die es verwenden soll gleich einmal vorführen. Ich denke sie wird "entzückt" sein.

Nochmals vielen Dank und ein schönes Wochenende

Gruss,
Uwe


als Antwort auf: [#560606]

Mailversand per Droplet - Empfänger anhand Dateinamen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

10. Nov 2017, 08:44
Beitrag # 15 von 15
Beitrag ID: #560616
Bewertung:
(5693 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

bitte sehr. Und danke für die prompte Rückmeldung.

Falls Änderungswünsche geäussert werden sollten: bitte durchgeben!

Gruss, Hans


als Antwort auf: [#560614]
X