Класс для отправки сообщения на почту Mail.ru - Gmail и.т.д сервера.
Для начала создадим класс EmailChecker.cs - Отвечает за проверку Http/Https
И создадим класс EmailSender.cs - Отвечает за отправку
Весь код прокомментирован!
Вызываем отправку:
[Примечание]
Если используете просто отправку сообщением то время ожидания ставьте от 7000
Если же используете с добавлением файлов то время ожидания ставьте от 12000
В противном случае получите ошибку что "время ожидания истекло".
Для начала создадим класс EmailChecker.cs - Отвечает за проверку Http/Https
C#:
namespace SmtpMessage
{
using System.Text.RegularExpressions;
public class EmailChecker
{
public static bool CheckValidAddress(string emailInput)
{
var _regex = new Regex(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
RegexOptions.CultureInvariant | RegexOptions.Compiled);
return _regex.IsMatch(emailInput) ? true : false;
}
}
}
Весь код прокомментирован!
C#:
/* Author r3xq1 */
namespace SmtpMessage
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
public class EmailSender
{
// Сначала добавляем в List все файлы из определённых папок
private static readonly List<string> AttachFiles = new List<string>
{
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "f7e4a4595e9ff8ce.png"),
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "photo_2019-07-06_09-29-58.jpg"),
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Dazhe_Sigareta_Vypala.gif")
};
/// <summary>
/// Метод для отправки сообщения на почтовый сервер
/// </summary>
/// <param name="login">Ваш логин от почты</param>
/// <param name="displayname">Отображаемое имя вместо почты пользователя</param>
/// <param name="password">Ваш пароль от почты</param>
/// <param name="to">Кому отправлять</param>
/// <param name="logo">Тело сообщения</param>
/// <param name="server">Сервер почты</param>
/// <param name="port">Порт почты</param>
/// <param name="time">Таймаут ожидания для отправки</param>
/// <returns></returns>
public static bool Inizialize(string login, string displayname, string password, string to, string logo, string server, int port, int time)
{
try
{
using (var mess = new MailMessage())
{
mess.From = new MailAddress(login, displayname, Encoding.UTF8); // Адрес отправителя, Отображаемое имя ( за место почты )
mess.To.Add(new MailAddress(to, null, Encoding.UTF8)); // Адрес получателя
mess.Subject = Environment.UserName; // Тема сообщения
mess.SubjectEncoding = Encoding.UTF8; // Кодировка UTF-8 для темы сообщения
mess.BodyEncoding = Encoding.UTF8; // Кодировка UTF-8 для тела сообщения
mess.Body = logo; // Текст сообщения
mess.IsBodyHtml = true; // Сообщение в формате html
mess.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; // Уведомление если доставка неудачна
// Проходимся в цикле по List<string>
for (int i = 0; i < AttachFiles.Count; i++)
{
mess.Attachments.Add(new Attachment(AttachFiles[i])); // Добавляем файлы для отправки
}
using (var client = new SmtpClient($"smtp.{server}", port)) // Задаём параметры сервера и порта для Smtp клиента
{
// Ssl3 - Используется для защиты транспортного уровня интернет соединений вместе с TLSv1 / 1.1 / 1.2.
// По желанию если работает без него можно исключить.
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
// ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3; - Для отключения
client.EnableSsl = true; // Включаем SSL шифрование
client.DeliveryMethod = SmtpDeliveryMethod.Network; // Обработка сообщения через Smtp сервер
client.UseDefaultCredentials = false; // Это просто флаг, указывающий SMTPClient использовать учетные данные, предоставленные для свойства Credentials.
client.Timeout = time; // Ожидание перед отправкой Client.Send
client.Credentials = new NetworkCredential(login, password); // Авторизация в почте
try
{
client?.Send(mess); // Отправка сообщения на почту
return true;
}
catch (Exception sendex)
{
File.WriteAllText("Error_SendMessage.txt", sendex.Message);
return false;
}
}
}
}
catch (Exception ex)
{
File.WriteAllText("Error_MailMessage.txt", ex.Message);
return false;
}
}
/// <summary>
/// Метод для проверки удалённого сертификата
/// </summary>
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) =>
error == SslPolicyErrors.None ? true : false;
}
}
C#:
namespace SmtpMessage
{
using System;
internal static class Program
{
public static void Main()
{
string Email_From = "ВашЛогин@mail.ru", Email_To = "КомуОтправлять@mail.ru";
if (EmailChecker.CheckValidAddress(Email_From) || EmailChecker.CheckValidAddress(Email_To)) // Если почты корректны продолжаем
{
EmailSender.Inizialize(Email_From, "Fake", "Пароль от почты", Email_To, "Hello", "mail.ru", 587, 7000);
}
Console.ReadKey();
}
}
}
Если используете просто отправку сообщением то время ожидания ставьте от 7000
Если же используете с добавлением файлов то время ожидания ставьте от 12000
В противном случае получите ошибку что "время ожидания истекло".