C# - E-mail küldése web lapról

ASP.NET 4. rész

forráskód letöltése
ASP.NET sorozatunk mostani részében egy olyan web oldalt készítünk, melyről tetszőleges e-mail-eket küldhetünk bárki számára.
A mellékelt példa megnyitásához hozzon létre egy virtuális könyvtárat web szerverén SoWebApplication04 névvel és másolja be oda a mellékelt állományokat.
A WebForm1.aspx lapon állítjuk össze azt a web oldalt, melyről az e-mail küldést végezhetjük el. Az e-mail-hez most csak a címzettet, a tárgyat és az e-mail szövegét kérjük be a felhasználótól. Az elküldéshez szükség lesz még a használni kívánt SMTP szerver nevére, valamint a saját e-mail címünkre. E két adatot - hogy ne kelljen állandóan ugyanazt begépelni - egy XML állományba letároljuk és létrehozunk egy Beállítás nyomógombot, melynek használatával egy új web oldalon beállíthatjuk és menthetjük az XML-be az új értékeket.
Nézzük először az e-mail küldést. Ha megadtuk az e-mail adatait (címzett, tárgy, üzenet), akkor a Button1-re kattintva küldhetjük el a levelet. Ehhez egy Click eseményt létrehozva és ott az SmtpMail osztályt felhasználva egyszerűen elvégezhetjük az e-mail elküldését. Az SmtpMail osztály SmtpServer property-jének értékül adjuk a Label1-ben tárolt szöveget, mely az XML-ből kiolvasott SMTP szerver nevét tárolja.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      SmtpMail.SmtpServer = Label1.Text;
Az SmtpMail Send függvényével pedig elküldhetjük az e-mail-t. Első paraméterként a saját e-mail címünket kell megadni, másodikként a címzettét, majd ezt követi a tárgy és végül az üzenet szövege.
      SmtpMail.Send(Label2.Text, TextBox1.Text, TextBox2.Text, TextBox3.Text);
Végül a felhasználót átirányítjuk a WebForm2.aspx lapra, ahol nyugtázzuk az e-mail elküldését és kiírjuk annak paramétereit.
      Response.Redirect("WebForm2.aspx?to=" + TextBox1.Text + "&subject=" + TextBox2.Text + "&body=" + TextBox3.Text);
    }
Mielőtt azonban ezt megnéznénk, van még egy feladatunk: a Label1 és Label2 szövegét felhasználjuk az e-mail küldéséhez, viszont eddig még nem adtunk nekik értéket. Erre pedig még az e-mail küldés előtt sort kell kerítenünk. Ezért célszerűen a Page_Load eseménykezelőjét használjuk fel, hogy már a lap betöltésekor olvasva legyen az XML állományunk.
   private void Page_Load(object sender, System.EventArgs e)
   {
Olvasáshoz az XmlDocument osztályt használjuk.
      XmlDocument xd = new XmlDocument();
Betöltjük a mellékelt config.xml állományt a Load függvénnyel. Ennek viszont tudnunk kellene a fizikai elérési útvonalát. Ehhez a Server objektum MapPath függvényét használhatjuk, mely az aktuális virtuális könyvtár alapján visszaadja a fizikai elérési útvonalat.
      xd.Load(Server.MapPath("config.xml"));      
Ha adott az állomány, akkor már csak ki kell olvasnunk az SMTP szerver nevét és a saját e-mail címünket és tárolni kell a két Label komponensben.
      Label1.Text = xd.DocumentElement["host"].InnerText;
      Label2.Text = xd.DocumentElement["frommail"].InnerText;
   }
Nézzük most az e-mail elküldésének visszaigazolását, vagyis a WebForm2.aspx oldalt. Mivel az átirányításkor olyan hívást küldünk, melynél paraméterben megadjuk az összes kiírandó adatot, így egyszerű a dolgunk: az oldal betöltésénél csak ki kell olvasnunk a Request objektum QueryString property-jén keresztül a kérdéses paramétereket.
   private void Page_Load(object sender, System.EventArgs e)
   {
      Label1.Text = Request.QueryString["to"];
      Label2.Text = Request.QueryString["subject"];
      Label3.Text = Request.QueryString["body"];
    }
Ha az első oldalon a Beállítás gombra kattintunk, akkor jön a WebForm3.aspx lap.
    private void Button2_Click(object sender, System.EventArgs e)
    {
      Response.Redirect("WebForm3.aspx");
    }
Ezen a lapon végezhetjük el a két konfigurációs adatunknak a beállítását.
Az oldal megnyitásakor be kell töltenünk a két TextBox-ba az XML állományunk aktuális adatát.
private void Page_Load(object sender, System.EventArgs e)
{      
Figyeljük arra, hogy az IsPostBack értékét ellenőrizzük. Ugyanis amikor majd az Ok gombra kattintunk, akkor ismét lefut a Page_Load, mivel ugyanezt a web oldalt: a WebForm3.aspx-et hívja a nyomógomb. Ekkor, ha nem ellenőriznénk az IsPostBack-et, akkor a Page_Load alatt ismét betöltetnénk az XML tartalmát és a gomb Click eseménye csak ezután kapná meg a vezérlést. Ekkor viszont már elveszett a felhasználó által esetlegesen módosított érték. Az IsPostBack vizsgálatával ez a hiba elkerülhető.
      if (!IsPostBack)
      {
A XML betöltése ugyanúgy történik, mint a WebForm1.aspx lapon.
        XmlDocument xd = new XmlDocument();
        xd.Load(Server.MapPath("config.xml"));      
        TextBox1.Text = xd.DocumentElement["host"].InnerText;
        TextBox2.Text = xd.DocumentElement["frommail"].InnerText;
      }
    }
Amikor tehát az Ok gombra kattint a felhasználó, akkor kell eltárolnunk az XML állományunkba a változtatásokat.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      XmlDocument xd = new XmlDocument();
Először is betöltjük az XmlDocument-be az aktuális értékeket.
      xd.Load(Server.MapPath("config.xml"));      
Majd egy egyszerű értékadással átírjuk a tartalmat.
      xd.DocumentElement["host"].InnerText = TextBox1.Text;
      xd.DocumentElement["frommail"].InnerText = TextBox2.Text;
Végül a Save hívásával kiírjuk ismét az XML állományba, immár az új tartalmat.
      xd.Save(Server.MapPath("config.xml"));
A művelet végén pedig visszaugrunk a nyitó lapra, a WebForm1.aspx-re.
      Response.Redirect("WebForm1.aspx");
    }

ASP.NET cikksorozat