System.Net.Mail et smtp.gmail.com
2009-04-21 #ap#code-snippets#csharp
Poursuivant mes essais de migration d'Altrr-Press vers ASP.NET 2.0, j'ai enfin étudié comment remplacer System.Web.Mail par System.Net.Mail. Jusqu'à présent, j'utilisais la méthode décrite dans mon plus célèbre billet System.Web.Mail and smtp.gmail.com.
Par rapport à cette méthode, les modifications à apporter n'ont finalement pas été si compliquées que ça :
public string sendMail (string from, string to, string cc, string bcc, string subject, string body) {
// Mail initialization
MailMessage mail = new MailMessage();
mail.From = new MailAddress(from);
mail.To.Add(to);
if (cc != "") {
mail.Cc.Add(new MailAddress(cc));
}
if (bcc != "") {
mail.Bcc.Add(new MailAddress(bcc));
}
mail.Subject = subject;
mail.IsBodyHtml = false;
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.Body = body;
// Smtp configuration
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
// - smtp.gmail.com use smtp authentication
smtp.Credentials = new NetworkCredential("myemail@gmail.com", "mypassword");
// - smtp.gmail.com with System.Net.Mail accepts port 25 or 587
smtp.Port = 25;
// - smtp.gmail.com use STARTTLS (some clients call this SSL)
smtp.EnableSsl = true;
// Mail sending
try {
smtp.Send(mail);
return "";
} catch (Exception ex) {
return ex.Message;
}
}
Une première petite difficulté est venu des propriétés From, To, Cc et Bcc de l'objet MailMessage qui ne sont plus de type chaine comme en .NET 1 mais du type MailAddress ou collection de MailAddress.
Mais le plus gros problème, c'est qu'avec System.Net.Mail, je n'ai jamais réussi à utiliser le port 465 alors qu'il fonctionne très bien avec System.Web.Mail (et même sur un site en .NET 2 qui utilise encore System.Web.Mail !!!). Et comme en local le port 587 n'est pas ouvert, j'ai un peu trainé pour faire mes tests puisque je devais à chaque fois faire une mise en production afin de vérifier si cela fonctionnait.
Mais au final, j'ai quand même découvert qu'avec System.Net.Mail :
- cela fonctionne aussi bien avec le port 587 qu'avec le port 25 (!)
- il n'est même pas nécessaire de définir la propriété smtp.Port pour que le mail parte (re !)