Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Automatisches Aktualisieren einer Site per Mail

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:

Einrichten eines Mail-Kontos

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.

Konfiguration von Serverskripts

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.

Das Serverskript erstellen

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.

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, "ä", "&auml;")
    sString = Replace(sString, "ö", "&ouml;")
    sString = Replace(sString, "ü", "&uuml;")
    sString = Replace(sString, "ß", "&szlig;")
    sString = Replace(sString, "Ä", "&Auml;")
    sString = Replace(sString, "Ö", "&Ouml;")
    sString = Replace(sString, "Ü", "&Uuml;")
    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-Dateien

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.

Sicherheitshinweis

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.

Schlußbemerkung

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

Download des Codes

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.