Spesso si leggono nei forum post di richiesta su come poter inviare e-mail (con e senza allegati) utilizzando le classi che il Framework .Net mette a disposizione. Spero che questo piccolo post con relativo codice d'esempio possa tornare utile.
Per inviare una semplice mail di testo senza allegati è sufficiente scrivere:
1 //Mail Plain Text - Senza allegato
2 MailMessage mailMessagePlainText = new MailMessage();
3 mailMessagePlainText.From = new MailAddress("indirizzo.mittente@dominio.it", "Mittente");
4 mailMessagePlainText.To.Add (new MailAddress ("destinatario@dominio.it","Destinatario"));
5 mailMessagePlainText.Subject ="Plain Text e-mail";
6 //mailMessage.CC utilizzare se è necessario inviare in copia carbone
7 mailMessagePlainText.Body ="Questa è una bellissima e-mail, soprattutto utile!";
Se invece volessimo inviare un'e-mail in formato HTML con allegato, possiamo scrivere:
1 //Mail Html - con allegato
2 MailMessage mailMessageHTMLWithAttach = new MailMessage ();
3 mailMessageHTMLWithAttach.From = new MailAddress("indirizzo.mittente@dominio.it", "Mittente");
4 mailMessageHTMLWithAttach.To.Add (new MailAddress ("indirizzo.destinatario@dominio.it","Destinatario"));
5 mailMessageHTMLWithAttach.Subject = "HTML e-mail";
6 //mailMessage.CC utilizzare se è necessario inviare in copia carbone
7 mailMessageHTMLWithAttach.Body = "<html><body><h1>Hello World</h1><h2>by e-mail</h2></body></html>";
8 mailMessageHTMLWithAttach.IsBodyHtml = true;
9 ContentType contType = new ContentType ("text/plain");
10 mailMessageHTMLWithAttach.Attachments.Add (new Attachment ("Allegato.txt", contType ));
11 //oppure
12 //mailMessageHTMLWithAttach.Attachments.Add(new Attachment("Allegato.txt", MediaTypeNames.Text.Plain));
13 //o semplicemente
14 //mailMessageHTML.Attachments.Add (new Attachment ("Allegato.txt"));
In questo caso si suppone che il file Allegato.txt si trovi nella stessa directory dell'eseguibile.
Infine se volessimo inviare un'e-mail in formato HTML con allegato, ed un'immagine incorporata nel body HTML, è necessario scrivere qualche riga di codice in più, ma nulla di complicato:
1 //Mail HTML - con immagini incorporate
2 MailMessage mailMessageWithEmbeddedPicture = new MailMessage ();
3 mailMessageWithEmbeddedPicture.From = new MailAddress("indirizzo.mittente@dominio.it", "Mittente");
4 mailMessageWithEmbeddedPicture.To.Add (new MailAddress ("indirizzo.destinatario@dominio.it","Destinatario"));
5 mailMessageWithEmbeddedPicture.Subject = "HTML e-mail with embedded picture";
6
7 string htmlBody = "<html><body><h1>Hello World</h1><h2>by e-mail</h2><img src=\"cid:emb1\" /></body></html>";
8 //Crea un'istanza AlternateView
9 AlternateView altViewHtml = AlternateView.CreateAlternateViewFromString (htmlBody ,null, MediaTypeNames.Text.Html );
10 //Crea un'istanza LinkedResource
11 LinkedResource embeddedPicture = new LinkedResource("Foto.jpeg", MediaTypeNames.Image.Jpeg);
12 embeddedPicture.ContentId = "emb1";
13 //Aggiunge l'istanza LinkedResource all'istanza AlternateView
14 altViewHtml.LinkedResources.Add(embeddedPicture);
15
16 //Per i client che non supportano la visualizzazione HTML
17 string warningMessage = "Utilizzare un client di posta che supporta la visualizzazione dei messaggi in HTML";
18 //Creiamo una nuova istanza di AlternateView
19 AlternateView altViewText = AlternateView.CreateAlternateViewFromString(warningMessage, contType );
20
21 mailMessageWithEmbeddedPicture.AlternateViews.Add(altViewHtml);
22 mailMessageWithEmbeddedPicture.AlternateViews.Add(altViewText);
In quest'ultimo caso, se si utilizza ad esempio Microsoft Outlook come client di posta elettronica, il risultato sarebbe del tipo:
In tutti i tre casi descritti, per inviare il messagio utilizziamo un'istanza della classe System.Net.SmtpClient.
1 SmtpClient smtpClient = new SmtpClient("smtp.dominio.it");
2
Nel caso in cui il server SMTP richieda l'autenticazione è necessario fornire le credenziali d'accesso mediante istanza della classe System.Net.NetworkCredential. In più se supportata dal server si può utilizzare SSL:
1 //se è necessario autenticarsi...
2 //smtpClient.Credentials = new System.Net.NetworkCredential("username", "password");
3 //oppure
4 //smtpClient.Credentials = new System.Net.NetworkCredential("username", "password","dominio");
5
6 //Se è necessario ed è supportata la cifratura SSL
7 //smtpClient.EnableSsl =true ;
Il codice d'invio (Sincrono) dei messagi di posta è:
1 try
2 {
3 smtpClient.Send(mailMessagePlainText);
4 smtpClient.Send(mailMessageHTMLWithAttach);
5 smtpClient.Send(mailMessageWithEmbeddedPicture);
6 }
7 catch (SmtpException smtpException)
8 {
9 MessageBox.Show(String.Format("SmtpException : {0}", smtpException.Message));
10 }
11 catch (Exception ex)
12 {
13 MessageBox.Show(string.Format("Exception: {0}", ex.Message));
14 }
In tutti i casi, per inviare un messagio di posta elettronica utilizzando le classi messe a disposizione dal Framework .Net, utilizziamo un'istanza della classe System.Net.Mail.MailMessage, ed impostando le relative proprietà possiamo inviare e-mail in formato testo/html con e senza allegati. Interessante è l'utilizzo di istanze delle classe AlternateView per la visualizzazione in diversi formati del messaggio di posta. La proprietà SmtpClient.EnableSsl è stata introdotta con la versione 2.0 del Framework .Net. In allegato al post il progetto d'esempio completo.
Codice: TestMai.zip