Geschrieben von: Gerhard Buchner
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Mit dem ACT MetaMailer sind Sie in der Lage - unabhängig von der Mailkomponente - Mails zu verschicken ohne die jeweiligen Befehle neu erlernen zu müssen bzw. Ihren Code zu ändern. Die jeweils aktuelle Version finden Sie unter ACT4You.
Mails mit ASP zu verschicken ist schon längst keine Kunst mehr. Diverse Komponenten von Drittherstellern erleichtern dies ungemein. Aber genau hier beginnt eine neue Problematik.
Sie programmieren einen Mailversand für die Komponente XYZ. Aus diversen Gründen wechseln Sie nun aber den Provider und dieser setzt die Mailkomponente ZYX ein. Oder Ihr Kunde B benutzt eine andere Komponente. Was tun? Alles neu programmieren, da die Befehle anders sind?
Nein, denn genau hier setzt der ACT MetaMailer an. Es wird Ihnen eine einheitliche objektorientierte Sprachsyntax zur Verfügung gestellt. Diese wird dann vom ACT MetaMailer umgesetzt, sodaß die jeweilige Mailkomponente die richtigen Parameter bekommt. Das einzige was noch geändert werden muß, ist der Name der Mailkomponente.
Beispielhaft an der Komponente Jmail wollen wir uns die Funktionsweise des ACT MetaMailers anschauen. Als erstes wird die Klasse und die Eigenschaften erzeugt. Da hier keine sicherheitsrelevanten Sachen geschehen, habe ich die einfache Deklaration (Public/Private) gewählt (Code in inc_metamailer.asp).
<% Class MetaMailer Public Mailer Public Recipient Public CC Public BCC Public From Public FromName Public Subject Public Body Public MailServer Public Attachment Private objCDOConf Private objFlds Private cdoAnonymous Private cdoSendUsingPort Private cdoSendUsingPickup Private objMsg
Sehen wir uns den Code an, welcher anhand der oben gezeigten Eigenschaften die Mail per JMail verschickt:
Public Function Send() Select Case lCase(Mailer) Case "jmail" ' http://tech.dimac.net/ Set JMail = Server.CreateObject("JMail.SMTPMail") JMail.ServerAddress = MailServer JMail.Sender = From JMail.Subject = Subject For i = lBound(Recipient) To uBound(Recipient) JMail.AddRecipient Recipient(i) Next If isArray(CC) Then For i = lBound(CC) To uBound(CC) JMail.AddRecipientCC CC(i) Next End If If isArray(BCC) Then For i = lBound(BCC) To uBound(BCC) JMail.AddRecipientBCC BCC(i) Next End If If isArray(Attachment) Then For i = lBound(Attachment) To uBound(Attachment) JMail.AddAttachment Attachment(i) Next End If JMail.Body = Body JMail.Silent = True JMail.Execute Set JMail = NothingGliederung
Zuerst wird die öffentliche Funktion Send deklariert. Danach wird anhand der Eigenschaft Mailer und einem Select Case der Code für die richtige Komponente ausgeführt (hier wie gesagt beispielhaft für Jmail).
Warum verwende ich das LCase? Durch die Umwandlung in Kleinbuchstaben kann kein Fehler bei der Zuweisung gemacht werden. Es spielt somit keine Rolle wie die Schreibweise ist.
Nun wird eine Instanz der Mailkomponente erzeugt und die Eigenschaften zugewiesen. Sehen wir uns exemplarisch die Zuweisung der(s) Empfänger(s) an. In einer For Schleife wird aus dem übergebenen Array der Empfänger die Zuweisung an die Komponente gemacht:
For i = lBound(Recipient) To uBound(Recipient) JMail.AddRecipient Recipient(i) Next
Dies funktioniert bei "CC", "BCC", und "Attachments" identisch.
Zum Schluß wird die Mail verschickt und das Objekt "zerstört" um nicht unnötig den Server zu belasten:
JMail.Execute Set JMail = NothingGliederung
Wird eine Mailkomponente zugewiesen welche nicht implementiert ist, wird der Funktion Send der Rückgabewert "2" zugewiesen und die Funktion verlassen:
Case Else Send = 2 Exit Function
Tritt während des Mailversandes ein Fehler auf, weisen wir den Rückgabewert "1" zu. Wird der Mailversand ohne Fehler abgearbeitet, weisen wir den Rückgabewert "0" zu:
If Err.Number > 0 Then Send = 1 Else Send = 0 End If
Somit ist es möglich anhand des Rückgabewertes z.B. eine Statusseite zu schreiben:
Damit hätten wir den Mailversand exemplarisch für eine Mailkomponente programmiert. Dies funktioniert für die anderen Komponenten identisch, wobei die Befehle der jeweiligen Komponente benutzt werden müßen.
Im jetzigen Stand des ACT MetaMailers sind folgende Mailkomponenten nutzbar: ASPEMail, ASPMail, JMail, Dundas, Flicks, MailListbot, ASPSmartMail, Geocel, ActiveMailer, DynuEMail, HSMailer, HTMLMailer, SimpleMail, CDONTS, CDOSYS.
Wenn Sie nicht wissen welche Mailkomponente Sie nutzen können, gibt es einen einfachen Weg das herauszufinden. Die Klasse enthält eine weitere Funktion um alle installierten Mailkomponenten aufzulisten.
Sehen wir uns den Code der Funktion CheckComponent an.
Public Function CheckComponent() On Error Resume Next Set Mail = Server.CreateObject("Persits.MailSender") If err.number = 0 Then Component = Component & ";ASPEMail" Set Mail = Nothing End If err.Clear … Component = Mid(Component, 2) CheckComponent = Split(Component, ";") End Function
Am Beispiel von ASPEmail wollen wir den Code erklären. Dieser ist für alle anderen Komponenten identisch.
Ganz wichtig ist der Befehl On Error Resume Next. Dadurch wird gewährleistet, daß in einem Fehlerfall die Ausführung der Seite in der nächsten Zeile fortgeführt wird und nicht eine Fehlermeldung des Servers im Browser erscheint.
Danach wird versucht eine Instanz der Komponente zu erzeugen. Kann die Instanz erzeugt werden, bedeutet dies, daß die Komponente auf dem Server installiert ist. Ist dem nicht der Fall, wird im Error-Objekt Err eine Fehlernummer erzeugt.
Das Error-Objekt wird ausgewertet, indem auf die Fehlernummer 0 (Komponente installiert) überprüft wird. Ist dies der Fall, wird eine Variable Component um einen String, welcher den Namen der Komponente erhält, erweitert. Um den Server nicht unnötig zu belasten, wird das Objekt gleich wieder zerstört.
Anschließend muß noch das Error-Objekt zurückgesetzt werden: Err.Clear. Damit in einem Fehlerfall die nächste Komponente auch noch richtig überprüft werden kann.
Zum Schluß wird das führende Semikolon ";" abgeschnitten und der Funktion der Rückgabewert zugewiesen. Zurückgegeben wird ein Array, welches mit der Funktion Split aus der Variablen Component erzeugt wird.
Nachdem wir nun die Funktionalität des ACT MetaMailers durchleuchtet haben, wenden wir uns einem Praxisbeispiel zu. Wir benutzen ein Formular mit welchem es möglich ist die einzelnen Eigenschaften zu setzen um eine Mail damit zu verschicken. Den Aufbau des Formulars erkläre ich nicht genauer. Dieser ist in der Datei index.asp zu finden. Sehen wir uns das Formular erst einmal kurz an.
Wie Sie sehen ist dies ein sehr einfaches Formular, welches aber alle verfügbaren Eigenschaften für den ACT MetaMailer zur Verfügung stellt.
Zuerst muß unterschieden werden ob die Seite frisch aufgerufen wurde, oder das Formular abgesendet. Wurde das Formular abgesendet, werden die Formularfelder an Variablen zugewiesen.
If Request.Form <> "" Then strMailer = Request.Form("Mailer") strRecipient = Request.Form("Recipient") strCC = Request.Form("CC") strBCC = Request.Form("BCC") strFrom = Request.Form("From") strFromName = Request.Form("FromName") strBody = Request.Form("Body") strSubject = Request.Form("Subject") strSMTP = Request.Form("SMTP") strAttachment = Request.Form("Attachment") Else
Wurde die Seite normal aufgerufen erzeugen wir eine Instanz des ACT MetaMailers, rufen die Methode CheckComponent auf und weisen das Ergebnis dem Array arrComp zu. Wiederum wird das Objekt zerstört um den Server nicht unnötig zu belasten. Das Array wird dann im Formular benutzt um eine DropDown Box mit den zur Verfügung stehenden Komponenten zu füllen.
If strMailer = "" Then Set myMail = New MetaMailer arrComp = myMail.CheckComponent Set myMail = Nothing
Nachdem nun das Formular verschickt wurde, weisen wir den Eigenschaften die nötigen Werte zu und verschicken die Mail.
Set myMail = New MetaMailer With myMail .Mailer = strMailer .Recipient = Split(strRecipient, ";") .CC = Split(strCC, ";") .BCC = Split(strBCC, ";") .From = strFrom .FromName = strFromName .Subject = strSubject .Body = strBody .MailServer = strSMTP .Attachment = Split(strAttachment, ";") Result = .Send End With
Zuerst wird eine Instanz des ACT MetaMailers erzeugt. Um etwas Schreibarbeit zu sparen, verwenden wir With und weisen den Objekteigenschaften die zuvor erzeugten Variablen zu.
Die Eigenschaften Recipient, CC, BCC, Attachment müssen als Array übergeben werden. Dazu verwenden wir die Split Funktion. Mehrere Empfänger müssen im Formular mit einem Semikolon ";" getrennt angegeben werden.
Nachdem alle Eigenschaften zugewiesen wurden, wird mit der Methode Send die Mail verschickt und der Rückgabewert in der Variablen Result gespeichert.
Zu jeder vernünftigen Seite gehört eine Fehlerbehandlung. So auch bei uns.
Select Case Result Case 0 Response.Write "Email wurde an " & strRecipient Response.Write " verschickt!" Case 1 Response.Write "Emailversand fehlgeschlagen: " Response.Write Err.Description Case 2 Response.Write "Mailkomponente nicht implementiert!" End Select Set myMail = Nothing
Tritt ein Fehler beim Versand auf, schreiben wir eine entsprechende Meldung und die Fehlerbeschreibung in die Seite. Anderenfalls schreiben wir als Rückmeldung eine Erfolgsmeldung und die Empfänger der Mail in die Seite.
Eigenschaft | Typ | Beschreibung |
---|---|---|
.Mailer | String | Der Name der eingesetzten Mailkomponente. |
.Recipient | Array | Alle Empfänger die im "TO" der Mail stehen. |
.CC | Array | Alle Empfänger die im "CC" der Mail stehen. |
.BCC | Array | Alle Empfänger die im "BCC" der Mail stehen. Diese sind in der Mail nirgends sichtbar. |
.From | String | Die Mailadresse des Absenders. |
.FromName | String | Der Name des Absenders. |
.Subject | String | Der Betreff (Subject) der Mail. |
.Body | String | Der Inhalt der Mail. |
.MailServer | String | Der Name oder die IP-Adresse des Mailservers über welchen die Mail verschickt werden soll. |
.Attachment | Array | Die Dateien die als Attachment mit der Mail verschickt werden sollen.Die Dateien müssen auf dem Server liegen! Notfalls verwenden Sie eine Upload-Komponente dafür. |
Methode | Typ | Beschreibung |
---|---|---|
.Send | Integer | Verschickt die Mail. Rückgabewerte: 0 = keine Fehler aufgetreten, 1 = Fehler beim Mailversand, 2 = Mailkomponente nicht implementiert |
.CheckComponent | Array | Liefert die Namen der installierten Mailkomponenten. |
Nun sind wir in der Lage mittels des ACT MetaMailer Mails unabhängig von der Mailkomponente Mails zu verschicken ohne den Code großartig ändern zu müssen. Etwaige Erweiterungen sind äußerst einfach einzufügen. Denkbar wäre hier zum Beispiel die Überprüfung der Mailaddressen mittels Regular Expressions oder die Überprüfung der Berechtigung zum Versand über den Referer.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20021028.zip
Allgemeine MailParser-Klasse mit ASPMail
http:/www.aspheute.com/artikel/20000602.htm
Auslesen von Emails aus einem POP3 Account
http:/www.aspheute.com/artikel/20000810.htm
Das Versenden von Emails selbst programmieren
http:/www.aspheute.com/artikel/20001009.htm
Downloads per Email verschicken
http:/www.aspheute.com/artikel/20000330.htm
Email versenden mit AspMail
http:/www.aspheute.com/artikel/19990809.htm
Emails mit ASP.NET versenden
http:/www.aspheute.com/artikel/20000918.htm
Emails mittels CDOSYS versenden
http:/www.aspheute.com/artikel/20000919.htm
Emails senden mit CDONTS
http:/www.aspheute.com/artikel/20000515.htm
Emails versenden mit ASPEmail
http:/www.aspheute.com/artikel/20010219.htm
Html Emails mit Dundas Mailer verschicken
http:/www.aspheute.com/artikel/20010625.htm
Mailadressen-überprüfen für Fortgeschrittene
http:/www.aspheute.com/artikel/20000822.htm
Mit PGP verschlüsselte e-Mails senden
http:/www.aspheute.com/artikel/20000912.htm
ACT4You
http://www.act4you.de
©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.