© www.a-m-i.de, EDV-Sachverständiger Alexander Müller

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

cover


"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

cover

"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

Links (meine Outlook - Automatisierungs - Favoriten)

MAPI - Grundlagen: Einstiegsseite der Dokumentation zur Microsoft Messaging API.

CDO - Grundlagen: Einstiegsseite der Dokumentation zum den Microsoft Windows Collaboration Data Objects.

Platform SDK Download von Microsoft, das bietet sich eigentlich immer an, wenn man mit speziellen Objektbibliotheken programmiert.

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.