Gesendetet und Empfangene Emails in Outook automatisch auf der Festplatte speichern MIT Anhang

  • Sonstige

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von PaddeL235.

    Gesendetet und Empfangene Emails in Outook automatisch auf der Festplatte speichern MIT Anhang

    Hallo zusammen :)

    Ich hab da ein Problem, leider bin ich eigentlich nur Anwender und nicht Programmierer...

    Mein Problem:
    Ich möchte das alle meine Emails automatisch beim eintreffen und senden mit Anhang auf der Festplatte gespeichert werden.

    Ein Teil des Problems habe ich mit dem folgenden Skript gelöst:
    Kurzbeschreibung: Es speichert die Emails per erstelltem Button auf der Festplatte, leider fehlt noch die Automatik.
    Da aber Outlook auch einen Regelassistenten hat wo man auch ein Script auswählen kann muss es ja auch möglich sein...
    Quelle:
    sw-guide.de/microsoft-outlook/…mails-auf-der-festplatte/

    Weiter in der Problemlösung:
    Mit folgendem Script kann man die Anhänge per Regel auf der Festplatte speichern.

    Visual Basic-Quellcode

    1. shared Function GetWord(ByRef s As String) As String
    2. Dim p As Integer
    3. p = InStr(1, s, ",")
    4. If p = 0 Then
    5. GetWord = s
    6. s = ""
    7. Else
    8. GetWord = Left(s, p - 1)
    9. s = Mid(s, p + 1)
    10. End If
    11. End Function
    12. Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    13. Dim mai As Object
    14. Dim eid As String
    15. On Error Resume Next
    16. Do
    17. eid = GetWord(EntryIDCollection)
    18. If eid = "" Then Exit Do
    19. Set mai = Application.session.GetItemFromID(eid)
    20. DoSomethingWithMail mai
    21. Loop
    22. End Sub

    Quelle:
    olfolders.de/Lang/German/script/events.htm

    Ich hab nun alles Mögliche Versucht diese beiden Skripts zusammen zu führen aber ich pack das nicht :(

    Wenn ich meine Zusammenstellungen beim Regelassistenten auswähle passiert nichts beim senden oder Empfangen von Mails.
    Als Fehlermeldung beim Kompilieren bekomme ich diese Fehlermeldung:
    Erwartet Zeilennummer oder Sprungmarke oder Anweisung oder Anweisungsende

    Und stehen bleiben tut es gleich in der ersten Zeile:

    Visual Basic-Quellcode

    1. shared Function GetWord(ByRef s As String) As String
    2. Dim p As Integer
    3. p = InStr(1, s, ",")


    Ich denke das erste Skript muss in das zweite Integriert werden und zwar anstatt der Funktion:

    Visual Basic-Quellcode

    1. DoSomethingWithMail mai


    Dann mit anderen Versuchen hatte ich auch schon die Fehlermeldung:
    Nach End irgendwas dürfen nur noch Kommentare stehen...

    Meine Umgebung:
    Exchange Server
    Outook 2003

    Also ich hab nun viele, sehr viele Fehlgeschlagene Versuche hinter mir und ich denke das ist bestimmt nicht so schwer nur mir fehlen die Hintergrundinfos dazu :(

    Vielleicht kann mich ja einer auf den richtigen Weg führen?
    Ich hoffe ihr könnt mein Problem verstehen, wenn nicht werde ich es versuchen anders zu formulieren aber gerade explodiert mein Kopf...

    Viele Grüße und Danke
    PaddeL235
    Hallo zusammen :)

    Habe ich mich falsch ausgedrückt oder gibt es dazu keine Lösung ?

    Eigentlich dachte ich es müsste ganz einfach sein, diese zwei Skripte miteinander zu kombinieren.

    Oder habe ich noch Informationen vergessen die wichtig wären ?



    Danke und Grüße

    PaddeL
    Und stehen bleiben tut es gleich in der ersten Zeile
    Es gibt in VBA keine "Shared Function"
    Verwende Public oder Private

    wenn ich das richtig sehe, musst du ja auch i-wo darauf reagieren, dass gerade neue Mails eingetroffen sind
    Application_NewMailEx ist der Eventhandler für eingehende Mails.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo ihr zwei :)

    Danke für eure Antworten.

    Also ich hab Shared Function durch Public ersetzt.

    Und das Skipt wird automatisch gestartet beim eintreffen einer neuen Mail, per Regelassistent da kann man auswählen das ein Skript gestartet wird.
    Auswählen kann ich dann eine Funktion inerhalb des Skiptes.

    Leider kommt dann beim eintreffen einer Mail die Meldung:

    Fehler beim Kompielieren:
    Nach End Sub, End Function oder End Proberty können nur Kommentare stehen

    D.h. das Skript wird ausgeführt beim eintreffen einer Mail :)

    Hier noch mein Versuchsaufbau:

    Visual Basic-Quellcode

    1. Public Function GetWord(ByRef s As String) As String
    2. Dim p As Integer
    3. p = InStr(1, s, ",")
    4. If p = 0 Then
    5. GetWord = s
    6. s = ""
    7. Else
    8. GetWord = Left(s, p - 1)
    9. s = Mid(s, p + 1)
    10. End If
    11. End Function
    12. Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    13. Dim mai As Object
    14. Dim eid As String
    15. On Error Resume Next
    16. Do
    17. eid = GetWord(EntryIDCollection)
    18. If eid = "" Then Exit Do
    19. Set mai = Application.session.GetItemFromID(eid)
    20. ' UND anstatt der Funktion DoSomethingWithMail mai '
    21. ' Habe ich auf unterschiedliche weise versucht das Skript ExportEmail.bas bzw. den Inhalt einzufügen
    22. ' http://sw-guide.de/wp-content/uploads_sw-guide/files/ExportEmail.bas'
    23. ' Da muss einiges entfernt werden aber ich hab schon alle erdenklichen Möglichkeiten durch :-('
    24. Loop
    25. End Sub


    Eingefügt habe ich alles in "DieseOutlookSitzung"

    Irgendwie komme ich nicht weiter :(
    Outlook speichert von alleine alle E-Mails ab, in einer Outlook Datei mit der Endung .pst.
    Wenn du Windows 7 nutzt!
    Öffne den Arbeitsplatz.
    Gibt oben in die Adresszeile ein: shell:profile
    Nun gehst du in den Ordner AppData\Local\Microsoft\Outlook

    In der Outlook.pst stehen alle Daten aus Outlook drin.

    PS: Ich nutze Outlook 2007 und bei 2003 ist es das selbe. Wenn die Daten nicht Automatisch gespeichert werden schau mal in die Einstellungen dort kann man das Konfigurieren.
    Hallo Symphonie89 :)

    Danke für deine Antwort, leider hab ich mich wohl falsch ausgedrückt bzw. den Sinn dahinter nicht erklärt...

    PST Files können nur ca. 4GB groß werden, bisher haben wir das immer mit Archiv Dateien geregelt nur ist das dann mit dem Suchen von Email etwas umständlich und der Hauptgrund ist wohl die Performenc da der Exchange Server an einem anderen Standort steht :(

    Ich brauche also die Möglichkeit Emails MIT Anhang auf der Festplatte zu speichern, von Hand per Drag and Drop geht es einwandfrei.
    Und mit dem Skript von hier: sw-guide.de/wp-content/uploads…ide/files/ExportEmail.bas
    Geht es auch per Knopfdruck, aber ich möchte es gern automatiesiert haben so das gleich nach eintreffen der Mail die Email und der Anhang in einen vordefinierten Ordner gespeichert werden...


    PS:
    Wenn die Emails so auf der Festplatte gespeichert werden (msg Format) dann kömnen diese per Windows Suchfunktion durchsucht werden und natürlich auch angelegte Unterordner usw.
    D.h. ich öffne den Ordner, gehe rechts oben auf das suchen Feld und gut :-)


    Aber trotzdem Danke für dein Idee :)
    Grüße
    PaddeL
    Hallo Kevin :)

    Es ist nett das ihr mir andere Lösungswege vorzeigt, aber auch dieser ist leider nicht möglich bzw. nicht effektiv :(

    Es handelt sich wie schon erwähnt um einen Exchange Server, und wir nutzen nicht nur die Email Funktion, sonder auch Adressbuch, Kalender usw. und jetzt nicht noch bitte mit einem anderen Email Server kommen...
    Wir haben den schon über 10 Jahr zwar immer mal wieder geupdatet aber ansonsten sind wir zufrieden :)

    Ich dachte so zwei Skripts zusammen legen wäre einfach, also früher bei C war das nie ein Problem gut da hatte ich auch die Basics aber hier komme ich nicht weiter.

    Vielleicht noch jemand einen Ansatz ?

    PaddeL235 schrieb:

    Es ist nett das ihr mir andere Lösungswege vorzeigt, aber auch dieser ist leider nicht möglich bzw. nicht effektiv :(
    Mit dieser Aussage hast Du dich eigentlich schon disqualifiziert. Aber ich will ja mal nicht so sein.


    Von Adressbuch etc. hast Du oben nichts geschrieben.


    Um da irgendwie ne Chance zu haben zu Helfen, müssten wir mehr Daten haben.

    1. Welche Version von Outlook
    2. Müsste man nachschauen ob Outlook alles in ein Control zeichnet(dann hast Du nämlich nur ein Handle)
    3. Wenn Punkt 1 und 2 ok sind, müsste man noch schauen ob die Daten nicht so intern sind dass man gar nicht dran kommt
    Hey ich hab mir das mal grade nochmal angeschaut.
    Da is auf jedenfall direkt schon ma ein Problem... Wenn kein Betreff angegeben ist, wird die weiterverarbeitung nich gewährleistet.
    Ich forsche ma weiter.
    Würde auch nich den umweg über ein Object gehen, wenn man direkt die Mail als MAilitem einlesen kann!

    Des weiteren.. es wird keine Kommaliste erstellt. es kommt nur eine Zahlenfolged als EntryIDCollection an...

    Visual Basic-Quellcode

    1. Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    2. Dim varEntryIDs
    3. Dim objItem
    4. Dim strFileName As String
    5. Dim i As Integer
    6. varEntryIDs = Split(EntryIDCollection, ",")
    7. For i = 0 To UBound(varEntryIDs)
    8. Set objItem = Application.Session.GetItemFromID(varEntryIDs(i))
    9. 'Debug.Print "NewMailEx " & objItem.Subject
    10. If objItem.Subject = "" Then
    11. strFileName = InputBox("Dateinamen eingeben:")
    12. Else
    13. strFileName = objItem.Subject
    14. End If
    15. objItem.SaveAs "D:\Users\" & strFileName & ".msg", olMSG
    16. Next
    17. End Sub


    Das hier funtioniert,... eigentlich... nur krieg ich bei mehreren Mails immer noch keine Kommaliste, sondern nur eine ID :(
    wenn jemand noch ne idee hat ... (achja is Outlook2007) gabs split schon in 2003?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FloFuchs“ () aus folgendem Grund: So nu klappts... Code bleibt gleich... wobei der split in 2007 weg kann, da da keine liste erstellt wird sondern dass event bei jeder Mail gefeurt wird. btw merke... SOnderzeichen (:) u.ä. aus strFileName entfernen.. sonst meckert er beim speichern

    Einen schönen guten Morgen :)

    @Flufuchs
    Wo hast du dein Skript eingefügt ?
    In DieseOutlookSitzung oder als Modul ?
    Egal wo ich es einsetzte ich kann es nicht ausführen (F5) und auch nicht als Skript einbinden beim Regelassistenten :(

    @Kevin
    Outlook 2003 wie ich oben in meinem Anfangsbeitrag geschrieben habe, ebenso das ich einen Exchange nutze.
    Zu Punkt zwei da musst mir auf die Sprünge helfen, da ich nicht weiß wo ich das sehen kann, vielleicht hier?
    Diese Funktion ExportEmailToDrive kann ich beim Ausführen (F5) auswählen und auch beim Regelassistenten wählen.

    Visual Basic-Quellcode

    1. Public Sub ExportEmailToDrive()
    2. Const PROCNAME As String = "ExportEmailToDrive"


    Danke für eure Hilfe und Zeit.
    Wenn es schon für euch schwierig ist bin ich doch nicht so blöd :)
    Also vielleicht habt ihr ja noch einen anderen Ansatz für mich?

    Viele Grüße und einen sonnigen Tag
    PaddeL
    Moin.
    Eingefügt habe ich das in ThisOutlookSitzung :D
    Regeln brauchste nicht erstellen, weil:

    Visual Basic-Quellcode

    1. Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

    feuert ganz von alleine, bevor der Regelmanager oder sonst was eingreift, immer dann wenn eine Email eintrifft.
    Ausführen mit F5 klappt natürlich nich, weil ja keine email grade gelandet ist ;)
    Um testen mach dir einfach mal nen HAltepunkt (F9) in Zeile 6 (sollte dann rot markiert sein) und schick dir einfach mal selbst zum testen ne Mail.
    Dann solltest du eigentlich in diese Sub springen und dann kannst du mit (F8) einfach mal Zeile für Zeile dein Programm durchschauen, ob un wo der Fehler ist.
    (Btw wenn du den Mauszeiger über eine Variable hälst siehst du ihren wert, und kannst so sehen, was bzw ob das Programm das richtige tut)

    FloFuchs schrieb:

    nur krieg ich bei mehreren Mails immer noch keine Kommaliste, sondern nur eine ID
    Dafür bekommst du wahrscheinlich mehrere Events mit je einer ID.
    Eine Liste bekommst du vermutlich nur dann, wenn Outlook einen ganzen Block auf einmal vom Exchange-Server holt (z.B. wenn du lange nicht aktiv warst).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Erst mal vielen Dank euch :)

    Vor allem der Tipp mit den Haltepunkten und F8.
    Heute werd ich leider nicht mehr dazu kommen es zu testen :(
    Aber morgen werd ich schauen ob ich es nun alleine hinbekomme, und sobald es fertig ist Poste ich meinen Lösungsweg.

    Also noch mal Danke Danke Danke :)

    PaddeL