使用C#发送电子邮件

我需要通过我的C#应用​​程序发送电子邮件。

我来自VB 6的背景,并有很多与MAPI控制不好的经验。 首先,MAPI不支持HTML电子邮件,其次,所有电子邮件都发送到我的默认邮件发件箱。 所以我还是需要点击发送接收。

如果我需要发送大量的HTML格式电子邮件(100 – 200),那么在C#中执行此操作的最佳方法是什么?

提前致谢。

您可以使用.NET框架的System.Net.Mail.MailMessage类。

你可以在这里findMSDN文档 。

这是一个简单的例子(代码片段):

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

以更快的速度发送批量电子邮件的最好方法是使用线程。我已经编写了这个控制台应用程序来发送批量电子邮件。我通过创build两个线程池将批量电子邮件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个接收者样本。它将创build两批电子邮件来创build两个线程池来发送邮件。您也可以从数据库中select详细信息。

您可以通过将其复制并粘贴到控制台应用程序中来使用此代码(replaceprogram.cs文件),然后即可使用该应用程序。

我希望这可以帮助你 :)。

码:

 using System.Net.Mail new SmtpClient("smtp.server.com", 25).send("from@email.com", "to@email.com", "subject", "body"); 

群发电子邮件:

SMTP服务器通常可以一次处理的连接数量有限制,如果您尝试发送数百封电子邮件,则应用程序可能显示无响应。

解决scheme:

  • 如果您正在构buildWinForm,则使用BackgroundWorker来处理队列。
  • 如果您使用IIS SMTP服务器或具有发件箱文件夹的SMTP服务器,则可以使用SmtpClient()。PickupDirectoryLocation =“c:/ smtp / outboxFolder”; 这将保持您的系统响应。
  • 如果您没有使用本地SMTP服务器,则可以使用Filewatcher监视forlder而不是使用本地SMTP服务器,然后再处理放在那里的任何电子邮件。

.NET框架有一些内置的类,允许你通过你的应用程序发送电子邮件。

你应该看看System.Net.Mail命名空间,你会发现MailMessage和SmtpClient类。 您可以将MailMessage类的BodyFormat设置为MailFormat.Html。

如果您使用MailMessage类的AlternateViews属性,也可能会有所帮助,以便您可以提供纯文本版本的邮件,以便可以由不支持HTML的客户端读取。

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

您可以使用SMTP或CDO发送电子邮件

使用SMTP:

 mail.From = new MailAddress("your_email_address@gmail.com"); 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电子邮件

 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电子邮件

男子气

我可以强烈推荐aspNetEmail库: http : //www.aspnetemail.com/

如果你的需求只是基本的, System.Net.Mail会帮你find一个地方,但如果遇到麻烦,请检查一下aspNetEmail。 它救了我一大堆时间,我也知道其他发誓的人也发誓!

使用命名空间System.Net.Mail。 这里是MSDN页面的链接

您可以使用SmtpClient类发送电子邮件。

我解释了代码示例,所以请详细了解MSDN。

 MailMessage message = new MailMessage( "fromemail@contoso.com", "toemail@contoso.com", "Subject goes here", "Body goes here"); SmtpClient client = new SmtpClient(server); client.Send(message); 

发送很多电子邮件的最好方法就是把这样的东西放在forloop上,然后发送出去!

看看FluentEmail库。 我在这里博客了

你有一个很好的和stream利的api为您的需求:

 Email.FromDefault() .To("you@domain.com") .Subject("New order has arrived!") .Body("The order details are…") .Send();