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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.