Geschrieben von: Jörg Neumann
Kategorie: Server
This printed page brought to you by AlphaSierraPapa
Wenn man die Aufgabe hat eine Web-Site täglich oder sogar stündlich mit neuem Inhalt zu füllen, ist man meist an seinen Arbeitsplatz gebunden, auf dem man den aktuellen Inhalt erstellt und dann per FTP auf den Server überträgt. Schön wäre es doch, wenn man von unterwegs mal eben per Mail den aktuellen Stand auf die Site bringen könnte.
Im heutigen Artikel möchte ich beschreiben, wie man mit relativ wenig Aufwand einen Aktualisierungsmechanismus für eine Site auf Grundlage von Microsoft Exchange Server 5.5/2000 erstellen kann.
Die Funktionsweise ist dabei wie folgt: Der Benutzer schickt eine Mail an eine spezielle Mail-Adresse eines Exchange-Servers. Dieser ruft bei Maileingang eine Funktion einer COM-Komponente auf und übergibt ihr den Mailtext. Die Komponente erzeugt daraufhin eine HTML-Datei und versendet sie per FTP an den Webserver.
Dafür sind folgende Arbeitsschritte notwendig:
Folgende Software ist für die Erstellung des Beispiels nötig:
Zuerst richten wir in Exchange einen öffentlichen Ordner ein, in dem alle eingehenden Mails auflaufen sollen. Im Anschluß erstellen wir für diesen Ordner eine E-Mail-Adresse, über die er von außen erreichbar ist. An diese Mail-Adresse werden später die "Aktualisierungsmails" geschickt. Für das Anlegen des Ordners benötigt man natürlich die entsprechenden Rechte auf dem Exchange Server.
Der Exchange Server bietet mit den serverseitigen Agents die Möglichkeit auf bestimmte Ereignisse zu reagieren und darauf entsprechende Aktionen per VBScript auszuführen. Diese Option muß man allerdings erst einschalten, da sie standardmäßig ausgeschaltet ist.
Für das Einrichten der Agents muß man nicht an den Server, sondern kann das bequem vom Client aus bewerkstelligen. Die folgenden Beispiele verwenden Outlook 2000 als Client. Bei älteren Versionen sollten das Verfahren aber ähnlich funktionieren.
Zuerst einmal schaltet man die Option für Serverskripts ein, die sich gut versteckt, in den Tiefen von Outlook befindet.
Nun kann man für jeden Exchange-Mail-Ordner Skripts definieren, die auf bestimmte Ereignisse reagieren. In den nächsten Schritten erstellen wir ein Skript für das eingerichtete Mail-Konto, das auf Maileingang reagiert:
Nun öffnet sich der Editor und es erscheint ein VBScript, welches die entsprechenden Event-Handler beinhaltet (vergleichbar mit der Global.asa in ASP).
Im Event Folder_OnMessageCreated wird nun die entsprechende Aktion in VBScript kodiert. Zuerst einmal ermitteln wir die eingegangene Mail. Hierzu stellt Exchange das Objekt EventDetails zur Verfügung.
Dim oMsg Set oMsg = EventDetails.Session.GetMessage(EventDetails.MessageID, Null )
In oMsg haben wir nun eine Referenz auf das aktive Mail-Objekt. Nun könnte man über den Mail-Subject oder den Absender eine entsprechende Filterung vornehmen. Wir beschränken uns jedoch darauf, den Mail-Text an eine eigens erstellte COM-Komponente weiterzuleiten, die dann die eigentliche Funktionalität beinhaltet.
Dies hat zum einen den Vorteil, daß wir die Logik nicht in Exchange "verstecken", und zum anderen kann der Code auch von anderer Stelle aus aufgerufen werden (z.B. aus einem Word-Makro).
Vorweg jedoch erst einmal der gesamte Code für den Event-Handler:
Public Sub Folder_OnMessageCreated Dim oMsg Dim oMailHandler Dim sRet Set oMsg = EventDetails.Session.GetMessage( _ EventDetails.MessageID, Null ) Set oMailHandler = _ CreateObject("MailAutomation.cMailHandler ") sRet = oMailHandler.SendMailToServer( _ "D:\", CStr(oMsg.Text)) Script.Response = sRet Set oMailHandler = Nothing End Sub
Als Namen für die Komponente habe ich "MailAutomation" und für die Klasse "cMailHandler" verwendet. Die Klasse besitzt die Funktion "SendMailToServer" die zur Aufgabe hat, die Mail aufzunehmen, in HTML zu formatieren und sie per FTP an den Server zu senden.
Mit der Zeile
Script.Response = sRet
wird das Ergebnis des Funktionsaufrufes in das EventLog von Exchange geschrieben, welches man über den Button "Protokolle" im obigen Fenster einsehen kann. So kann man später kontrollieren, wann welche Inhalte versendet wurden.
Nun wenden wir uns der COM-Komponente zu.
Als erstes kodieren wir die Funktion zum Erstellen der HTML-Datei. Sie bekommt den Zielpfad und den Mailtext übergeben, und liefert eine Statusmeldung zurück.
Public Function SendMailToServer( _ byval sPath As Variant, _ byval sMailText As Variant) As Variant On Error Resume Next Dim sHTML As String ' HTML-Datei erzeugen sHTML = GetHeader & _ FormatHTML(sMailText) & _ GetFooter If Right(sPath, 1) <> "\" Then sPath = sPath & "\" ' HTML-Datei schreiben Open sPath & "Content.htm" For Output As #1 Print #1, sHTML Close #1 ' FTP-Transfer starten Shell sPath & "Transfer.bat" ' Statusmeldung zurück geben If Err.Number = 0 Then SendMailToServer = "OK!" Else SendMailToServer = Err.Description End If End Function
Der übergebene Mailtext wird nach HTML konvertiert und von einem fixen Header und Footer umschloßen. Danach wird alles in eine Datei namens "Content.htm" geschrieben, die dann durch den Aufruf der Batchdatei "Transfer.bat" an den Server geschickt wird.
Die Funktion FormatHTML ersetzt Sonderzeichen im Text durch deren HTML-Äquivalente und gibt den HTML-konformen Text zurück:
Private Function FormatHTML(sString As Variant) As String sString = Replace(sString, vbCr, "<br>") sString = Replace(sString, "ä", "ä") sString = Replace(sString, "ö", "ö") sString = Replace(sString, "ü", "ü") sString = Replace(sString, "ß", "ß") sString = Replace(sString, "Ä", "Ä") sString = Replace(sString, "Ö", "Ö") sString = Replace(sString, "Ü", "Ü") FormatHTML = sString End Function
In der Funktion GetHeader wird der HTML-Header hinterlegt:
Private Function GetHeader() As String Dim sHeader As String sHeader = sHeader & "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//DE'>" sHeader = sHeader & "" sHeader = sHeader & "<HTML>" sHeader = sHeader & "<HEAD>" sHeader = sHeader & " <META HTTP-EQUIV='Content-Type' CONTENT='text/html'>" sHeader = sHeader & " <TITLE>Titel der Seite</TITLE>" sHeader = sHeader & "" sHeader = sHeader & "</HEAD>" sHeader = sHeader & "" sHeader = sHeader & "<BODY>" GetHeader = sHeader End Function
In der Funktion GetFooter wird der HTML-Footer und ein Zeitstempel hinterlegt:
Private Function GetFooter() As String Dim sFooter As String sFooter = sFooter & "</BODY>" sFooter = sFooter & "<P>" sFooter = sFooter & "<HR>" sFooter = sFooter & "<BR>Letzte Aktualisierung am " & Now() & " durch Heinz Mustermann</P>" sFooter = sFooter & "</BODY>" sFooter = sFooter & "</HTML>" GetFooter = sFooter End Function
Kompilieren Sie das Projekt zur MailAutomation.dll. Kopieren Sie die DLL auf den Exchange-Server in das Windows-System-Verzeichnis und registrieren Sie sie mit "RegSvr32.exe" (Beispiel: "RegSvr32 C:\WinNT\System32\MailAutomation.dll").
Für den Transfer der Datei auf einen FTP-Server erstellen wir eine Textdatei, die die nötigen FTP-Befehle enthält. Diese Datei wird dann mittels einer Batch-Datei aus der COM-Komponente heraus ausgeführt. Erstellen Sie mit Notepad eine neue Datei, geben Sie Ihr den Namen "Transfer.txt" und füllen Sie sie mit folgendem Inhalt:
open www.MeineSeite.de Benutzername Paßwort cd Zielverzeichnis send D:\Content.htm close bye
Die Daten müssen natürlich durch die entsprechenden, eigenen Daten ersetzt werden.
Die Batch-Datei hat den Namen Transfer.bat und besteht nur aus einer einzigen Zeile:
ftp -s:D:\Transfer.txt
Wichtig ist daß Transfer.txt und Transfer.bat in dem Verzeichnis liegen, das an die COM-Komponente übergeben wurde.
Bevor Sie die Funktion testen sollten Sie den Exchange Server einmal neu starten.
Bevor man das gezeigt Beispiel in die Praxis umsetzt, sollte man sich im klaren sein, daß diese Technik ein gewisses Sicherheitsrisiko mit sich bringt, da natürlich auch Fremde an das eingerichtete Mailkonto Mails schicken können. Dies könnte man z.B. dadurch lösen, indem man entweder im Exchange-Skript oder in der COM-Komponente den Absender mit einer Liste abgleicht.
Auch die Speicherung des Benutzernamens und des Passwortes in der Transfer.txt stellt ein potentielles Sicherheitsrisiko dar. Dies könnte man z.B. durch das Setzen der NT-Verzeichnissicherheit lösen.
Das hier vorgestellte Projekt ist bewußt einfach gehalten und soll mehr die Einsatzmöglichkeiten zeigen. Ziel des Artikels sollte es sein, die Funktion der Exchange Serverskript einmal etwas näher zu beleuchten.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020114.zip
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.