Automatisches Aktualisieren einer Site per Mail
Geschrieben von: Jörg Neumann 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:
Einrichten eines Mail-KontosZuerst 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.
Konfiguration von ServerskriptsDer 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.
Das Serverskript erstellenNun 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. Erstellen der COM-Komponente
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"). Die Transfer-DateienFü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. SicherheitshinweisBevor 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. SchlußbemerkungDas 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. Download des CodesKlicken Sie hier, um den Download zu starten. Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |