Отправка письма через сервер mail.ru с помощью SmtpClient .NET. Код на C#.

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

Опубликовать в Facebook
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Запись опубликована в рубрике IT опыт, IT рецепты. Добавьте в закладки постоянную ссылку.