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

ACT MetaMailer - Mails verschicken leicht gemacht

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.

Problemanalyse

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.

Mails versenden

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.

Welche Komponente(n) ist(sind) installiert?

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.

Praxisbeispiel

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.

Überblick über Eigenschaften und Methoden

EigenschaftTypBeschreibung
.MailerStringDer Name der eingesetzten Mailkomponente.
.RecipientArrayAlle Empfänger die im "TO" der Mail stehen.
.CCArrayAlle Empfänger die im "CC" der Mail stehen.
.BCCArrayAlle Empfänger die im "BCC" der Mail stehen. Diese sind in der Mail nirgends sichtbar.
.FromStringDie Mailadresse des Absenders.
.FromNameStringDer Name des Absenders.
.SubjectStringDer Betreff (Subject) der Mail.
.BodyStringDer Inhalt der Mail.
.MailServerStringDer Name oder die IP-Adresse des Mailservers über welchen die Mail verschickt werden soll.
.AttachmentArrayDie 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.

MethodeTypBeschreibung
.SendIntegerVerschickt die Mail. Rückgabewerte: 0 = keine Fehler aufgetreten, 1 = Fehler beim Mailversand, 2 = Mailkomponente nicht implementiert
.CheckComponentArrayLiefert die Namen der installierten Mailkomponenten.

Schlußbemerkung

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

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20021028.zip

Verwandte Artikel

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

Links zu anderen Sites

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.