Invio di e-mail tramite C #

Ho bisogno di inviare e-mail tramite la mia app C #.

Vengo da uno sfondo VB 6 e ho avuto un sacco di brutte esperienze con il controllo MAPI. Innanzitutto, MAPI non supportava le e-mail HTML e, in secondo luogo, tutte le e-mail sono state inviate alla mia posta in uscita predefinita. Quindi ho ancora bisogno di cliccare su invia ricevere.

Se avessi bisogno di inviare email bulk body html (100 – 200), quale sarebbe il modo migliore per farlo in C #?

Grazie in anticipo.

È ansible utilizzare la class System.Net.Mail.MailMessage del framework .NET.

È ansible trovare la documentazione MSDN qui .

Ecco un semplice esempio (snippet di codice):

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; }

Il modo migliore per inviare email collettive per un modo più rapido è utilizzare thread. Ho scritto questa applicazione console per l’invio di email collettive. Ho separato l’ID email collettivo in due gruppi creando due pool di thread.

 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); } } } } 

Ho definito 10 ricevitori nell'elenco di array per un campione. Creerà due gruppi di e-mail per creare due pool di thread per l'invio di mail. Puoi anche selezionare i dettagli dal tuo database.

È ansible utilizzare questo codice copiandolo e incollandolo in un'applicazione console. (Sostituire il file program.cs). Quindi l'applicazione è pronta per l'uso.

Spero che questo ti aiuta :).

Codice:

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

Email di massa:

I server SMTP di solito hanno un limite sul numero di connessioni che possono essere gestite contemporaneamente, se si tenta di inviare centinaia di e-mail l’applicazione potrebbe non rispondere.

soluzioni:

  • Se stai costruendo un WinForm, usa un BackgroundWorker per elaborare la coda.
  • Se si utilizza il server SMTP IIS o un server SMTP con una cartella Posta in uscita, è ansible utilizzare SmtpClient (). PickupDirectoryLocation = “c: / smtp / outboxFolder”; Ciò manterrà il tuo sistema reattivo.
  • Se non si utilizza un server SMTP locale di quanto si potrebbe creare un servizio di sistema per utilizzare Filewatcher per monitorare un forlder di quanto non sarà poi elaborare tutte le e-mail che si inseriscono lì.

Il framework .NET ha alcune classi integrate che ti permettono di inviare e-mail tramite la tua app.

Dovresti dare un’occhiata nello spazio dei nomi System.Net.Mail, dove troverai le classi MailMessage e SmtpClient. È ansible impostare BodyFormat della class MailMessage su MailFormat.Html.

Potrebbe anche essere utile se si fa uso della proprietà AlternateViews della class MailMessage, in modo da poter fornire una versione di testo in chiaro del proprio messaggio, in modo che possa essere letta dai client che non supportano l’HTML.

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

È ansible inviare e-mail utilizzando SMTP o CDO

usando 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; 

fonte: Email SMTP C #

 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(); 

Fonte: C # CDO Email

Virile

Consiglio vivamente la libreria aspNetEmail: http://www.aspnetemail.com/

System.Net.Mail ti porterà da qualche parte se le tue esigenze sono solo di base, ma se incontri dei problemi, controlla aspNetEmail. Mi ha risparmiato un sacco di tempo, e conosco altri devotoeprs che anche loro giurano!

Usa lo spazio dei nomi System.Net.Mail. Ecco un link alla pagina MSDN

È ansible inviare e-mail utilizzando la class SmtpClient.

Ho parafrasato l’esempio del codice, quindi controlla MSDN per i dettagli.

 MailMessage message = new MailMessage( "[email protected]", "[email protected]", "Subject goes here", "Body goes here"); SmtpClient client = new SmtpClient(server); client.Send(message); 

Il modo migliore per inviare molte e-mail sarebbe quello di mettere qualcosa di simile in forloop e inviare via!

Dai un’occhiata alla libreria di FluentEmail. Ne ho parlato a macchina qui

Hai una bella e fluente API per le tue esigenze:

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

Facciamo qualcosa come una soluzione completa :). Forse può essere d’aiuto. È una soluzione per inviare un contenuto di posta elettronica e un file allegato (o senza allegato) a molti indirizzi email. Ovviamente anche l’invio di una sola email è ansible. Il risultato è Elenco object con dati che va bene e cosa no.

 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; } } } 

È ansible utilizzare Mailkit.MailKit è una libreria di client di posta elettronica .NET multipiattaforma Open Source basata su MimeKit e ottimizzata per i dispositivi mobili.

Ha più funzioni avanzate e migliori di System.Net.Mail

  • Pop3Client completamente cancellabile con supporto per STLS, UIDL, APOP, PIPELINING, UTF8 e LANG. Ordinamento e threading dei messaggi sul lato client (sono supportati gli algoritmi di thread Ordinal e Jamie Zawinski).
  • Versioni asincrone di tutti i metodi che colpiscono la rete.
  • S / MIME, OpenPGP e supporto della firma DKIM tramite MimeKit.
  • Supporto Microsoft TNEF tramite MimeKit.

    Puoi scaricare da qui .

Vedi questo esempio è ansible inviare posta

  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()); }