Silverlight è un plug-in per browser e come tale Microsoft mantiene volutamente molto elevato il contesto di sicurezza, per evitare che codice malizioso possa compromettere il sistema dell'utente. Per queste ed altre motivazioni, se vogliamo aggiungere una funzionalità di invio email alla nostra applicazione, dobbiamo appoggiarci ad un web service che si occupi di eseguire tale operazione.
Un servizio ASP.NET può utilizzare le classi SmtpClient e MailMessage del namespace System.Net.Mail, con le quali preparare il messaggio e comunicare con il server SMTP per procedere nell'invio. Oltre ai parametri di tipo stringa per destinatario, soggetto e messaggio, se vogliamo consentire all'utente di aggiungere un allegato possiamo predisporre il servizio per ricevere un array di byte. Vediamone una semplice implementazione:
[WebMethod] public void Send(string subject, string to, string message, byte[] attach) { MailMessage mailMessage = new MailMessage(); mailMessage.Subject = subject; mailMessage.SubjectEncoding = System.Text.Encoding.UTF8; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; mailMessage.IsBodyHtml = true; SmtpClient smtpClient = new SmtpClient(); smtpClient.Host = "smtp.server.it"; smtpClient.UseDefaultCredentials = false; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Credentials = new NetworkCredential("local.invalid", "xxxxxx"); mailMessage.From = new MailAddress("local.invalid", string.Empty); mailMessage.To.Add(new MailAddress(to, string.Empty)); mailMessage.Body = string.Format("{0}", message); using (MemoryStream stream = new MemoryStream(attach)) { Attachment _attachment = new Attachment(stream, "allegato.jpg", MediaTypeNames.Application.Octet); mailMessage.Attachments.Add(_attachment); smtpClient.Send(mailMessage); } smtpClient.Dispose(); }
Il codice è semplice e autoesplicativo; per creare un oggetto Attachment corrispondente all'allegato possiamo creare uno stream con i byte inviati. Nell'esempio specifichiamo direttamente il nome dell'allegato per esteso, direttamente con l'estensione. Possiamo perfezionare il codice creando una logica autonoma di calcolo del Mime corrispondente.
Il WebMethod Send può essere esposto da un semplice webservice asmx, con cui possiamo interagire dal progetto Silverlight dopo aver creato un riferimento ed aver preparato la classe proxy.
Una chiamata al servizio potrebbe essere così definita:
Service.SendEmailServiceSoapClient service = new Service.SendEmailServiceSoapClient(); service.SendCompleted += new EventHandler<AsyncCompletedEventArgs>((obj, args) => { if (args.Error == null) { txbEsito.Text = "messaggio inviato correttamente"; } else { txbEsito.Text = String.Format("Si è verificato un errore {0}", args.Error); } }); service.SendAsync(txbSoggetto.Text, txbDestinatario.Text, txbMessaggio.Text, barray);
Come di consueto, in Silverlight usiamo il modello asincrono: al metodo SendAsync passiamo tutti i parametri che riteniamo utili per l'invio della email, e ci registriamo all'evento SendCompleted per gestirne l'esito.
Possiamo consentire all'utente di scegliere un file da allegare alla email attraverso la classe OpenFileDialog. Dopo aver scelto il file, in questo esempio una immagine jpg, apriamo il FileStream e andiamo a valorizzare l'array di byte che passeremo al servizio, così come nel codice seguente.
OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "Text Files (*.jpg)|*.jpg"; if (openFileDialog1.ShowDialog() == true) { using (FileStream reader = openFileDialog1.File.OpenRead()) { int len = (int)reader.Length; barray = new Byte[len]; reader.Read(barray, 0, len); } }
In allegato potete trovare il codice completo ed un semplice design che può essere una base di partenza per realizzare un "modulo di contatto".
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Introduzione alle Container Queries
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Triggerare una pipeline su un altro repository di Azure DevOps
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Scrivere selettori CSS più semplici ed efficienti con :is()
Generare velocemente pagine CRUD in Blazor con QuickGrid
Utilizzare una qualunque lista per i parametri di tipo params in C#
Utilizzare l nesting nativo dei CSS
Escludere alcuni file da GitHub Secret Scanning
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
I più letti di oggi
- Nuovi corsi ASP e ASP.NET dal 22 novembre a Lugo (RA)
- Microsoft Security Bulletin MS05-029
- Longhorn si chiamerà Windows Vista?
- Semplificare la gestione degli array in querystring in ASP.NET Core
- .NET Aspire per applicazioni distribuite
- Aggiungere un valore neutro ad una DropDownList con il DataSet
- Paginazione e chiavi multiple con il controllo GridView
- Utilizzare CORS con Azure Cosmos DB
- Scoprire le applicazioni senza la pagina di errore personalizzata con LINQ e Microsoft.Web.Administration
- Utilizzare App Streaming Install nella Universal Windows Platform