|
|
|
|
|
|
|
|
|
|
Letzte Aktualisierung: 04.01.2023
|
|
Automatisierter eMail - Verkehr
Versenden und Empfangen von eMails, automatische Verteilung und Verarbeitung, sind häufig
vorkommende Aufgaben, die das Leben erheblich erleichtern können.
Dieser Artikel behandelt die Automatisierung des eMail - Verkehrs unter einem Exchange - Server
mit den Mitteln von Microsoft Visual Basic oder der VBA - Programmierung.
Grundlagen
Arbeiten in fremden Mailboxen
Buchtips
Links
|
Grundlagen
Um mit einem Exchange - Server programmgesteuert eMails senden und Empfangen zu können, benötigt man
auf dem Exchange - Server einen Mailaccount (bzw. ein sogenanntes "Postfach") sowie ein Zugangspaßwort.
In diesem ersten Abschnitt behandeln wir nur den einfachen Fall, nämlich die Benutzung des Mailaccounts
des Benutzers, der gerade an Windows angemeldet ist. Will man in fremden Postfächern wüten, ist einiges
an Mehraufwand notwendig.
Das Folgende Codebeispiel zeigt, wie man mit dem eigenen Mailaccount eine simple Mail programmgesteuert
versenden kann.
Public Function MailVersenden() As Boolean
Const strServer = "EXCHANGESERVER" ' Muß natürlich DNS-auflösbar sein
Const strMailbox = "T.Testmann"
Const strProfileInfo = strServer & vbLf & strMailbox
Dim objSession As Object, objMessage As Object
Dim objRecipients As Object
On Error GoTo ErrorHandler
MailVersenden = False
' Session am Exchange-Server öffnen
Set objSession = CreateObject("Mapi.Session")
objSession.Logon "", "", False, True, 0, True, strProfileInfo
' Mail erzeugen und mit Inhalt Füllen
Set objMessage = objSession.Outbox.Messages.Add
objMessage.Subject = "Betreff meiner Testmail"
objMessage.Text = "Textinhalt meiner Mail" & vbCr _
& "Zweite Zeile ..."
' Empfänger für die Mail eintragen
Set objRecipients = objMessage.Recipients
objRecipients.Add ("mailtest@a-m-i.de")
objRecipients.Resolve
objMessage.Send
' Aufräumen & Abmelden
Set objRecipients = Nothing
Set objMessage = Nothing
objSession.Logoff
Set objSession = Nothing
MailVersenden = True
Exit Function
ErrorHandler:
MailVersenden = False
Fehlerbehandlung "MailVersenden", Err.Number, Err.Description
End Function
Diese Funktion ist eigentlich sehr simpel und leicht verständlich. Man eröffnet eine Session auf dem Mailserver, die man natürlich später wieder abmelden und schließen muß.
Dann erzeugt man eine neue Mail, indem man in der Menge der Nachrichten der Outbox (= Postausgang) eine neue Nachricht mit "Add" hinzufügt.
Subject (= Betreff) und Text (= Inhalt) kann man einfach Füllen durch Zuweisung eines Strings.
Die Liste der Absender kann man Füllen durch mehrfache Aufrufe der Add() - Funktion eines sogenannten Recipients - Objekts, also eines Objekts, welches verschiedene Empfänger verwalten kann.
Der Aufruf "Resolve" auf dem Recipients - Objekt dient dazu, unvollständige Mailadressen zu vervollständigen. Beispiel: Wenn ich auf meinem Exchange-Server nur "info" als Empfänger angebe, dann sorgt "Resolve" dafür,
daß "info" aufgelöst wird zur vollständigen Adresse "info@a-m-i.de".
Der Befehl "Send" schließlich sorgt dafür, daß die Mail automatisch versendet wird. Man könnte auch z.B. "Display" stattdessen aufrufen,
das würde dann dazu führen, daß die fertig erstellte Mail nur angezeigt wird, aber noch nicht versendet wird. Dann hat der Benutzer noch
die Möglichkeit, zu kontrollieren, ob alles OK ist, und manuell auf "Senden" zu Drücken.
Die letzten Zeilen dienen zum Aufräumen und zum ordentlichen Abmelden der Session.
Tip: Das Anmelden an einem Exchange - Server dauert häufig mehrere Sekunden. Wenn mehrere Mails zu verarbeiten sind,
lohnt es sich, die Anmeldung nur einmal auszuführen, und die Schleife über alle Mails während der geöffneten Exchange - Sitzung abzuarbeiten.
Zur Technik: Die Technik, die hier verwendet wird, heißt MAPI, zumindest die Basistechnik. Die Objekte, die hier
eingesetzt werden (z.B. "Session", "Message", etc.) gehören zu den "Collaboration Data Object" (kurz CDO).
Details hierzu findet man weiter unten bei den Links, oder auch in einem guten Buch.
Wie man eingehende Mails verarbeiten kann, zeigt der Folgende Codeabschnitt; dabei wird angenommen, daß wir bereits eine geöffnete Sitzung haben:
Dim oMessages As Object, oMessage As Object, nDateinummer As Integer
' Zugriff auf den Posteingang
Set oMessages = objSession.Inbox.Messages
Do While (True)
' Prüfung, ob noch eine Nachricht da ist:
Set oMessage = oMessages.GetLast
If (oMessage Is Nothing) Then Exit Do
' Die Message wird gespeichert unter dem Namen ihrer Überschrift,
' und der Inhalt der neuen Datei ist auch der Inhalt der Mail.
strDateiname = txtPfad.Text & oMessage.Subject & ".txt"
nDateinummer = FreeFile()
Open strDateiname For Output As #nDateinummer
Print #nDateinummer, oMessage.Text
Close #nDateinummer
' Löschen der Nachricht, und Fortfahren in der Schleife
oMessage.Delete
Set oMessage = Nothing
Loop
' Aufräumen
Set oMessages = Nothing
Hier wird auf den Posteingang - Ordner zugegriffen, die sogenannte "Inbox". Das oMessages - Objekt repräsentiert alle Nachrichten, die in diesem Ordner enthalten sind.
In der Schleife greifen wir mit "GetLast" stets auf die älteste Mail zu, um sie zu verarbeiten.
In diesem simplen Beispiel werden die Mails dann einfach abgespeichert als Textdateien. Der Dateiname ist der jeweilige Betreff der Mail,
und der Dateiinhalt ist auch der Mail - Inhalt. Jede Mail wird nach erfolgreichem Abspeichern gelöscht.
|
Arbeiten in fremden Mailboxen
In der Regel macht es Sinn, für vollautomatischen eMail - Verkehr nicht einen Benutzer - bezogenen
Mailaccount zu verwenden, sondern einen speziell für seine Aufgabe eingerichteten vollautomatischen
eMail - Account, wie z.B. "Bestelleingang@a-m-i.de" oder "Newsletterversand@a-m-i.de".
Programmgesteuert von meinem Benutzeraccount auf diesen fremden Mailaccount draufzukommen, ist nicht ganz ohne.
Wer den obigen Code ausprobiert hat, hat möglicherweise schon Bekanntschaft gemacht mit der berüchtigten Fehlermeldung
Run-time error '-2147221231 (80040111)':
Der Informationsspeicher steht zurzeit nicht zur Verfügung.
[MAPI 1.0 -[MAPI_E_LOGON_FAILED(80040111)]]
Der Schreibfehler wurde dabei als Zitat übernommen :-)
Dieser Fehler passiert genau dann, wenn man sich entweder vertippt hat beim Namen des Mailaccounts, oder man nicht berechtigt ist, diesen Mailaccount zu verwenden.
Wie bekomme ich jetzt diese Berechtigung ? Dies ist nicht ganz einfach herauszufinden. Soviel sei gesagt:
Es ist weder damit getan, daß man sich ein zweites Mailprofil anlegt (unter Systemsteuerung / Mail), noch kann man das Problem umgehen, indem man sich als
Stellvertreter für diesen Mailaccount einträgt (also die Berechtigung, stellvertretend für den Besitzer des Mailaccounts Mails zu versenden).
Beide Maßnahmen sind gar nicht nötig.
Die Lösung des Problems, demonstriert auf einem Microsoft Windows 2000 - Server:

Active Directory Benutzer und Computer: Der Haken bei "Erweiterte Funktionen" muß an sein.
 Auf dem Benutzer: rechte Maustaste, Eigenschaften, dann Exchange - Erweitert.
 Hier den Knopf "Postfachberechtigungen" drücken.
 Oben den Benutzeraccount hinzufügen, der berechtigt werden soll. Danach die 5 oberen Haken auf der linken Seite aktivieren und "OK" Drücken.
|
Buchtips

|
"Outlook 2000 Bible" Kleinke, Underdahl (englisch)
Alles, was man über Outlook 2000 und dessen Programmierung wissen muß. Behandelt auch eingehend die Automatisierung mit Outlook,
MAPI - Funktionalitäten und die mächtigen Funktionen der Outlook - Formulare.
Informationen zum Buch
|

|
"Visual Basic 6" von Michael Kofler ist der Klassiker unter den Lehrbüchern für Visual Basic.
Das Buch ist sowohl für den Einsteiger interessant, als auch als Referenzwerk für den Profi. Es deckt im Grunde
alles ab, was man über Visual Basic 6 wissen muß.
Informationen zum Buch
|
|
Support, Feedback, Anregungen
Alles verstanden ? Oder noch Fragen ? Wir freuen uns über Feedback zu den Tips, auch über Verbesserungsvorschläge.
Schreiben Sie an support@a-m-i.de.
|
|