Inviare e-mail con ASP.NET, XML e XSLT

di Cristian Civera, in UserScript, ASP.NET, XML,

Nella composizione di e-mail per conferme di ordini, registrazioni o newsletter è frequente commettere un errore di sintassi nel concatenare le stringhe per poter creare un body personalizzato per ogni utente.
Questo perché caratteri come gli apici doppi, molto presenti nel codice HTML, non vanno d'accordo con la sintassi del linguaggio di programmazione.
Un approccio diverso è possibile sfruttando un nuovo linguaggio derivante da XML, XSLT, che ci permette di formattare e trasformare dati generici XML in qualunque altro formato, anche per media diversi dal Web.
Basta quindi usare un file XML con, ad esempio, nome e cognome dell'utente in base ad uno schema di nostra invenzione:

<data>
  <name>Cristian</name>
  <surname>Civera</surname>
</data>

Il file XSLT che effettuerà la trasformazione sarà:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes" method="xml"/>
    <xsl:template match="data">
      <html>
        Carissimo <xsl:value-of select="name" />  <xsl:value-of select="surname" />,
        ti mando un'email di prova.

        <a href="https://www.aspitalia.com">Clicca qui per visitare ASPItalia.com</a>
      </html>
    </xsl:template>
</xsl:stylesheet>

Salviamo questo file con nome "email.xslt"
Anche se non si conosce XSLT si noterà che abbiamo creato un documento HTML che va ad inserire in certi punti i valori dei nostri nodi name e surname. Da notare il tag di ritorno a capo , leggermente diverso dal tag solito poiché essendo XSLT derivante da XML è necessario produrre almeno un file well-formatted.
Il .NET Framework offre un ampio supporto per XML e derivanti, vediamo quindi come inviare la nostra e-mail ed effettuare la trasformazione:

<%@ Page language="c#" debug="true" %>
<%@ Import namespace="System.Web.Mail" %>
<%@ Import namespace="System.Xml" %>
<%@ Import namespace="System.Xml.Xsl" %>
<%@ Import namespace="System.Xml.XPath" %>
<%@ Import namespace="System.IO" %>
<%@ Import namespace="System.Text" %>
<script runat="server">
  private void sendXmlEMail(MailMessage MailMsg, string XsltFilePath)
  {
    //creo lo stream temporaneo
    MemoryStream stream=new MemoryStream();
    //creo l'oggetto xml
    XmlTextWriter writer=new XmlTextWriter(stream,Encoding.Default);
    writer.WriteStartElement("data");
    writer.WriteElementString("name",txtName.Value);
    writer.WriteElementString("surname",txtSurname.Value);
    writer.WriteEndElement();
    writer.Flush();
    stream.Position=0;
    //carico l'xmldocument
    XPathDocument xmlDoc=new XPathDocument(stream);
    //la stringa che conterrà il body
    StringBuilder message=new StringBuilder();
    //carico il file xslt
    XslTransform xmlEngine=new XslTransform();
    xmlEngine.Load(XsltFilePath);
    //effettuo la trasformazione
    xmlEngine.Transform(xmlDoc,null,new StringWriter(message),null);
    MailMsg.Body=Server.HtmlDecode(message.ToString());
    stream.Close();
    //invio l'email
    SmtpMail.Send(MailMsg);
    Response.Write("messaggio inviato");

  }

  private void sendEmail_Click(object s, EventArgs e)
  {
    MailMessage msg=new MailMessage();
    //imposto le normali proprietà
    msg.From=txtFrom.Value;
    msg.To=txtTo.Value;
    msg.Subject=txtSubject.Value;
    msg.BodyFormat=MailFormat.Html;
      sendXmlEMail(msg,Server.MapPath("email.xslt"));
  }

</script>
<form runat="server">
<h1>Invio email con XSLT</h1>
Mittente: <input type="text" runat="server" id="txtFrom"><br>
Destinatario: <input type="text" runat="server" id="txtTo"><br>
Oggetto: <input type="text" runat="server" id="txtSubject"><br>
Nome: <input type="text" runat="server" id="txtName"><br>
Cognome: <input type="text" runat="server" id="txtSurname"><br>
<input type="submit" value="Invia" runat="server" onServerClick="sendEmail_Click">
</form>

Nell'evento sendEmail_Click chiamato dal pulsante Invia associamo le normali proprietà per inviare un?e-mail, mentre deleghiamo il compito di prepare il body alla funzione sendXmlEMail.
Questa crea tramite XmlTextWriter il documento XML (definito precedentement) in uno stream temporaneo, crea un XPathDocument da esso per poter navigare nei nodi, carica il tipo XslTransform dal nostro file email.xslt ed effettua la trasformazione.
Tutto il codice è comunque compreso nell'allegato.

Per maggiori informazioni si veda:
le specifiche W3C
http://www.w3.org/TR/xslt

#365 - Inviare un'e-mail con ASP.NET
https://www.aspitalia.com/liste/usag/script.aspx?ID=365

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi