Не думал, что тривиальная задача отправки письма через 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 и почта успешно отправилась.