Отправка электронной почты с использованием C#

Мне нужно отправить электронное письмо через приложение C#.

У меня был опыт работы с VB 6, и у меня было много неудач с элементом управления MAPI. Во-первых, MAPI не поддерживал электронные письма в формате HTML, а во-вторых, все электронные письма отправлялись в мой почтовый ящик по умолчанию. Так что мне все еще нужно было нажать на «Отправить».

Если бы мне нужно было отправлять массовые электронные письма в формате html (100–200), что было бы наилучшим способом сделать это на C#?

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
53
0
137 095
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

В .NET framework есть несколько встроенных классов, которые позволяют отправлять электронную почту через ваше приложение.

Вам следует заглянуть в пространство имен System.Net.Mail, где вы найдете классы MailMessage и SmtpClient. Вы можете установить BodyFormat класса MailMessage на MailFormat.Html.

Также может быть полезно использовать свойство AlternateViews класса MailMessage, чтобы вы могли предоставить текстовую версию своей почты, чтобы ее могли читать клиенты, не поддерживающие HTML.

http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx

:) как определяется порядок ответов? Некоторое время назад ответ splattne был третьим, теперь он первый ... Думаю, мне стоит прочитать FAQ;) (впервые здесь)

Frederik Gheysels 16.01.2009 12:08

Сначала принятый ответ, ниже все остальные, ранжированные по голосам

edosoft 16.01.2009 13:29
Ответ принят как подходящий

Вы можете использовать класс System.Net.Mail.MailMessage платформы .NET.

Вы можете найти Документация MSDN здесь.

Вот простой пример (фрагмент кода):

using System.Net;
using System.Net.Mail;
using System.Net.Mime;

...
try
{

   SmtpClient mySmtpClient = new SmtpClient("my.smtp.exampleserver.net");

    // set smtp-client with basicAuthentication
    mySmtpClient.UseDefaultCredentials = false;
   System.Net.NetworkCredential basicAuthenticationInfo = new
      System.Net.NetworkCredential("username", "password");
   mySmtpClient.Credentials = basicAuthenticationInfo;

   // add from,to mailaddresses
   MailAddress from = new MailAddress("[email protected]", "TestFromName");
   MailAddress to = new MailAddress("[email protected]", "TestToName");
   MailMessage myMail = new System.Net.Mail.MailMessage(from, to);

   // add ReplyTo
   MailAddress replyTo = new MailAddress("[email protected]");
   myMail.ReplyToList.Add(replyTo);

   // set subject and encoding
   myMail.Subject = "Test message";
   myMail.SubjectEncoding = System.Text.Encoding.UTF8;

   // set body-message and encoding
   myMail.Body = "<b>Test Mail</b><br>using <b>HTML</b>.";
   myMail.BodyEncoding = System.Text.Encoding.UTF8;
   // text or html
   myMail.IsBodyHtml = true;

   mySmtpClient.Send(myMail);
}

catch (SmtpException ex)
{
  throw new ApplicationException
    ("SmtpException has occured: " + ex.Message);
}
catch (Exception ex)
{
   throw ex;
}

Какие есть альтернативы встраиванию паролей непосредственно в код?

Gabe Sumner 16.06.2009 03:58

Класс NetworkCredential перегружен. Если вы предоставите пустой конструктор, он создаст экземпляр с текущим пользователем. В качестве альтернативы вы также можете зашифровать имя пользователя и пароль и сохранить их извне. Это также зависит от того, как вы настроили свой почтовый сервер. Вы можете настроить SMTP-сервер на локальном хосте и разрешить ему быть ретранслятором для адреса обратной связи, чтобы вы могли отправлять электронную почту без учетных данных. Мы делаем последнее. Он легкий, простой и не требует хранения паролей (поскольку любой может ретранслировать с адреса обратной связи, то есть IIS тоже может).

Joseph Ferris 06.11.2009 15:13

Вы также можете настроить все это с помощью <system.net><mailSettings> в вашем файле конфигурации. Я использую это все время для отправки почты в каталог во время разработки, а затем переключаю его на отправку по-настоящему, когда готов к запуску.

dotjoe 06.05.2010 23:56

Атрибут replyTo устарел, теперь вам нужно использовать myMail.ReplyToList.Add(replyTo);, который позволяет использовать несколько адресов для ответа. Вы также можете извлечь атрибуты из файла конфигурации с помощью ConfigurationManager.appSettings["replyTo"], если они настроены следующим образом: <configuration> <appSettings> <add key = "replyTo" value = "[email protected]"/> </appSettings> </configuration>

CSS 04.09.2015 21:41

Используйте пространство имен System.Net.Mail. Вот ссылка на страницу MSDN

Вы можете отправлять электронные письма с помощью класса SmtpClient.

Я перефразировал образец кода, поэтому подробности можно найти в MSDN.

MailMessage message = new MailMessage(
   "[email protected]",
   "[email protected]",
   "Subject goes here",
   "Body goes here");

SmtpClient client = new SmtpClient(server);
client.Send(message);

Лучший способ отправить много писем - это поместить что-то подобное в forloop и отправить!

Не забудьте перед отправкой "message.IsBodyHtml = true".

GeekyMonkey 16.01.2009 12:02

Код:

using System.Net.Mail

new SmtpClient("smtp.server.com", 25).send("[email protected]", 
                                           "[email protected]", 
                                           "subject", 
                                           "body");

Массовые рассылки:

SMTP-серверы обычно имеют ограничение на количество подключений, которые могут обрабатываться одновременно, если вы попытаетесь отправить сотни электронных писем, ваше приложение может перестать отвечать на запросы.

Решения:

  • Если вы создаете WinForm, используйте BackgroundWorker для обработки очереди.
  • Если вы используете SMTP-сервер IIS или SMTP-сервер с папкой для исходящих сообщений, вы можете использовать SmtpClient (). PickupDirectoryLocation = "c: / smtp / outboxFolder"; Это сохранит отзывчивость вашей системы.
  • Если вы не используете локальный SMTP-сервер, вы можете создать системную службу для использования Filewatcher для мониторинга форлдера, который затем будет обрабатывать любые электронные письма, которые вы туда попадаете.

Для моих простых целей ваш ответ сработал. Две строчки кода вместо 20!

MrVimes 09.04.2014 23:56

Я настоятельно рекомендую библиотеку aspNetEmail: http://www.aspnetemail.com/

System.Net.Mail доставит вас куда-нибудь, если ваши потребности только базовые, но если у вас возникнут проблемы, проверьте aspNetEmail. Это сэкономило мне кучу времени, и я знаю других разработчиков, которые тоже им доверяют!

Это коммерческий продукт, на который вам потребуется лицензия.

Sjoerd Linders 26.09.2017 10:38

Лучший способ рассылки массовых писем для более быстрого способа - использовать потоки. Я написал это консольное приложение для рассылки массовых писем. Я разделил идентификатор массовой рассылки на два пакета, создав два пула потоков.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net.Mail;

namespace ConsoleApplication1
{
    public class SendMail 
    {
        string[] NameArray = new string[10] { "Recipient 1", 
                                              "Recipient 2",
                                              "Recipient 3",
                                              "Recipient 4", 
                                              "Recipient 5", 
                                              "Recipient 6", 
                                              "Recipient 7", 
                                              "Recipient 8",
                                              "Recipient 9",
                                              "Recipient 10"
                                            };        

        public SendMail(int i, ManualResetEvent doneEvent)
        {
            Console.WriteLine("Started sending mail process for {0} - ", NameArray[i].ToString() + " at " + System.DateTime.Now.ToString());
            Console.WriteLine("");
            SmtpClient mailClient = new SmtpClient();
            mailClient.Host = Your host name;
            mailClient.UseDefaultCredentials = true;
            mailClient.Port = Your mail server port number; // try with default port no.25

            MailMessage mailMessage = new MailMessage(FromAddress,ToAddress);//replace the address value
            mailMessage.Subject = "Testing Bulk mail application";
            mailMessage.Body = NameArray[i].ToString();
            mailMessage.IsBodyHtml = true;
            mailClient.Send(mailMessage);
            Console.WriteLine("Mail Sent succesfully for {0} - ",NameArray[i].ToString() + " at " + System.DateTime.Now.ToString());
            Console.WriteLine("");

            _doneEvent = doneEvent;
        }

        public void ThreadPoolCallback(Object threadContext)
        {
            int threadIndex = (int)threadContext;
            Console.WriteLine("Thread process completed for {0} ...",threadIndex.ToString() + "at" +  System.DateTime.Now.ToString());
            _doneEvent.Set();
        }      

        private ManualResetEvent _doneEvent;
    }


    public class Program
    {
        static int TotalMailCount, Mailcount, AddCount, Counter, i, AssignI;  
        static void Main(string[] args)
        {
            TotalMailCount = 10;
            Mailcount = TotalMailCount / 2;
            AddCount = Mailcount;
            InitiateThreads();                     

            Thread.Sleep(100000);
        }

       static void InitiateThreads()
       {
            //One event is used for sending mails for each person email id as batch
           ManualResetEvent[] doneEvents = new ManualResetEvent[Mailcount];

            // Configure and launch threads using ThreadPool:
            Console.WriteLine("Launching thread Pool tasks...");

            for (i = AssignI; i < Mailcount; i++)            
            {
                doneEvents[i] = new ManualResetEvent(false);
                SendMail SRM_mail = new SendMail(i, doneEvents[i]);
                ThreadPool.QueueUserWorkItem(SRM_mail.ThreadPoolCallback, i);
            }

            Thread.Sleep(10000);

            // Wait for all threads in pool to calculation...
            //try
            //{
            // //   WaitHandle.WaitAll(doneEvents);
            //}
            //catch(Exception e)
            //{
            //    Console.WriteLine(e.ToString());   
            //}

            Console.WriteLine("All mails are sent in this thread pool.");
            Counter = Counter+1;
            Console.WriteLine("Please wait while we check for the next thread pool queue");
            Thread.Sleep(5000);
            CheckBatchMailProcess();            
        }

        static  void CheckBatchMailProcess()
        {

            if (Counter < 2)
            {
                Mailcount = Mailcount + AddCount;
                AssignI = Mailcount - AddCount;
                Console.WriteLine("Starting the Next thread Pool");

                Thread.Sleep(5000);
                InitiateThreads();
            }

            else
            {
                Console.WriteLine("No thread pools to start - exiting the batch mail application");
                Thread.Sleep(1000);
                Environment.Exit(0);
            }
        }
    }   
}

Я определил 10 получателей в списке массивов для образца. Он создаст два пакета писем для создания двух пулов потоков для отправки писем. Вы также можете выбрать детали из своей базы данных.

Вы можете использовать этот код, скопировав и вставив его в консольное приложение (заменив файл program.cs). После этого приложение будет готово к использованию.

Я надеюсь, это поможет вам :).

+1 Искал часами. Ваш самый лучший и ясный.

Ashraf Fayad 24.09.2013 21:39

Вы можете отправлять электронную почту, используя SMTP или CDO

используя SMTP:

mail.From = new MailAddress("[email protected]");
mail.To.Add("to_address");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";

SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;

используя CDO

CDO.Message oMsg = new CDO.Message();
CDO.IConfiguration iConfg;
iConfg = oMsg.Configuration;
ADODB.Fields oFields;
oFields = iConfg.Fields;
ADODB.Field oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"];
oFields.Update();
oMsg.Subject = "Test CDO";
oMsg.From = "from_address";
oMsg.To = "to_address";
oMsg.TextBody = "CDO Mail test";
oMsg.Send();

Источник: Электронная почта C# SMTP

Источник: Электронная почта C# CDO

Взгляните на библиотеку FluentEmail. Я писал об этом в блоге здесь

У вас есть хороший и понятный API для ваших нужд:

Email.FromDefault()
 .To("[email protected]")
 .Subject("New order has arrived!")
 .Body("The order details are…")  
 .Send();

Сделаем что-нибудь как полноценное решение :). Может, это тоже поможет. Это решение для отправки одного содержимого электронной почты и одного прикрепленного файла (или без приложения) на множество адресов электронной почты. Конечно, можно отправить только одно электронное письмо. Результатом является объект списка с данными, что в порядке, а что нет.

namespace SmtpSendingEmialMessage
{ 
    public class EmailSetupData
    {
        public string EmailFrom { get; set; }
        public string EmailUserName { get; set; }
        public string EmailPassword { get; set; }
        public string EmailSmtpServerName { get; set; }
        public int EmailSmtpPortNumber { get; set; }
        public Boolean SSLActive { get; set; } = false;
    }

    public class SendingResultData
    {
        public string SendingEmailAddress { get; set; }
        public string SendingEmailSubject { get; set; }
        public DateTime SendingDateTime { get; set; }
        public Boolean SendingEmailSuccess { get; set; }
        public string SendingEmailMessage { get; set; }
    }
    public class OneRecData
    {
        public string RecEmailAddress { get; set; } = "";
        public string RecEmailSubject { get; set; } = "";
    }


    public class SendingProcess
    {
        public string EmailCommonSubjectOptional { get; set; } = "";
        private EmailSetupData EmailSetupParam { get; set; }
        private List<OneRecData> RecDataList { get; set; }
        private string EmailBodyContent { get; set; }
        private Boolean IsEmailBodyHtml { get; set; }
        private string EmailAttachFilePath { get; set; }

        public SendingProcess(List<OneRecData> MyRecDataList, String MyEmailTextContent, String MyEmailAttachFilePath, EmailSetupData MyEmailSetupParam, Boolean EmailBodyHtml)
        {
            RecDataList = MyRecDataList;
            EmailBodyContent = MyEmailTextContent;
            EmailAttachFilePath = MyEmailAttachFilePath;
            EmailSetupParam = MyEmailSetupParam;
            IsEmailBodyHtml = EmailBodyHtml;
        }

        public List<SendingResultData> SendAll()
        {
            List<SendingResultData> MyResList = new List<SendingResultData>();
            foreach (var js in RecDataList)
            {
                using (System.Net.Mail.MailMessage MyMes = new System.Net.Mail.MailMessage())
                {
                    DateTime SadaJe = DateTime.Now;
                    Boolean IsOK = true;
                    String MySendingResultMessage = "Sending OK";

                    String MessageSubject = EmailCommonSubjectOptional;
                    if (MessageSubject == "")
                    {
                        MessageSubject = js.RecEmailSubject;
                    }

                    try
                    {

                        System.Net.Mail.MailAddress MySenderAdd = new System.Net.Mail.MailAddress(js.RecEmailAddress);
                        MyMes.To.Add(MySenderAdd);
                        MyMes.Subject = MessageSubject;
                        MyMes.Body = EmailBodyContent;
                        MyMes.Sender = new System.Net.Mail.MailAddress(EmailSetupParam.EmailFrom);
                        MyMes.ReplyToList.Add(MySenderAdd);
                        MyMes.IsBodyHtml = IsEmailBodyHtml;

                    }
                    catch(Exception ex)
                    {
                        IsOK = false;
                        MySendingResultMessage  = "Sender or receiver Email address error." +  ex.Message;
                    }

                    if (IsOK == true)
                    {
                        try
                        {
                            if (EmailAttachFilePath != null)
                            {
                                if (EmailAttachFilePath.Length > 5)
                                {
                                    MyMes.Attachments.Add(new System.Net.Mail.Attachment(EmailAttachFilePath));
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            IsOK = false;
                            MySendingResultMessage  = "Emial attach error. " +  ex.Message;
                        }

                        if (IsOK == true)
                        {
                            using (System.Net.Mail.SmtpClient MyCl = new System.Net.Mail.SmtpClient())
                            {
                                MyCl.EnableSsl = EmailSetupParam.SSLActive;
                                MyCl.Host = EmailSetupParam.EmailSmtpServerName;
                                MyCl.Port = EmailSetupParam.EmailSmtpPortNumber;
                                try
                                {
                                    MyCl.Credentials = new System.Net.NetworkCredential(EmailSetupParam.EmailUserName, EmailSetupParam.EmailPassword);
                                }
                                catch (Exception ex)
                                {
                                    IsOK = false;
                                    MySendingResultMessage = "Emial credential error. " + ex.Message;
                                }

                                if (IsOK == true)
                                {
                                    try
                                    {
                                        MyCl.Send(MyMes);
                                    }
                                    catch (Exception ex)
                                    {
                                        IsOK = false;
                                        MySendingResultMessage = "Emial sending error. " + ex.Message;
                                    }
                                }
                            }
                        }
                    }

                    MyResList.Add(new SendingResultData
                    {
                            SendingDateTime = SadaJe,
                            SendingEmailAddress = js.RecEmailAddress,
                            SendingEmailMessage = MySendingResultMessage,
                            SendingEmailSubject = js.RecEmailSubject,
                            SendingEmailSuccess = IsOK
                    });
                }

            }
            return MyResList;
        }
    }

}

Вы можете использовать Mailkit. MailKit - это кроссплатформенная библиотека почтового клиента .NET с открытым исходным кодом, основанная на MimeKit и оптимизированная для мобильных устройств.

У него больше и улучшенных функций лучше, чем у System.Net.Mail

  • Полностью отменяемый Pop3Client с поддержкой STLS, UIDL, APOP, PIPELINING, UTF8 и LANG. Сортировка на стороне клиента и многопоточность сообщения (Ordinal Subject и Jamie Zawinski алгоритмы поддерживаются).
  • Асинхронные версии всех методов, попадающих в сеть.
  • Поддержка подписей S / MIME, OpenPGP и DKIM через MimeKit.
  • Поддержка Microsoft TNEF через MimeKit.

Посмотрите этот пример, вы можете отправить письмо

            MimeMessage mailMessage = new MimeMessage();
            mailMessage.From.Add(new MailboxAddress(senderName, [email protected]));
            mailMessage.Sender = new MailboxAddress(senderName, [email protected]);
            mailMessage.To.Add(new MailboxAddress(emailid, emailid));
            mailMessage.Subject = subject;
            mailMessage.ReplyTo.Add(new MailboxAddress(replyToAddress));
            mailMessage.Subject = subject;
            var builder = new BodyBuilder();
            builder.TextBody = "Hello There";            
            try
            {
                using (var smtpClient = new SmtpClient())
                {
                    smtpClient.Connect("HostName", "Port", MailKit.Security.SecureSocketOptions.None);
                    smtpClient.Authenticate("[email protected]", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }

Вы можете скачать с здесь.

Ниже прилагаемое решение работает на локальной машине и на сервере.

     public static string SendMail(string bodyContent)
    {
        string sendMail = "";
        try
        {

            string fromEmail = "[email protected]";
            MailMessage mailMessage = new MailMessage(fromEmail, "[email protected]", "Subject", body);
            mailMessage.IsBodyHtml = true;
            SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 587);
            smtpClient.EnableSsl = true;
            smtpClient.UseDefaultCredentials = false;
            smtpClient.Credentials = new NetworkCredential(fromEmail, frompassword);
            smtpClient.Send(mailMessage);
        }
        catch (Exception ex)
        {
            sendMail = ex.Message.ToString();
            Console.WriteLine(ex.ToString());
        }
        return sendMail;
    }

Другие вопросы по теме