C# - ASP.NET kontrollal előállított HTML oldal küldése e-mail-ben

forráskód letöltése
Felhasználva a Visual Studio.NET-ben lévő webes kontrolokat könnyedén előállíthatunk tetszőleges tartalmú web oldalt, melyet egy böngészőben megjeleníthetünk. Felvetődik a kérdés, hogy miként tudnánk az így létrehozott web oldalakat HTML e-mail-ben elküldeni egy tetszőleges címre. Mellékelt példában egy adatbázisból végzünk lekérdezést, melynek eredményét egy DataGrid-ben jelentjük meg, és egyúttal biztosítjuk annak lehetőségét, hogy a DataGrid tartalma az adott formázással együtt e-mail-ben elküldhető legyen.
Mellékelt példa megnyitása előtt szükséges egy HTMLEmail nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával. További szükséges előkészület, hogy a WebForm1.cs forráskód 27. sorában lévő connStr változónak olyan értéket adjunk, mely biztosítja a Northwind példaadatbázis elérését. A server változóban az e-mail küldéshez szükséges SMTP szerver nevét vagy IP címét kell megadnunk, míg a from változóba a küldő e-mail címét, és végül a to változóba a címzett e-mail címét kell megadnunk.
Első lépésként létrehozunk egy kapcsolatot az adatbázissal, majd futtatunk egy egyszerű lekérdezést.
    private void Page_Load(object sender, System.EventArgs e)
    {
      if (!IsPostBack)
      {
        SqlConnection connection = new SqlConnection(connStr);
        connection.Open();
        SqlDataAdapter da = new SqlDataAdapter("select top 10 * from Products", connection);                      
        DataSet ds = new DataSet();
        da.Fill(ds);
A lekérdezés eredményét megjelenítjük a web oldalon lévő DataGrid kontrolban, majd zárjuk az adatbázis kapcsolatot.
        DataGrid1.DataSource=ds.Tables[0].DefaultView;
        DataGrid1.DataBind();
        connection.Close();
Az e-mail küldéshez szükségünk lesz arra, hogy az imént megjelenített DataGrid teljes HTML kódját elérhessük sztringként. Levelünk szövegében ezt a HTML kódot kell megadnunk ahhoz, hogy az e-mail tartalma egyezzen a web oldalon megjelenő tartalommal.
Ezt a HTML kódot legeneráltathatjuk a DataGrid kontrollal. Ehhez szükségünk lesz egy StringBuilder osztályra, melyet a StringWriter osztály létrehozásánál kell felhasználnunk.
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
A HTML kód előállításához még egy HtmlTextWriter osztályra is szükségünk lesz, ennek létrehozásakor a StringWriter osztály példányát kell megadnunk.
        HtmlTextWriter htw = new HtmlTextWriter(sw);
Ezt követően már meghívhatjuk a DataGrid RenderControl függvényét, mely elvégzi az adott kontrol legenerálását HTML kóddá. Paraméterként az imént létrehozott HtmlTextWriter osztály példányát kell megadnunk.
        DataGrid1.RenderControl(htw);
Az eredményt a StringBuilder osztályon keresztül olvashatjuk ki. Ezt a HTML kódot a példa kedvéért a TextBox1 kontrolban megjelenítjük.
        TextBox1.Text = sb.ToString();
      }
    }
Ezzel a módszerrel természetesen nemcsak a DataGrid HTML kódjához juthatunk hozzá, hanem bármely más webes kontrolt rábírhatunk e feladat elvégzésére a RenderControl függvény meghívásával.
Az e-mail küldés most már egyszerű, csupán annyi a teendőnk, hogy egy MailMessage osztály property-jeit megfelelő módon feltöltünk, majd az SmtpMail osztály segítségével elküldjük az e-mail-t. Fontos, hogy az e-mail-t HTML típusra válasszuk. Ezt a BodyFormat property-ben tehetjük meg. Ettől kezdve a Body property-ben megadott szring, amennyiben HTML kódokat tartalmaz, úgy az e-mailben ez értelmezésre kerül és eredményként a web oldalon is látható tartalom jelenik meg benne.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      MailMessage mm = new MailMessage();
      mm.BodyFormat = MailFormat.Html;
      mm.From = from;
      mm.To = to;
      mm.Subject = "teszt";
      mm.Body = TextBox1.Text;
      SmtpMail.SmtpServer=server;
      SmtpMail.Send(mm);
    }