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

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

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

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

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

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

Здесь вы можете найти документацию MSDN .

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

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 = "Test Mail
using HTML."; 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; }

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

 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 получателей в списке массивов для образца. Он создаст две партии писем для создания двух пулов streamов для отправки писем. Вы также можете получить данные из своей базы данных.

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

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

Код:

 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 для отслеживания фолдера, а затем обработать все электронные письма, которые вы туда попадете.

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

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

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

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

Вы можете отправлять электронную почту с помощью 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; 

источник: C # SMTP Email

 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 # CDO Email

мужественный

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

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

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

Вы можете отправлять электронные письма с использованием classа 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 и отправить!

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

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

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

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

 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 RecDataList { get; set; } private string EmailBodyContent { get; set; } private Boolean IsEmailBodyHtml { get; set; } private string EmailAttachFilePath { get; set; } public SendingProcess(List MyRecDataList, String MyEmailTextContent, String MyEmailAttachFilePath, EmailSetupData MyEmailSetupParam, Boolean EmailBodyHtml) { RecDataList = MyRecDataList; EmailBodyContent = MyEmailTextContent; EmailAttachFilePath = MyEmailAttachFilePath; EmailSetupParam = MyEmailSetupParam; IsEmailBodyHtml = EmailBodyHtml; } public List SendAll() { List MyResList = new List(); 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 с открытым исходным кодом .NET, основанная на MimeKit и оптимизированная для мобильных устройств.

У него больше возможностей и улучшений, чем System.Net.Mail

  • Полностью отменяемый Pop3Client с поддержкой STLS, UIDL, APOP, PIPELINING, UTF8 и LANG. Сортировка и streamи сообщений на стороне клиента (поддерживаются алгоритмы Threading Object и 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()); } 
  • Автоматически шифровать и расшифровывать электронные письма с помощью gnupg (gpgrelay для unix)
  • Отправить встроенное изображение по электронной почте
  • Как сохранить объект MailMessage на диск как файл * .eml или * .msg
  • Не удалось отправить электронное письмо нескольким адресам / получателям с помощью C #
  • Regexp распознавание адреса электронной почты трудно?
  • Как отправить электронное письмо с прикрепленным файлом в Android
  • Сначала необходимо выпустить команду STARTTLS. Отправка электронной почты с помощью Java и Google Apps
  • Чтение электронной почты MS Exchange в C #
  • Как отправить электронное письмо по умолчанию?
  • Могу ли я проверить, существует ли почтовый адрес с использованием .net?
  • Что такое сообщение «У вас есть новое письмо» в Linux / UNIX?
  • Interesting Posts

    Как распечатать уникальные элементы в массиве Perl?

    Как удалить файлы, превышающие определенную дату на linux

    Место хранения «исчезло» на внутреннем SSD MacBook Air

    Область видимости переменной C #: «x» не может быть объявлена ​​в этой области, потому что она придавала бы значение «x»,

    как захватить несколько параметров с помощью @RequestParam с использованием Spring mvc?

    Переход на вкладки вправо или влево от текущей вкладки в Notepad ++

    Может ли главная функция вызывать себя на C ++?

    Как обмениваться компьютером через беспроводной маршрутизатор в Windows?

    Как я могу использовать «Windows Live Call Button» на наушниках для ответа на звонок со Skype?

    Апострофы и двойные кавычки не отображаются до тех пор, пока я не наберу следующую букву

    Как прокрутить страницу до определенного места на странице с помощью jquery?

    Запуск программ с прикрепленных значков на панели задач

    NOLOCK с Linq to SQL

    Создание случайного двойника в диапазоне

    Как отправить Ctrl + Alt + End на удаленный рабочий стол?

    Давайте будем гением компьютера.