PDF Dateien aus einem Ordner einzeln als jeweils 1 E-Mail verschicken?

  • Hallo,


    wir haben so um die 500 PDFs in einem Ordner, die wir gerne als einzelne E-Mails zur Bearbeitung weitereleiten müssen an 1 Empfänger.

    Ich meine hier schon mal ein Script oder eine Anleitung gesehen zu haben wie man dsa machen kann, aber war auf die schnelle noch nicht fündig geworden.


    riawie hattest du nicht so was schon mal gemacht?


    Sprich einfach mit einem Script oder sonst was, sagen alle Dateien aus Ordner XXX jeweils einzeln an Adresse xxx@domain.de schicken


    DAnke vorab für Eure Ideen oder hilfen.


    Und ja es wäre ggf einfacher nen Ordner friezugeben etc, aber so kann ich kontrollieren wie weit der Mitarbeiter mit abarbeiten ist. Also andere VOrgehensweise zur Abarbeitung brauche ich nicht :D nur den hinweis wie das automatisch geht ;)


    DANke vorab

  • Könnte als VBScript grob so aussehen (Achtung KI erstellt ;-))
    PDFs dürfen keine Leerzeichen im Dateinamen haben, Pfade, Adressat müssten angepasst werden. Die Smileys 8) sind eine Acht mit Klammer zu. ;)


    Option Explicit


    ' Pfad zum Verzeichnis mit den PDF-Dateien

    Const SourcePath = "C:\MeinVerzeichnis\"


    ' Zielpfad für die Ausgabedateien

    Const TargetPath = "c:\david\apps\faxware\out\api\"


    ' Erstellen des FileSystemObject

    Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")


    ' Überprüfen, ob das Quellverzeichnis existiert

    If Not objFSO.FolderExists(SourcePath) Then

    WScript.Echo "Das Verzeichnis " & SourcePath & " existiert nicht."

    WScript.Quit

    End If


    ' Überprüfen, ob der Zielpfad existiert und ggf. erstellen

    If Not objFSO.FolderExists(TargetPath) Then

    objFSO.CreateFolder TargetPath

    End If


    ' Erstellen des Ordners als Objekt

    Dim objFolder : Set objFolder = objFSO.GetFolder(SourcePath)


    ' Schleife durch alle Dateien im Ordner

    Dim objFile, fileName, fileExt, targetFilePath, objTargetFile

    For Each objFile In objFolder.Files

    ' Überprüfen, ob die Datei eine PDF-Datei ist

    fileName = objFSO.GetBaseName(objFile)

    fileExt = objFSO.GetExtensionName(objFile)

    If LCase(fileExt) = "pdf" Then


    ' Erstellen eines zufälligen Dateinamens für die Zieltextdatei (8 Zeichen)

    Dim randomName : randomName = Left(CreateObject("Scriptlet.TypeLib").GUID, 8) & ".txt"

    targetFilePath = objFSO.BuildPath(TargetPath, randomName)


    ' Öffnen der Zieltextdatei im Anhang-Modus oder Neuerstellung falls noch nicht vorhanden

    If Not objFSO.FileExists(targetFilePath) Then

    Set objTargetFile = objFSO.CreateTextFile(targetFilePath)

    Else

    Set objTargetFile = objFSO.OpenTextFile(targetFilePath, 8)

    End If

    'Hier wird dann der Job generiert

    objTargetFile.WriteLine("@@nmr Benutzer@meine.domain")

    objTargetFile.WriteLine("@@subject Bitte dieses PDF bearbeiten")

    objTargetFile.WriteLine(" Das ist dann der Text der in der Mail steht, kann u.U. nur im Plain Text angezeigt werden")

    ' Schreiben des Dateinamens in die Zieltextdatei

    objTargetFile.WriteLine("@@Attach " & SourcePath & fileName & "." & fileExt & " , del")


    ' Schließen der Zieltextdatei und Aufräumen der Variablen und Objekte

    objTargetFile.Close

    Set objTargetFile = Nothing


    End If

    Next


    ' Umbenennen der Ausgabedateien, um nur die Erweiterung zu entfernen

    Dim newFileName : Dim newFilePath : Dim oldFileName : Dim sourceFilePath

    Set objFolder = objFSO.GetFolder(TargetPath)


    For Each objFile In objFolder.Files

    ' Überprüfen, ob die Datei eine TXT-Datei ist

    oldFileName = objFSO.GetFileName(objFile)

    fileName = objFSO.GetBaseName(objFile)

    fileExt = objFSO.GetExtensionName(objFile)

    If LCase(fileExt) = "txt" Then


    newFileName = filename

    targetFilePath = objFSO.BuildPath(TargetPath, newFileName)

    sourceFilePath = objFSO.BuildPath(TargetPath, oldFileName)

    If objFSO.FileExists(targetFilePath) Then

    objFSO.DeleteFile targetFilePath

    End If


    objFSO.MoveFile sourceFilePath, targetFilePath


    End If

    Next


    Set objFolder = Nothing

    Set objFSO = Nothing

  • da lobe ich mir meinen Linux Fileserver, wenn ich so einen Job machen müsste wäre das ein Einzeiler die Mails zu verschicken :)

    Prinzipell also:

    for Dateiname in * ; do echo "Text welcher in der eMail stehen soll @@own DavidBenutzernameDesAbsenders@@" | mail -s "Betreff der Mail" -a $Dateiname Empfaenger@domain.tld ; done

    Oder etwas konkreter:

    for Dateiname in *.pdf ; do echo "Hallo Herr XYZ\n\nAnbei $Dateiname zur Bearbeitung\n\nMit freundlichen Grüßen XYZ\n  @@own MeinDavidBenutzername@@" | mail -s "Betreff der Mail" -a $Dateiname Empfaenger@domain.tld ; done

    Das wäre es dann in meinem Fall auch schon und im Ergebnis würden alle pdf Dateien im aktuellen Verzeichnis an den gewünschten Empfänger versendet werden.

    Im Grunde lässt sich das allerdings auch mit David Bordmitteln erledigen, allerdings ist das tatsächlich schon eine ganze Weile her das ich die Notwendigkeit hatte und ich hab das nie aufgeschrieben.

    Eine Serienmail Software dafür zu verwenden käme mich nicht in den Sinn, weil ich dann ja erst mal eine Liste mit den ganzen Dateien welche zu versenden sind bauen müsste :o

    Wenn ich mir die Mühe machen wollte würde ich gleich die David FileScan Services dafür nutzen und dann je PDF Datei eine .txt Datei mit den Versandanweisungen zusammen mit der PDF Datei in das Filescan Verzeichnis kippen.
    Wenn das ganze dann noch ein wiederkeherendes Ding wäre würde ich schon das erzeugen der txt Dateien automatisieren.

    Sollen alle PDF Dateien an den gleichen Empfänger gehen kann man die vollständige eMail gleich als Vorab Include Datei samt @@AN Empfänger@@ und @@OWN DavidBenutzernameDesAbsenders@@ Befehl im jeweiligen Filescan Eintrag hinterlegen und braucht nur noch das anhängen der PDF Dateien via @@ATTACH Pfad\zur\Datei\Dateiname@@ als einzigem Inhalt der .txt Dateien im Filescan Verzeichnis zu übergeben.

    Im Grunde kann man diese TXT Dateien auch via cmd Batch Datei bzw. sogar einem ähnlichen Einzeiler wie oben erzeugen.

    Also in etwa
    for %D in (*.pdf) do (echo "@@ATTACH c:\Anhaenge\%D" > c:\FilescanDir\%D.txt)

    Wenn man den Befehl in dem Verzeichnis in welchem die PDF Dateien liegen ausführt erzeugt das dann je PDF Datei eine .pdf.txt Datei mit folgendem Inhalt:

    "@@ATTACH c:\Anhaenge\NameDerPDFDatei.pdf"

    Ist der Filescan Service (David Administrator > System > Erweitert > Services > Neu...) vorher passend eingerichtet worden werden damit alle PDF Dateien im Verzeichnis c:\Anhaenge per Mail an den gewünschten Empfänger Versandt.

    Im Grunde ist das wirklich simpel ;)

    Viele nutzen das sogar automatisiert aus verschiedenen Systemen heraus um so via David Belege per Mail zu verschicken.
    Das geht aber eben auch von Hand mit wenig Aufwand.
    Ich sag mal so, ab etwa 30 Dateien die zu 30 Mails werden sollen würde ich das so machen, weil das schneller geht als es einzeln von Hand zu tun ;)

    Da ich allerdings alle meine Daten auf Linux basierten Fileservern liegen habe würde ich meinen ganz am Anfang genannten Weg schon ab nur 2 Mails ans gleiche Zeil bevorzugen ;)
    Hätte ich allerdings keinen Linux Fileserver, oder würden das normale Anwender machen sollen, dann würde ich den Weg mit den FileScan Services von David gehen.

    Wichtig ist das der FileScan Service Ordner auf dem David Server liegen muss. ebenso wie der Ordner wo die anzuhängenden PDF Dateien liegen.
    Im Zweifel also dafür eine Freigabe auf dem David Server anlegen in welcher dann je ein Verzeichnis für die PDF Dateien und eines für die txt Dateien Platz finden.

    PS: das hier aufzuschreiben ist deutlich aufwändiger als es einfach zu tun ;)

  • OK, also das was du geschrieben hast sollte ichs dann einfach mit deinen befehlen so machen können? Ich muss mir das gleich mal anschauen. Ja das ist etwas was nun regelmäßig kommen wird. Daher dachte ich diese Software, die ja für dummy's zu nutzen ist :D wenn du aber sagst mir den zwei drei befehlen in ausführen würde auf einem Windows Server auch klappen, dann kann ich das gerne salt probieren, bevor ich die 100 Euro ausgebe. Hab den file scan con David noch nie aktiv genutzt :)

  • ja, das klappt mit sehr kleinen Bordmitteln.
    Im Grunde steht alles was man wissen muss in der Online Hilfe ;)
    Für mich sind das halt Fingerübungen die ich grundsätzlich auch zwischen Tür und Angel einfach mal so erledige.
    Es selbst zu tun und es anderen zu erklären sind allerdings halt 2 paar Schuhe ;)
    Ich kann da auch leider die nächsten Tage keine weiteren Antworten auf Nachfragen zu versprechen, da ich aktuell eigentlich schon für diese beiden Antworten keine wirkliche Zeit habe :huh: :S

  • Auch das von mir bereitgestellte Script nutzt den eh schon vorhandenen API FileScanService mit den erweiterten Befehlen zur Adressierung und Betreff. Da muss man halt nach dem Erstellen der Dateien die Dateiendung noch wegnehmen.
    Wobei letzteres bei Riawies Lösung auch ein Fallstrick sein kann. Wenn die Datei direkt mit der richtigen Endung hingelegt wird, kann es (selten) passieren, dass der ServiceLayer die Datei schon verarbeitet hat, bevor der Befehl drin steht.

  • Auch das von mir bereitgestellte Script nutzt den eh schon vorhandenen API FileScanService mit den erweiterten Befehlen zur Adressierung und Betreff. Da muss man halt nach dem Erstellen der Dateien die Dateiendung noch wegnehmen.
    Wobei letzteres bei Riawies Lösung auch ein Fallstrick sein kann. Wenn die Datei direkt mit der richtigen Endung hingelegt wird, kann es (selten) passieren, dass der ServiceLayer die Datei schon verarbeitet hat, bevor der Befehl drin steht.

    Problem bei deinem Script keine Leerzeichen. Ich habe alle PDfs markiert, f2 gedrückt und dann umbenannt. Dann macht der alle name (1) und hat somit immer ein Leerzeichen drin.

  • ja, das klappt mit sehr kleinen Bordmitteln.
    Im Grunde steht alles was man wissen muss in der Online Hilfe ;)
    Für mich sind das halt Fingerübungen die ich grundsätzlich auch zwischen Tür und Angel einfach mal so erledige.
    Es selbst zu tun und es anderen zu erklären sind allerdings halt 2 paar Schuhe ;)
    Ich kann da auch leider die nächsten Tage keine weiteren Antworten auf Nachfragen zu versprechen, da ich aktuell eigentlich schon für diese beiden Antworten keine wirkliche Zeit habe :huh: :S

    Wenn ich es heute Abend (sind im Urlaub) wenn die Kids schlafen nicht schnell hin bekomme. Nehme ich doch das serienmail plugin :)

  • Du wirst bei Dateinamen mit Leerzeichen auch bei Riawies Lösungen Probleme bekommen, da der Attach Befehl m.E. da der pingelige ist. U.U. hilft es wenn man den Pfad der Datei noch in Anführungszeichen setzt. Bei mir sieht das dann so aus:
    objTargetFile.WriteLine("@@Attach """ & SourcePath & fileName & "." & fileExt & """ , del")

    Das ,del kannst du auch weglassen wenn die PDF nach der Verarbeitung durch den ServiceLayer nicht gelöscht werden sollen.
    Auf jeden Fall bei den Tests auch den Ereignisordner im David Client im Auge behalten, da werden dann auftretende Fehler wie Dateianhang nicht gefunden usw. protokolliert.

  • So ich habe die vorherigen Beiträge mal gelöscht, damit andre nicht was falsches lesen ;)


    Ich hatte 2 Fehler:

    Verzeichnispfad beim FileScan

    Den Filescan Verzeichnispfad musste mit \*.txt enden, was auch logisch ist, weil danach soll er ja scannen :D

    Gut ist mir aufgefallen weil ein anderer für IMPROT Fax vorhanden war.


    Dateinahmen ohne Leerzeichen

    Dann habe ich mit cmd und ren den Dateinahmen das Leerzeichen gekillt.

    Danach dann die txt erneu erstellen lassen und nun hat es funktiniert.

    Zwar ist der Betreff nicht sonderlich sch=ön, aber gut, habe ich mit der include Dateie dann und @@Betreff XXX@@ dann einen bestimmten genommen. perfekt wäre wenn man den Betreff anhand der Attach Datei erstellen könnte.


    Aber das geht wahrscheinlich nicht oder?!


    Falls ihr mit hier noch helfen könntet wäre super. Wenn das nicht so einfach klappt, sondern nur mit dem script von wizard in vbasic dann ist es eben so und ich lasse es nun so ;) die rund 500 Emails sind nun jedenfalls richtig mit den PDFs im Eingang.

    Einmal editiert, zuletzt von lycra ()

  • Nee, meinte schon die Kommandozeile ;) Einfach erweitern:und dann den @@Betreff Befehl natürlich aus dem Include entfernen.

    for %D in (*.pdf) do (echo "@@betreff Bearbeite PDF %D@@@@ATTACH c:\Anhaenge\%D" > c:\FilescanDir\%D.txt)
  • Nee, meinte schon die Kommandozeile ;) Einfach erweitern:und dann den @@Betreff Befehl natürlich aus dem Include entfernen.

    for %D in (*.pdf) do (echo "@@betreff Bearbeite PDF %D@@@@ATTACH c:\Anhaenge\%D" > c:\FilescanDir\%D.txt)

    Perfekt danke das hat geklappt. Nun ist zwar so das er erst ab date1 dann datei 11 dann 111 nimmt bevor datei2 datei 3 zuw. Aber gut das egal :)


    Danke euch allen!!! Die 100 Euro für serienmail gespart :D

  • Und wenn du die aktuelle Version hast, kannst dir auch noch den Spaß mit den Leerzeichen im Dateinamen sparen. Release Notes vom August letzten Jahres:


    • Anhängen von Dateien mit Leerzeichen im Dateinamen per Attach Befehl

      Soll per Befehl @@Attach eine Datei mit Leerzeichen im Dateinamen angehängt werden, so funktionierte dies nicht. Wird der Dateiname in Anführungszeichen gesetzt, so wird die Datei nun angehängt.

    Heißt, die Befehlszeile müsste korrekt dann so aussehen, führendes/Schließendes Anführungszeichen beim echo Befehl ist wohl nicht notwendig.

    for %D in (*.pdf) do (echo @@betreff Bearbeite PDF %D@@@@ATTACH "c:\Anhaenge\%D" > c:\FilescanDir\%D.txt)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!