• XSS.stack #1 – первый литературный журнал от юзеров форума

[C#] Отправка почты через Smtp сервер

r3xq1

(L3) cache
Пользователь
Регистрация
14.01.2020
Сообщения
233
Реакции
146
Класс для отправки сообщения на почту Mail.ru - Gmail и.т.д сервера.

Для начала создадим класс 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;
        }
    }
}
И создадим класс EmailSender.cs - Отвечает за отправку
Весь код прокомментирован!
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
В противном случае получите ошибку что "время ожидания истекло".
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх