Outlook - Automatisierte Mailverarbeitung mit VBA-Makros
Kurze Skizze zu ein paar Möglichkeiten, mit Outlook-Bordmitteln ein bisschen den Posteingang automatisiert per Makros zu verarbeiten.
So, mal zur Abwechslung was anderes als immer nur Batch..
Ich habe mal, weil es doch mehrmals als Idee auftauchte im Forum, eine kleine beispielhafte "automatisierte" Outlook-Mailverarbeitung mit VBA zusammengeschrotet.
Ist vor allem eine Antwort auf cocoonclubbers Beitrag Outlook 2003 Regeln - Wie weitere Regeln hinzufügen.
Was das Beispiel kann:
1. Geht "auf Knopfdruck" alle Mails im Posteingang durch. Beachtet werden in dem Beispiel nur
- Mails von "notify@administrator.de" ("Benachrichtigungen")
- Mails von "message@administrator.de" ("Mitteilungen")
2. Sowohl diese "Mitteilungen" wie auch "Benachrichtigungen" sind hinterher NICHT mehr im Posteingang.
3. Keine Panik, eine Eins-zu-Eins-Kopie wird im Mail-Ordner "AdminCopy" angelegt.
4. "Mitteilungen"/Messages: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "11.11.2005 17:47:44 von "userXY"
Body/Mailtext: "userXY"
Werden verschoben in den Ordner "AdminProper"
5. "Benachrichtungen"/Notifies: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "Windows XP Home in Professional Light umwandeln" (Beispiel für Titel)
Body/Mailtext: "Desktop updaten" (Beispiel-Link)
Werden verschoben in den Ordner "AdminProper"
6. Alle Mitteilungen/Messages werden zusätzlich in einer neuen Note/Notiz im Ordner "AdminNotizen" angefügt.
7. Alle Nachrichten/Notifies werden in eine Textdatei "AdminMsg.txt" ins Tempverzeichnis geschrieben.
8. Die neuen Ordner "AdminCopy", "AdminProper" und "AdminNotizen" werden angelegt, falls nicht vorhanden.
Die kreativen Namen siehe in den CONST-Deklarationen.
Wenn im ersten Schritt etwas zu ändern ist, dann dort.
Was es nicht kann:
Es kann NICHT unbesehen als "produktive Anwendung" eingesetzt werden.
Ist nur eine schnell zusammengebratene Skizze, die ein paar Möglichkeiten aufzeigen soll.
Und es startet nicht von allein - der Makro muss "von Hand" gestartet werden.
Use on your own risk. And don't call us - we will call you ..
How to use
Den Code unten markieren und im Outlook als neuen Sourcecode kopieren.
[Outlook] Extras->Makros->VisualBasic-Editor
[Im VBA-Projekt]->Outlook->DieseOutlooksitzung->Code anzeigen... einfügen. Speichern.
~~~~~~~~
Entweder im VBA starten (mit/ohne Debugger) oder
im Outlook unter Extras->Makro das Makro "FormatAdminMsg" starten.
~~~~~~~~
Ich habe diesen Makro weder in das Menü gehängt (kommt im VBA-Tut Teil II)
noch dieses Makro an Ereignisse gekoppelt (z.B. an das Ereignis "Neuer Maileingang")
~~~~~~~~
!!! Hint: Wenn ihr schon Eure Administrator-Mails per Outlook-Regel verschiebt!!!
Dann: entweder die Regel mal de-aktivieren und dieses Makro probieren
oder unten im Source die Zeile
"Set FolderAdminInbox = myNameSpace.GetDefaultFolder(olFolderInbox)"
auf Euren Ordner mit den administrator.de-Mails ändern.
Oder, dritte Variante, wieder ein paar Administrator-Mails zurückkopieren in "Posteingang"
Hoffe, es macht Appetit auf ein bissi VBA.
Frank / der Biber aus Bremen
So, mal zur Abwechslung was anderes als immer nur Batch..
Ich habe mal, weil es doch mehrmals als Idee auftauchte im Forum, eine kleine beispielhafte "automatisierte" Outlook-Mailverarbeitung mit VBA zusammengeschrotet.
Ist vor allem eine Antwort auf cocoonclubbers Beitrag Outlook 2003 Regeln - Wie weitere Regeln hinzufügen.
Was das Beispiel kann:
1. Geht "auf Knopfdruck" alle Mails im Posteingang durch. Beachtet werden in dem Beispiel nur
- Mails von "notify@administrator.de" ("Benachrichtigungen")
- Mails von "message@administrator.de" ("Mitteilungen")
2. Sowohl diese "Mitteilungen" wie auch "Benachrichtigungen" sind hinterher NICHT mehr im Posteingang.
3. Keine Panik, eine Eins-zu-Eins-Kopie wird im Mail-Ordner "AdminCopy" angelegt.
4. "Mitteilungen"/Messages: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "11.11.2005 17:47:44 von "userXY"
Body/Mailtext: "userXY"
Werden verschoben in den Ordner "AdminProper"
5. "Benachrichtungen"/Notifies: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "Windows XP Home in Professional Light umwandeln" (Beispiel für Titel)
Body/Mailtext: "Desktop updaten" (Beispiel-Link)
Werden verschoben in den Ordner "AdminProper"
6. Alle Mitteilungen/Messages werden zusätzlich in einer neuen Note/Notiz im Ordner "AdminNotizen" angefügt.
7. Alle Nachrichten/Notifies werden in eine Textdatei "AdminMsg.txt" ins Tempverzeichnis geschrieben.
8. Die neuen Ordner "AdminCopy", "AdminProper" und "AdminNotizen" werden angelegt, falls nicht vorhanden.
Die kreativen Namen siehe in den CONST-Deklarationen.
Wenn im ersten Schritt etwas zu ändern ist, dann dort.
Was es nicht kann:
Es kann NICHT unbesehen als "produktive Anwendung" eingesetzt werden.
Ist nur eine schnell zusammengebratene Skizze, die ein paar Möglichkeiten aufzeigen soll.
Und es startet nicht von allein - der Makro muss "von Hand" gestartet werden.
Use on your own risk. And don't call us - we will call you ..
How to use
Den Code unten markieren und im Outlook als neuen Sourcecode kopieren.
[Outlook] Extras->Makros->VisualBasic-Editor
[Im VBA-Projekt]->Outlook->DieseOutlooksitzung->Code anzeigen... einfügen. Speichern.
~~~~~~~~
Entweder im VBA starten (mit/ohne Debugger) oder
im Outlook unter Extras->Makro das Makro "FormatAdminMsg" starten.
~~~~~~~~
Ich habe diesen Makro weder in das Menü gehängt (kommt im VBA-Tut Teil II)
noch dieses Makro an Ereignisse gekoppelt (z.B. an das Ereignis "Neuer Maileingang")
~~~~~~~~
!!! Hint: Wenn ihr schon Eure Administrator-Mails per Outlook-Regel verschiebt!!!
Dann: entweder die Regel mal de-aktivieren und dieses Makro probieren
oder unten im Source die Zeile
"Set FolderAdminInbox = myNameSpace.GetDefaultFolder(olFolderInbox)"
auf Euren Ordner mit den administrator.de-Mails ändern.
Oder, dritte Variante, wieder ein paar Administrator-Mails zurückkopieren in "Posteingang"
'------snipp Makro zur Administrator-Mail-Nachbehandlung
Option Explicit
Public Sub FormatAdminMsg()
'Drei Konstanten für die notify-Mails von Administrator.de
Const ADMIN_NSender = "notify@administrator.de"
Const ADMIN_NPrefix = "[administrator.de] Auf den Beitrag "
Const ADMIN_NSuffix = " wurde geantwortet."
'Drei Konstanten für die message-Mails von Administrator.de
Const ADMIN_MSender = "message@www.administrator.de"
Const ADMIN_MPrefix = "Das administrator.de-Mitglied "
Const ADMIN_MSuffix = " hat Ihnen diese Nachricht zugeschickt."
'Der einfallsreiche Titel einer Notiz, die geschrieben wird
Const ADMIN_NOTIFY = "Administrator-Messages"
'Der einfallsreiche Titel einer Textdatei, die geschrieben wird
Const ADMIN_TEXTFILE = "AdminMsg.txt"
'Deklarationen
'zuerst für Outlook selbst und den Namespace... ohne die beiden geht nichts.
Dim MyOLApp As Application
Dim myNameSpace As NameSpace
'Ein paar Ordner brauche ich..drei zum Spielen....
Dim FolderAdminCopy, FolderAdminInbox, FolderAdminProper As MAPIFolder
' ...und ein paar Ordner zur Orientierung: Posteingang und den "Obersten"
Dim myInbox As MAPIFolder, FolderRoot, FolderAdminNotes As MAPIFolder
'jetzt die kleineren Sachen.. ein Notiz-Object, zwei Mail-Objects
Dim NoteX As NoteItem
Dim MailX, MailXCopy As MailItem
'und ein bisschen Kroppzeug... Zeichen- und Zählveriablen..
Dim NoteText$, NewSubject$, NewBody$, notifyCutLen
Dim i, j, k As Integer
Dim NoteFound As Boolean
Dim fs As Object, a
notifyCutLen = Len(ADMIN_NPrefix) + Len(ADMIN_NSuffix) + 2
' nun gehts endlich los...
Set MyOLApp = CreateObject("Outlook.Application")
Set myNameSpace = MyOLApp.GetNamespace("MAPI")
'Default-Mailbox nehmen.. manche haben nur eine, andere ein Dutzend
' die aktive Mailbox laut Profil ist logischerweise der Parent (neudeutsch für "Vadder" vom "Posteingang"
Set FolderRoot = myNameSpace.GetDefaultFolder(olFolderInbox).Parent
'nehmen wir mal an, Mails von administrator.de liegen im "Posteingang", siehe "!!!Hint" oben
Set FolderAdminInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
'....einen Ordner für Eins-zu-Eins-Kopien anlegen
Set FolderAdminCopy = CreateFolderIfNotExist("AdminCopy", FolderRoot)
'....und einen für die nachbearbeiteten "Notifies" und "Messages"
Set FolderAdminProper = CreateFolderIfNotExist("AdminProper", FolderRoot)
'....und einen für die Notiz namens "Administrator-Messages", die ich zusätzlich anlege.
Set FolderAdminNotes = CreateFolderIfNotExist("AdminNotizen", FolderRoot, olFolderNotes)
' eine Variante, um ein bestimmtes Item zu suchen... die ganze Liste durchwackeln..
' hier suche ich eine Notiz, die ADMIN_NOTIFY ("Administrator-Messages") <i>heißt</i>.
For Each NoteX In FolderAdminNotes.Items
Debug.Print "Subject: "; "'" & NoteX.Subject & "#"
If StrComp(NoteX.Subject, ADMIN_NOTIFY, vbTextCompare) = 0 Then
NoteText = NoteX.Body
NoteFound = True
Exit For
End If
Next
If Not NoteFound Then
' wenn noch keine existiert (oder ich zu blöd zum Finden war),
'dann eine neue Notiz anlegen
Set NoteX = FolderAdminNotes.Items.Add(olNoteItem)
NoteX.Body = ADMIN_NOTIFY
' die erste Zeile des Body-Textes wird automatisch zum "Namen" der Notiz
NoteX.Save
Debug.Print "FolderAdminNotes.Subject "; NoteX.Subject
End If
Debug.Print NoteText
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(Environ$("temp") & "" & ADMIN_TEXTFILE, True)
For Each MailX In FolderAdminInbox.Items
' wenn eine Mail vom "Message"-Sender message@administrator.de...
If StrComp(MailX.SenderName, ADMIN_MSender, vbTextCompare) = 0 Then
j = InStr(1, MailX.Body, ADMIN_MPrefix, vbTextCompare)
k = InStr(j + 2, MailX.Body, ADMIN_MSuffix, vbTextCompare)
NewBody = Mid(MailX.Body, j + Len(ADMIN_MPrefix), k - j - Len(ADMIN_MPrefix))
Set MailXCopy = MailX.Copy '1:1-Kopie in den Ordner "Admincopy"
MailXCopy.Move FolderAdminCopy
MailX.Body = NewBody
MailX.Subject = MailX.SentOn & " von " & NewBody
MailX.Save
MailX.Move FolderAdminProper
Debug.Print NewBody
NoteX.Body = NoteX.Body & vbCrLf + MailX.Subject
NoteX.Save
End If
' wenn eine Mail vom "Notify"-Sender notify@administrator.de...
If StrComp(MailX.SenderName, ADMIN_NSender, vbTextCompare) = 0 Then
If StrComp(Left(MailX.Subject, Len(ADMIN_NPrefix)), ADMIN_NPrefix) = 0 And _
StrComp(Right(MailX.Subject, Len(ADMIN_NSuffix)), ADMIN_NSuffix) = 0 Then
NewSubject = Mid(MailX.Subject, Len(ADMIN_NPrefix) + 2, _
Len(MailX.Subject) - notifyCutLen)
' die ganzen "RE: "s brauch ich nicht.. weg damit
While StrComp(Left(NewSubject, 4), "RE: ", vbTextCompare) = 0
NewSubject = Mid(NewSubject, 5)
Wend
' noch eben schnell die HTML-Maskierungen wegnehmen aus den Mails:
NewSubject = Replace(NewSubject, "ä", "ä")
NewSubject = Replace(NewSubject, "ü", "ü")
NewSubject = Replace(NewSubject, "ö", "ö")
NewSubject = Replace(NewSubject, "Ä", "Ä")
NewSubject = Replace(NewSubject, "Ü", "Ü")
NewSubject = Replace(NewSubject, "Ö", "Ö")
NewSubject = Replace(NewSubject, "ß", "ß")
Debug.Print MailX.SentOn & " " & "'" & NewSubject & "'"
j = InStr(1, MailX.Body, "https://administrator.de/", vbTextCompare)
k = InStr(j + 20, MailX.Body, "um die Antworten zu lesen.", vbTextCompare)
NewBody = Mid(MailX.Body, j, k - j - 2)
Set MailXCopy = MailX.Copy '1:1-Kopie in den Ordner "Admincopy"
MailXCopy.Move FolderAdminCopy
MailX.Body = NewBody
MailX.Subject = NewSubject
MailX.Save
MailX.Move FolderAdminProper
Debug.Print NewBody
a.Writeline NewSubject
End If
End If
Next
a.Close
Set FolderAdminCopy = Nothing
Set FolderAdminInbox = Nothing
Set FolderAdminNotes = Nothing
Set FolderAdminProper = Nothing
Set FolderRoot = Nothing
Set myNameSpace = Nothing
End Sub
Private Function CreateFolderIfNotExist(strFolderName As String, _
ByVal ParentFolder As MAPIFolder, _
Optional DefaultItemType As Long) As MAPIFolder
On Error GoTo createIt
Set CreateFolderIfNotExist = ParentFolder.Folders(strFolderName)
Exit Function
createIt:
Debug.Print Hex$(Err.Number) & " " & Err.Description
IF StrComp(Hex$(Err.Number), "8004010F", vbTextCompare) = 0 then
' ....wegen der Lesbarkeit vergleiche ich hier:
'.....If Hex$(Err.Number) = "8004010F" Then
' der "echte" Fehlercode ist -2147221233 == 0x8004010F
'..so (in Hex) kann ich den wiedererkennen. Bedeutet: Object nicht gefunden
Err.Clear
Debug.Print DefaultItemType
' wenn kein Type als Parameter mitgegeben, dann als Type "Mails" setzen
If DefaultItemType = 0 Then DefaultItemType = olFolderInbox
On Error Resume Next
Set CreateFolderIfNotExist = _
ParentFolder.Folders.Add(strFolderName, DefaultItemType) ', olMail)
Else
'was immer sonst passieren mag.. ich habs nicht abgefangen..
'hier also Crash & Burn...
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End If
' falls das Ordner-Neuanlegen in die Grütze geht...
If Err.Number <> 0 Then Err.Raise Err.Number
Resume Next
End Function
'------snipp Makro zur Administrator-Mail-Nachbehandlung
Hoffe, es macht Appetit auf ein bissi VBA.
Frank / der Biber aus Bremen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 19552
Url: https://administrator.de/contentid/19552
Ausgedruckt am: 23.11.2024 um 08:11 Uhr
15 Kommentare
Neuester Kommentar
UiUiUi...
ich glaube, da werde ich mir erstmal ein wenig VBA for dummies reinziehen... Im Moment steh ich echt aufm Schlauf
Aber DANKE für die Mühen schonmal.
Hoffentlich werde ich den Code dann auch ein wenig verstehen
ich glaube, da werde ich mir erstmal ein wenig VBA for dummies reinziehen... Im Moment steh ich echt aufm Schlauf
Aber DANKE für die Mühen schonmal.
Hoffentlich werde ich den Code dann auch ein wenig verstehen
mein Problem nicht nur mit Ihrem Makro besteht hauptsächlich im auftauchen folgender Sicherheitswarnung.
Ein Programm versucht, auf ihre in Outlook gespeicherten E-Mail-Adressen zuzugreifen. Möchten Sie dies zulassen ? usw.
Die dann nötigen Maus Clicks sind von einer Körperbehinderten leider nicht ausführbar. Sie kann ausgestattet mit nur einem Taster Mails versenden, dafür habe ich eine Lösung gefunden, eine Lösung wie ich den E-Mail Eingang in eine Textdatei bekomme ohne diese Outlook Warnung fehlt mir leider noch.
Gruß Kurd51
Ein Programm versucht, auf ihre in Outlook gespeicherten E-Mail-Adressen zuzugreifen. Möchten Sie dies zulassen ? usw.
Die dann nötigen Maus Clicks sind von einer Körperbehinderten leider nicht ausführbar. Sie kann ausgestattet mit nur einem Taster Mails versenden, dafür habe ich eine Lösung gefunden, eine Lösung wie ich den E-Mail Eingang in eine Textdatei bekomme ohne diese Outlook Warnung fehlt mir leider noch.
Gruß Kurd51
Hallo Biber,
läßt sich das Makro auch ein an Event "OnMailReceive" automatisieren? Oder kann man mit einer Regel ein Makro starten?
Hintergrund :
In meiner Firma soll ich für meine Abteilung einen Mail-Dispatcher schreiben, der eingehende (automatisch erstellte eMails) weiterroutet. Dafür müßte ich ca. 20 Regeln definieren und pflegen. Mir schwebt eher ein Makro vor, das ich mit zwei Arrays verwalte vor. Im ersten Array steht der Trigger-Betreff ("Maintenance Update Modell 747-B6....") und im zweiten steht die Emailadresse des verantwortlichen Indextreu ("john.doe@airline.com").
Danke für deine Hilfe !!!
Chaoslord.
läßt sich das Makro auch ein an Event "OnMailReceive" automatisieren? Oder kann man mit einer Regel ein Makro starten?
Hintergrund :
In meiner Firma soll ich für meine Abteilung einen Mail-Dispatcher schreiben, der eingehende (automatisch erstellte eMails) weiterroutet. Dafür müßte ich ca. 20 Regeln definieren und pflegen. Mir schwebt eher ein Makro vor, das ich mit zwei Arrays verwalte vor. Im ersten Array steht der Trigger-Betreff ("Maintenance Update Modell 747-B6....") und im zweiten steht die Emailadresse des verantwortlichen Indextreu ("john.doe@airline.com").
Danke für deine Hilfe !!!
Chaoslord.
Hallo Biber,
danke für die differenzierte Variante. Um auf die Automatisierung zurückzukommen, wie heißt das Event und an welchem Objekt hängt das Event? Gibt es eine Methode in der Art "InBox.OnMailReceiveRegister(MyMakro.Execute)" ?
Gerne beiß' ich mich da selber durch, hast du ein Nachschlagewerk oder ähnliche Buchempfehlung?
Greetings vom Mainframe,
Chaoslord1974.
danke für die differenzierte Variante. Um auf die Automatisierung zurückzukommen, wie heißt das Event und an welchem Objekt hängt das Event? Gibt es eine Methode in der Art "InBox.OnMailReceiveRegister(MyMakro.Execute)" ?
Gerne beiß' ich mich da selber durch, hast du ein Nachschlagewerk oder ähnliche Buchempfehlung?
Greetings vom Mainframe,
Chaoslord1974.
Hi,
Danke für deinen Code, den ich als Leihe zwar nicht ganz verstehe aber dennoch weckt es mein Interesse. Du schriebst:
Was das Beispiel kann:
...
4. "Mitteilungen"/Messages: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "11.11.2005 17:47:44 von "userXY"
...
Ich bin auf der Suche nach einem Makro der das Datum "Gesendet" oder "Erhalten" im Format "JJJJ-MM-TT" bzw. "YYYY-MM-DD" an den Anfang eines Betreffs setzt. Dann ein Leerzeichen und dann den Namen, am besten nur Nachname, vom Absender und wieder Leerzeichen. Anschließend kommt dann der Betreff-text wie er vorher war. Ein mögliches ergebnis wäre: Betreff: 2010-02-19 Müller Week of 15 March townmeetings
Ich hoffe es findet sich jemand mit guten Tipps oder gar nem Makro-Vorschlag. Viele Dank im Voraus!!!!
Danke für deinen Code, den ich als Leihe zwar nicht ganz verstehe aber dennoch weckt es mein Interesse. Du schriebst:
Was das Beispiel kann:
...
4. "Mitteilungen"/Messages: Werden zusammengedampft zu zwei Zeilen:
Subject/Betreff : "11.11.2005 17:47:44 von "userXY"
...
Ich bin auf der Suche nach einem Makro der das Datum "Gesendet" oder "Erhalten" im Format "JJJJ-MM-TT" bzw. "YYYY-MM-DD" an den Anfang eines Betreffs setzt. Dann ein Leerzeichen und dann den Namen, am besten nur Nachname, vom Absender und wieder Leerzeichen. Anschließend kommt dann der Betreff-text wie er vorher war. Ein mögliches ergebnis wäre: Betreff: 2010-02-19 Müller Week of 15 March townmeetings
Ich hoffe es findet sich jemand mit guten Tipps oder gar nem Makro-Vorschlag. Viele Dank im Voraus!!!!
Hi Biber,
habe folgendes Problem, bei meinem eigenen Mailversand und bin beim googlen über deinen Beitrag gestolpert ;)
Und zwar habe ich auch eine Mail-Automatisierung in einen VBA-Quellcode eingebunden.
der Code funktioniert einwandfrei, die Mail wird auch erstellt und angezeigt, wie ich es will, allerdings kommt bei mir jedes mal die Abfrage
Dort kann ich nur auswählen, dass der Zugriff für maximal 10 min erlaubt sein soll.
Gibt´s da irgend ein Workaround oder eine Möglichkeit, das abzustellen?
Grüße
Exze
habe folgendes Problem, bei meinem eigenen Mailversand und bin beim googlen über deinen Beitrag gestolpert ;)
Und zwar habe ich auch eine Mail-Automatisierung in einen VBA-Quellcode eingebunden.
Dim sAbsender As String
Dim Outlook As Object
Set Outlook = CreateObject("Outlook.Application")
sAbsender = [ABSENDER ON BEHALF]
With Outlook.createitem(0)
.SentOnBehalfOfName = sAbsender
.Recipients.Add sEmpfänger
.Subject = sBetreff
.Body = sNachricht
.ReadReceiptRequested = False
.display
End With
Set Outlook = Nothing
der Code funktioniert einwandfrei, die Mail wird auch erstellt und angezeigt, wie ich es will, allerdings kommt bei mir jedes mal die Abfrage
Ein Programm versucht auf Ihre in Outlook gespeicherten E-Mail-Adressen zuzugreifen. Möchten Sie dies erlauben?
Dort kann ich nur auswählen, dass der Zugriff für maximal 10 min erlaubt sein soll.
Gibt´s da irgend ein Workaround oder eine Möglichkeit, das abzustellen?
Grüße
Exze