Wenn eine klassische Website – also nicht durch ein CMS betrieben – ein Formular verwendet, dann ist es eine ganz wichtige Funktion, dass man die Eingaben des Benutzers per Mail an eine definierte Adresse sendet. Es wäre auch eine Speicherung in einer Datei oder in einer Datenbank möglich aber für nicht allzu große Datenmengen ist eine Mail ausreichend.

Man kann grundsätzlich mit einem Link einen solchen Mailversand auslösen, also mit <a href="mailto:mail@domäne.at">Absenden</a> aber ein solcher Link ist nur bedingt nützlich, denn er setzt voraus, dass sich am Client-Computer ein Mailer befindet, der die Daten weiterverarbeitet. Das aber ist bei Tablets oder auf öffentlichen Arbeitsplätzen gar nicht der Fall. Es muss daher der Mailversand vom Server, unabhängig von der Client-Software durchgeführt werden.

Man kann solche Skripte in ASP, ASPX oder PHP ausführen. In den PCNEWS wurde schon einige Male darüber berichtet.

In einzelnen Webs laufen solche Skripte schon seit vielen Jahren; wartungsfrei. Bei dem Web eines Clubmitglieds ist eine ASP-Version in Verwendung, die seit einigen Tagen den Dienst verweigert. Seitens des Anwenderwebs wurde nichts verändert. Nach Überprüfung der Login-Daten für die Mailbox konnte auch kein Fehler entdeckt werden. Vermutet wird, dass eventuell eine geringfügige Umstellung am Server dazu geführt hat, dass die ziemlich alten ASP-Bibliotheken nicht mehr richtig funktionieren. Statt also die Fehlersuche in ASP weiterzuverfolgen, wurde das Mail-Programm auf ASPX umgestellt.

Eine Formular-Verwaltung hat zum Beispiel folgenden Aufbau:

Die Datei formular.htm enthält ein form-Element, welches den Inhalt der eingeschlossenen Felder an die Datei mail.aspx weiterleitet, wenn ein submit-Button gedrückt wird. Die am Server ausgewertete Datei mail.aspx sendet die Daten an den Empfänger und leitet zu einer Datei weiter, die im Beispiel danke.htm heißt. Das Formular kann die Daten auf zwei Arten weiterleiten: mit der GET-Methode oder mit der POST-Methode. Bei GET sieht man die Parameter in der Kommandozeile nach dem URL, bei POST sieht man die Parameter nicht, weil sie erst nach dem URL übermittelt werden.

Die Datei mail.aspx kann genau so gut den Typ .asp oder .php haben, je nachdem, was man besser kann, von wo man ein Beispiel hat oder was der Server unterstützt.

mail.aspx

Das hier vorgestellte Mail-Programm für Webseiten hat folgende Eigenschaften:

Es übernimmt Parameter über GET oder POST, prüft, ob die Angaben To, From, Subject vohanden sind. Es sammelt die Inhalte aller anderen Felder, egal wie sie heißen und was sie bedeuten, und sendet sie als Nachrichteninhalt an die To-Adresse. Der Parameter Weiter leitet nach erfolgreichem Versand an die im Feld Weiter angegeben Adresse weiter. Damit man in Verbindung mit bestehenden Formularen, in denen diese Felder To, From, Subject und Weiter anderswie benannt sind, kann man die Feldnamen einfach ändern.

Das Programm funktioniert nur auf Microsoft-Servern mit ASP.NET 4.0 Integrated.

Was muss man konfigurieren?

  • Im Formular formular.htm muss man als Ziel (action im form-Tag) den Namen mail.aspx angeben.
  • Verpflichtend sind die Felder To, From und Subject. Die E-Mail-Adressen in To und From müssen existieren und müssen sich in derselben Maildomäne befinden.
  • Wenn ein Feld Weiter angegeben wird, dann muss es die Adresse jener Datei enthalten, die den Vorgang abschließt, im Bild-Beispiel danke.htm.
  • Alle anderen Felder sind beliebig.
  • In Mail muss man den Namen der verwendeten Mailbox und deren Passwort eingeben Username/Passwort.

Source-Kode

<%@ Page Language="C#" Debug="true" %>

<%@ Import Namespace="System.Net.Mail" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Senden einer Nachricht</title>
    <link href="mail.css" rel="stylesheet" type="text/css" />
    <script runat="server">
        string Mailserver = "mail.ccc.at";
        string Username = "--Name Deiner Mailbox--";
        string Passwort = "--Passwort für diese Mailbox--";
        string redirectTo = "";
        string strTextConf = "Fehlerhafte Konfiguration";
        string strTextMailError = ": Falsches Mailformat";
        string strMessageSentText = "Die Nachricht wurde an $To$ gesendet.";
        string Token_to = "to";
        string Token_cc = "cc";
        string Token_bcc = "bcc";
        string Token_from = "from";
        string Token_subject = "subject";
        string Token_body = "body";
        string Token_redirect = "weiter";
        string strCc = "";
        string strBcc = "";
        string strTo = "";
        string strFrom = "";
        string strSubject = "";
        string strBody = "";
        void Page_Load(object sender, EventArgs e)
        {
            System.Web.UI.ValidationSettings.UnobtrusiveValidationMode = System.Web.UI.UnobtrusiveValidationMode.None;
            if ((Mailserver.Trim() == "") || (Username.Trim() == "") || (Passwort.Trim() == "") || (strTo.Trim() == ""))
            {
                Response.Write(strTextConf + "<br/>");
                return;
            }
            if (
                ((strTo!="") || ExistVar(Token_to))
                &&
                ((strFrom!="") || ExistVar(Token_from))
                &&
                ((strSubject!="") || ExistVar(Token_subject))
            )
            {
                if (ExistVar(Token_to)) strTo = GetVar(Token_to);
                if (ExistVar(Token_from)) strFrom = GetVar(Token_from);
                if (ExistVar(Token_subject)) strSubject = GetVar(Token_subject);
                if (ExistVar(Token_redirect)) redirectTo = GetVar(Token_redirect);
                strBody += GetContent();
                SendMail();
            }
        }
        string GetContent()
        {
            string Text = strBody;
            NameValueCollection nvc = new NameValueCollection();
            nvc.Add(Request.QueryString);
            nvc.Add(Request.Form);
            foreach (string Token in nvc)
            {
                string Token1 = Token.ToLower();
                Response.Write(Token + ": " + Request.Params[Token] + "<br/>");
                if (
                    (Token1 == Token_to)
                    || (Token1 == Token_cc)
                    || (Token1 == Token_bcc)
                    || (Token1 == Token_from)
                    || (Token1 == Token_subject)
                    || (Token1 == Token_body)
                    || (Token1 == Token_redirect)
                    )
                {

                }
                else
                {
                    Text += "\r\n" + Token + ": " + Request.Params[Token];
                }
            }
            Response.Write("<br/>" + Text);
            return Text;
        }
        string GetVar(string param) { string value = Request.Params[param]; if (string.IsNullOrEmpty(value)) value = ""; return value; }
        bool ExistVar(string param) { string value = Request.Params[param]; return (value != null); }
        void SendMail()
        {
            string Text_Error = SendMailMessage(strFrom, strTo, strBcc, strCc, strSubject, strBody);
            if (Text_Error == "")
            {
                if (redirectTo == "")
                {
                    Response.Write (strMessageSentText.Replace("$To$", strTo.Trim()));
                }
                else
                    Response.Redirect(redirectTo);
            }
            else
                Response.Write (Text_Error);
        }
        public string SendMailMessage(string from, string to, string bcc, string cc, string subject, string body)
        {
            try
            {
                MailMessage mMailMessage = new MailMessage();
                try
                {
                    mMailMessage.To.Add(new MailAddress(to));
                }
                catch
                {
                    return "To:" + to + " " + strTextMailError;
                }
                try
                {
                    mMailMessage.From = new MailAddress(from);
                }
                catch
                {
                    return "From:" + from + " " + strTextMailError;
                }
                mMailMessage.CC.Add(new MailAddress(from));
                if (!string.IsNullOrEmpty(bcc))
                {
                    try
                    {
                        mMailMessage.Bcc.Add(new MailAddress(bcc));
                    }
                    catch { return "BCC:" + bcc + " " + strTextMailError; }
                }
                if (!string.IsNullOrEmpty(cc))
                {
                    try
                    {
                        mMailMessage.CC.Add(new MailAddress(cc));
                    }
                    catch
                    {
                        return "CC:" + cc + " " + strTextMailError;
                    }
                }
                mMailMessage.Subject = subject;
                mMailMessage.Body = body;
                mMailMessage.IsBodyHtml = false;
                mMailMessage.Priority = MailPriority.Normal;
                SmtpClient mSmtpClient = new SmtpClient(Mailserver);
                mSmtpClient.Credentials = new System.Net.NetworkCredential(Username, Passwort);
                mSmtpClient.Send(mMailMessage);
                return "";
            }
            catch (Exception ex)
            {
                Exception ex2 = ex;
                string errorMessage = string.Empty;
                // while (ex2 != null)
                // {
                errorMessage += ex2.ToString();
                //  ex2 = ex2.InnerException;
                // }
                return errorMessage;
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

 

Franz Fiala

Präsident Clubcomputer / Herausgeber PCNEWS bei ClubComputer.at
Franz ist pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreut unser Clubtelefon und Internet Support. Er ist leidenschaftlicher Rapid Wien Fan.

Letzte Artikel von Franz Fiala (Alle anzeigen)