Не думал, что тривиальная задача отправки письма через SMTP сервер mail.ru окажется столь нетривиальной задачей.
На сайте mail.ru даются следующие параметры для отправки сообщений:
- Ваш электронный адрес (имя почтового ящика/e-mail address) — это полное название вашего почтового ящика, включая логин, значок «@» собачки и домен (например, vash_pomoshnik@mail.ru).
- Сервер исходящей почты (SMTP-сервер) — smtp.mail.ru;
- Имя пользователя — это полное название вашего почтового ящика, включая логин, значок «@» собачку и домен (например, vash_pomoshnik@mail.ru);
- Пароль — текущий пароль, который вы используете для входа в почтовый ящик;
- Порт SMTP — 465 (протокол шифрования SSL/TLS).
- Аутентификация — Обычный пароль (без шифрования).
В настройках почтовой программы необходимо указать, что сервер исходящей почты (или сервер SMTP) требует авторизации.
Соответственно, в параметрах к методу передаем:
- SMTPServer — smtp.mail.ru
- SmtpPort — 465. Порт в документации указан неверно. При обращении к mail.ru по 465 порту после продолжительного ожидания происходит выход с ошибкой «The operation has timed out.» Нужно указывать 25 порт.
- FromName — можно оставить пустым
- FromAddr — адрес на сервере mail.ru с которого производится отправка сообщения
- ToName — можно оставить пустым
- ToAddr — адрес на который будет производится отправка сообщения.
- Subject — произвольная тема
- Body — тело письма
- Login — ваш e-mail адрес на mail.ru, например, name@mail.ru
- Password — ваш пароль на mail.ru
- EnableSSL — true
public static bool SendMail(string SmtpServer, int SmtpPort, string FromName, string FromAddr, string ToName, string ToAddr, string Subject, string Body, string Login, string Password, bool EnableSSL = false) { try { //string ver = System.Reflection.Assembly.LoadFrom(Config.BasePath + "BackupDB.exe").GetName().Version.ToString(); //Body += string.Format("\nServer: {0}\nVersion: {1}", Environment.MachineName, ver); //Messages.Instance.Add("SMTP server is: " + SmtpServer); //Messages.Instance.Add("SMTP port is: " + SmtpPort); SmtpClient smtp = new SmtpClient(SmtpServer, SmtpPort); using (MailMessage message = new MailMessage()) { //Encoding encoding = System.Text.Encoding.GetEncoding("windows-1251"); //Encoding encoding = System.Text.Encoding.Default; Encoding encoding = System.Text.Encoding.UTF8; message.IsBodyHtml = false; message.SubjectEncoding = encoding; message.BodyEncoding = encoding; Messages.Instance.Add("From address: " + FromAddr); message.From = new MailAddress(FromAddr, FromName, encoding); message.Bcc.Add(new MailAddress(ToAddr, ToName, encoding)); message.Subject = Subject; message.Body = Body; //mailClient.UseDefaultCredentials = true; smtp.EnableSsl = EnableSSL; Messages.Instance.Add("Enable SSL is: " + EnableSSL.ToString()); if (!String.IsNullOrEmpty(Login) && !String.IsNullOrEmpty(Password)) { //Messages.Instance.Add("Login is " + Login); smtp.Credentials = new System.Net.NetworkCredential(Login, Password); } smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.Send(message); } } catch (Exception ex) { //BackupDB.Utils.PrintException(ex, "", false); return false; } //BackupDB.Utils.LogMsg("Mail to /" + ToAddr + "/ send ok."); return true; }
По стандартным параметрам с 465 портом без проблем работает Thunderbird. Собственно, именно поэтому потратил массу времени, пытаясь заставить работать C# код с 465 портом. Однако Altaro VM Backup не отправлял нотификации через SMTP сервер smtp.mail.ru при использовании таких параметров. Стоило в Altaro сменить порт с 465 на 25 и почта успешно отправилась.