Outlook-Script zum Speichern mehrerer Mails im Batch +.txt-Datei

  • Outlook

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Outl.VB Frischling.

    Outlook-Script zum Speichern mehrerer Mails im Batch +.txt-Datei

    Hallo Allerseits,

    ich habe in einem anderen Forum eine Lösung zum speichern mehrerer Dateien im MSG-Format gefunden die mich total begeistert. Meine Aufgabe ist es, mit dem Programm BvL Archivio, gesendete Outlook-Nachrichten zu archivieren. Hierzu sollen die Dateien auf einem Pfad gespeichert und von dort per FTP auf den Server geladen werden. Das speichern der MSG-Dateien klappt perfekt, das hochladen auf den FTP ist ebenfalls geregelt.
    Mein Problem ist nun dass ich neben den MSG-Dateien noch jeweils eine TXT-Datei pro MSG-Datei als Steuerdatei erzeugen muss. Diese TXT-Datei enthält fest definierte Steuerzeichen wie %Start% %Archiv B% dann den Dateinamen der Steuerdatei und dann %Ende%. Auch der Name der TXT-Datei muss den gleichen Namen wie jede einzelne MSG-Datei haben. Leider bekomme ich es (mangels Kenntnissen in VB) nicht hin diese 2. Datei zu erzeugen und wäre über die Hilfe eines Profi's hocherfreut.

    Das Script zum speichern der .MSG-Datei hab ich als Modul1.txt angehängt
    Dateien
    • Modul1.txt

      (20,77 kB, 332 mal heruntergeladen, zuletzt: )
    Hi petaod
    vielen Dank für die Info. Hab das gleich mal probiert, bekomme aber leider nur Fehlermeldungen (u.a. Error #438). Wie bereits erwähnt, ich bin bzgl. VB noch im Tal der Ahnungslosen und weiß gerade nicht WIE ich es einbaue. Hab das einmal im Case unter vExtConst = olMSG wie folgt eingebaut:

    Visual Basic-Quellcode

    1. Dim fso, f
    2. Set fso = CreateObject("Scripting.FileSystemObject")
    3. Set f = fso.OpenTextFile("\\...\Archivio" & strFinalFileName)
    4. f.WriteLine = strFinalFileName


    2. Versuch war als separate Function, komplett so wie im Beispiel von MS. Auch das blieb leider ohne Erfolg. Ich muss auch gestehen, ich hab keine Ahnung was genau ich da tue.

    Outl.VB Frischling schrieb:

    \\...\Archivio
    Ich hoffe, da hast du gekürzt, oder steht das so drin?

    Outl.VB Frischling schrieb:

    f.WriteLine = strFinalFileName
    Was soll das =?
    Das steht kaum bei Microsoft so im Beispiel.

    Outl.VB Frischling schrieb:

    ich hab keine Ahnung was genau ich da tue
    Das hättest du nicht dazu schreiben müssen ;)

    Versuch es zu verstehen, sonst wirst du nicht glücklich.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Den Dateipfad hab ich gekürzt, richtig. Sieht im Original natürlich anders aus.

    f.WriteLine = strFinalFileName --> in die .txt-Datei soll der Dateiname der .MSG-Datei geschrieben werden. Wenn ich dich richtig verstehe, ist das wohl falsch!?

    Ich versuche seit vielen Stunden es zu verstehen aber als frisch eingeschulten "Erstklässler" ist das bei dem Umfang nicht leicht. Ich muss zugeben, ich bin gerade ziemlich überfordert und sehe nur noch böhmische Dörfer :(

    Um so dankbarer bin ich dass du schon 2 mal geantwortet hast :)
    Wenn du dir den Microsoft-BeispielCode nochmals vor Augen führst, siehst du auf Anhieb zwei Fehler:
    Wie bereits erwähnt ist die Syntax von WriteLine falsch.
    Du öffnest die Datei nicht im Schreibmodus.

    Ein einfaches für dich geeignetes Beispiel wäre

    Visual Basic-Quellcode

    1. ​Sub WriteLineToFile
    2. Const ForWriting = 2
    3. Dim fso, f
    4. Set fso = CreateObject("Scripting.FileSystemObject")
    5. Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True)
    6. f.WriteLine "Hello world!"
    7. f.Close
    8. End Sub
    Das ist fast wörtlich von Microsoft abgeschrieben.

    Ist das wirklich so schwer?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Leicht ist das nicht für einen blutigen Anfänger, allerdings. Es ist noch kein Meister vom Himmel gefallen ;)

    Komplett ab Sub funktioniert nicht innerhalb des Case "MSG". "Fehler beim Kompilieren: End Function erwartet"
    Hab das auch ohne

    Visual Basic-Quellcode

    1. Sub WriteLineToFile()
    und

    Visual Basic-Quellcode

    1. End Sub
    probiert, dann sagt er mir "Fehler beim Kompilieren: Exit Sub nicht zulässig in Function oder Property".

    Durch das ganze rumbasteln hab ich mir gerade auch das ganze Projekt zerschossen, zum Glück gibt es Backups. :)

    Also verstanden hab ich das obige Beispiel, denke ich zumindest. Aber der für mich schwierigste Teil scheint momentan, wie ich das in das Modul reinbekomme, und zwar so dass ich mit einem Klick alle markierten Dateien exportiere UND die TXT-Datei mit dem Namen der MSG-Datei als Inhalt schreibe UND die TXT-Datei (abgesehen von der Endung) den gleichen Dateinamen erhält.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Outl.VB Frischling“ ()

    Hab mal 3 Varianten hochgeladen bei denen es zu Fehlern kommt. Bin derzeit zuhause und muss das alles aus dem Gedächtnis im Texteditor nachstellen aber ich denke ich hab mich nicht verkopiert.
    Dateien
    • Variante1.txt

      (21 kB, 257 mal heruntergeladen, zuletzt: )
    • Variante2.txt

      (20,97 kB, 136 mal heruntergeladen, zuletzt: )
    • Variante3.txt

      (21 kB, 174 mal heruntergeladen, zuletzt: )
    Naja.
    Ob Dim und Const innerhalb eines Case gefressen werden, kann ich dir auch nicht sagen.
    Jedenfalls gehören sie dort nicht hin.
    Da du vermutlich sowieso nicht mit "Option Explicit" arbeitest, wird es reichen, wenn du in deinem Case den ausführenden Code-Teil einbaust:

    Visual Basic-Quellcode

    1. Case "MSG":
    2. Set fso = CreateObject("Scripting.FileSystemObject")
    3. Set f = fso.OpenTextFile(strFullPath & ".txt", 2, True)
    4. strFullPath = strFullPath & ".msg"
    5. f.WriteLine strFullPath
    6. f.Close
    7. vExtConst = olMSG


    Und noch was:
    Es ist lästig, wenn du jedesmal deinen kompletten Code als Text-Dateien anhängst.
    Das Forum hat Code-Tags.
    Damit kannst du Code-Ausschnitte einfügen.
    Und bitte nur den relevanten Teil.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey das sieht ja schonmal sehr geil aus :)

    Wenn ich das jetzt so 1:1 übernehme, meckert er allerdings doch dass die Variable nicht definiert ist und bleibt bei

    Quellcode

    1. fso =
    hängen.
    Daraufhin hab ich

    Visual Basic-Quellcode

    1. Dim fso As NewFile
    definiert. Nun hängt er bei

    Visual Basic-Quellcode

    1. .OpenTextFile
    und sagt Methode oder Datenobjekt nicht gefunden. Hier hab ich schon fleißig gegoogelt, hab es mit

    Visual Basic-Quellcode

    1. Const fsoForWriting = 2
    versucht (Dim und Const oben direkt unter der Private Function), alles jedoch ohne Erfolg.

    Das verstehe ich jetzt allerdings garnicht denn jedes Beispiel was ich gefunden habe ist in etwa gleich aufgebaut und die Methode unter msdn.microsoft.com/en-us/library/office/gg278834.aspx so beschrieben.

    Vielleicht sollte ich noch erwähnen dass ich mit Outlook 2010 arbeite, keine Ahnung ob es da in dem Bereich Unterschiede gibt.
    Also doch Option Explicit.

    Outl.VB Frischling schrieb:

    Dim fso As NewFile
    Müsste heissen: Dim fso As Object, f as Object

    Outl.VB Frischling schrieb:

    .OpenTextFile
    Da wäre die ganze Zeile interessant.
    Veröffentliche mal die paar Zeilen, die direkt in dem Case "MSG" stehen.

    Outl.VB Frischling schrieb:

    Const fsoForWriting = 2
    Weil ich nicht weiss, was du so produzierst, habe ich deswegen in meinem Code die 2 hart codiert, so dass das nicht nötig ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual Basic-Quellcode

    1. Dim fso As Object, f as Object
    hat's gebracht. YES YES YES, petaod Du bist mein Gott :)

    Nun funktioniert alles PERFEKT! Vielen vielen Dank für diese tolle Hilfe, ich bin gerade total aus dem Häuschen.