Web-mail služba pomocí ASP.NET

28. května 2002

Velmi často se mohou stát případy, kdy potřebujeme přimět naši webovou stránku k posílání emailu. Dnes si ukážeme, jak to jde udělat pomocí funkcí .NET frameworku.

V ASP.NET je podpora Simple Mail Transfer Protokolu (SMTP) přímo zakomponována v systémových assemblies. Není tedy třeba využívat ActiveX, či jiné COM knihovny, jako tomu je v ASP. Na pomoc máme třídu SmtpMail v jmenném prostoru System.Web.Mail s její jedinou statickou funkcí Send (nemusíme vytvářet novou instanci třídy). Pomocí této metody můžeme rychle posílat emailové zprávy, a to za použití této syntaxe:

System.Web.Mail.SmtpMail.Send („od@domena.cz“, „komu@domena.cz“, „Předmět zprávy.“, „Tělo zprávy“);

Tento způsob je velmi jednoduchý a jelikož je metoda Send přetížená, můžeme ji volat i jinými způsoby. Jedním z nich je použití třídy MailMessage k definici nového emailu. Je nutné založit jeho novou instanci, vyplnit vlastnosti, které popisují zprávu a opět zavolat metodu Send:

MailMessage zprava = new MailMessage();
MailAttachment priloha = new MailAttachment(„c:\\soubor.txt“);
zprava.From = „od@domena.cz“;
zprava.To = „komu@domena.cz“;
zprava.Subject = „Předmět zprávy.“;
zprava.Body = „Tělo zprávy“;
zprava.BodyFormat = MailFormat.Text;
zprava.Attachments.Add(priloha);
SmtpMail.Send(zprava);

Tento způsob snadno využijeme například k zasílání ceníků nebo informačních materiálů, kde dynamicky doplňujeme pouze vlastnost To a ostatní máme třeba fixně zadané na serveru.

Jiný případ může nastat, pokud si chceme naprogramovat odesílací schopnosti svého poštovního klienta, příkladem jsou různé web-mail služby. Zkusíme si tedy takový webmail vytvořit. První část se skládá z návrhu uživatelského rozhraní. To vytvoříme do souboru email.aspx do kterého doplníme tento kód:

<%@ Page language=“c#“ Codebehind=“email.aspx.cs“ AutoEventWireup=“false“ Inherits=“email.WebForm1″ %>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“ >
<HTML>
<HEAD>
<title>Použití SMTP</title>
</HEAD>
<body bgColor=“#ffffff“>
<form id=“Form1″ method=“post“ runat=“server“>
<P align=“center“>&nbsp; <STRONG><FONT size=“4″>Použití ASP.NET k odeslání emailu.</FONT></STRONG></P>
<P>
<TABLE id=“Table1″ cellSpacing=“1″ cellPadding=“1″ width=“300″ align=“center“ border=“1″>
<TR>
<TD>
<asp:Label id=“Label1″ runat=“server“>Od:</asp:Label></TD>
<TD>
<asp:TextBox id=“txtFrom“ runat=“server“ Width=“100%“></asp:TextBox></TD>
</TR>
<TR>
<TD>
<asp:Label id=“Label2″ runat=“server“>Komu:</asp:Label></TD>
<TD>
<asp:TextBox id=“txtTo“ runat=“server“ Width=“100%“></asp:TextBox></TD>
</TR>
<TR>
<TD>
<asp:Label id=“Label3″ runat=“server“>Předmět:</asp:Label></TD>
<TD>
<asp:TextBox id=“txtSubject“ runat=“server“ Width=“100%“></asp:TextBox></TD>
</TR>
<TR>
<TD>
<asp:Label id=“Label4″ runat=“server“>Tělo:</asp:Label></TD>
<TD>
<asp:TextBox id=“txtBody“ runat=“server“ TextMode=“MultiLine“ Height=“252px“ Width=“363px“></asp:TextBox></TD>
</TR>
<TR>
<TD>
<asp:Label id=“Label5″ runat=“server“>Příloha:</asp:Label></TD>
<TD>
<INPUT type=“file“ runat=“server“ id=“txtAttachment“ width=“100%“></TD>
</TR>
<TR>
<TD colSpan=“2″>
<center>
<asp:Button id=“btnSend“ runat=“server“ Text=“Pošli email“></asp:Button></center>
</TD>
</TR>
</TABLE>
<center>
<br>
<asp:Label id=“lblResult“ runat=“server“ Font-Size=“Large“></asp:Label></center>
</P>
</form>
</body>
</HTML>

Pro připojení přílohy ke zprávě je použito elementu <INPUT>, u kterého musí být nastaveno runat= „server“, abychom si pro něj mohli nadeklarovat příslušné proměnné v souboru se zdrojovým kódem. Ostatní elementy začínající <asp:…> musí mít tuto hodnotu nastavenu také, aby mohli být generovány na serveru. Kód, který se stará o samotné posílání emailu, zapíšeme do souboru email.aspx.cs:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Mail;
namespace email
{
     public class WebForm1 : System.Web.UI.Page
     {
         protected System.Web.UI.WebControls.Label Label1;
         protected System.Web.UI.WebControls.TextBox txtFrom;
         protected System.Web.UI.WebControls.Label Label2;
         protected System.Web.UI.WebControls.TextBox txtTo;
         protected System.Web.UI.WebControls.Label Label3;
         protected System.Web.UI.WebControls.TextBox txtSubject;
         protected System.Web.UI.WebControls.Label Label4;
         protected System.Web.UI.WebControls.TextBox txtBody;
         protected System.Web.UI.WebControls.Label Label5;
         protected System.Web.UI.HtmlControls.HtmlInputFile txtAttachment;
         protected System.Web.UI.WebControls.Label lblResult;
         protected System.Web.UI.WebControls.Button btnSend;
         override protected void OnInit(EventArgs e)
         {
             this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
             base.OnInit(e);
         }

Tento kód zajistí připojení potřebných namespace, deklaraci proměnných zastupujících ovládací prvky formuláře a k tlačítku Odešli email (btnSend) připojí událost Click spojenou s metodou btnSend_Click. Tato událost nastane vždy, když uživatel stiskne toto tlačítko. Do této metody doplníme následující příkazy:

          private voidbtnSend_Click(object sender, System.EventArgs e)
          {
               string strAttachment;
                 try
               {
                   MailMessage zprava = new MailMessage();
                   if(txtAttachment.PostedFile != null)
                   {
                         strAttachment = txtAttachment.PostedFile.FileName;
                      if (strAttachment.Length > 0)
                      {
                          strAttachment =strAttachment.Substring(strAttachment.LastIndexOf(„\\“) + 1);
                         txtAttachment.PostedFile.SaveAs(„c:\\“ + strAttachment);
                         MailAttachmentpriloha = new MailAttachment(„c:\\“ + strAttachment);
                         zprava.Attachments.Add(priloha);
                        System.IO.File.Delete(„c:\\“ + strAttachment);
                      }
                    }
                   zprava.From = txtFrom.Text;
                   zprava.To = txtTo.Text;
                   zprava.Subject = txtSubject.Text;
                    zprava.Body = txtBody.Text;
                   zprava.BodyFormat = MailFormat.Text;
                   SmtpMail.Send(zprava);
                   lblResult.Text = „Zpráva byla úspěšně odeslána.“;
                   lblResult.ForeColor = Color.Green;
                   txtFrom.Text = „“;
                   txtTo.Text = „“;
                   txtSubject.Text = „“;
                   txtBody.Text = „“;
               }
              catch(Exception exception)
               {
                   lblResult.Text = exception.ToString();
                   lblResult.ForeColor = Color.Red;
               }
          }
       }
}

Jako první zde vytváříme textovou proměnnou strAttachment reprezentující jméno souboru, který se při odesílání emailu nahrává na server. Dále je nutno ošetřit, zda byl vůbec nějaký soubor na server nahrán, což zajišťuje podmínka if(txtAttachment.PostedFile != null). Pokud byl tedy soubor nahrán, je uložen na disk C:, následně přidán do přílohy zprávy a smazán. Dále je zpráva vytvořena podle postupu popsaného výše. Pokud byla zpráva úspěšně odeslána, zobrazí se zelené hlášení, pokud byla generována výjimka, je vypsána barvou červenou.

Námět do diskuze:
Na tomto přikladu si můžeme všimnout jedné zajímavosti. Server nijak neověřuje, zda emailová adresa v řádku Od je skutečně vaše. Některé iniciativnější servery provedou kontrolu, zda doména v zadané adrese existuje, ale to je vše. Toho také patřičně využívají některé emailové wormy. SMTP je protokol, který vznikal na počátcích internetu, ale i tak si myslím, že by si jisté zabezpečení zasloužil. A co si myslíte vy?

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *