我需要通过我的C#app发送电子邮件.
我来自VB 6背景,并且在MAPI控件方面有很多不好的经历.首先,MAPI不支持HTML电子邮件,其次,所有电子邮件都发送到我的默认邮件发件箱.所以我仍然需要点击发送接收.
如果我需要发送批量html身体电子邮件(100 - 200),那么在C#中执行此操作的最佳方式是什么?
提前致谢.
您可以使用.NET框架的System.Net.Mail.MailMessage类.
您可以在此处找到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("test@example.com", "TestFromName"); MailAddress to = new MailAddress("test2@example.com", "TestToName"); MailMessage myMail = new System.Net.Mail.MailMessage(from, to); // add ReplyTo MailAddress replyto = new MailAddress("reply@example.com"); 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.I已编写此控制台应用程序用于发送批量电子邮件.我已通过创建两个线程池将批量电子邮件ID分成两批.
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文件).然后应用程序就可以使用了.
我希望这可以帮助你 :).
码:
using System.Net.Mail new SmtpClient("smtp.server.com", 25).send("from@email.com", "to@email.com", "subject", "body");
群发电子邮件:
SMTP服务器通常对帽子可以同时处理的连接数量有限制,如果您尝试发送数百封电子邮件,您的应用程序可能会显示无响应.
解决方案:
如果要构建WinForm,请使用BackgroundWorker处理队列.
如果您使用的是IIS SMTP服务器或具有发件箱文件夹的SMTP服务器,则可以使用SmtpClient().PickupDirectoryLocation ="c:/ smtp/outboxFolder"; 这将使您的系统保持响应.
如果您没有使用本地SMTP服务器,那么您可以构建系统服务以使用Filewatcher监视forlder,然后处理您放入的任何电子邮件.