到目前为止,发电子邮件已经不是什么新闻了,.Net中包含邮件客户端并不足为奇。一个老的编程事实任然有效:所有程序将扩大到包括最终发送(接收)的电子邮件。因此,如何增加电子邮件到您的程序?此帖探讨我们如何能够使用System.Mail.SmtpClient发送格式化电子邮件。有许多可供选择的选项,我们将探讨其中的大多数。
   十五年以后事情变得相当容易.发送电子邮件最直接的就是调用一些基本的库函数和.Net的一些固定的实现。
快速发送电子邮件
如果您迫不及待的话,可以使用下面带有4字符串参数的
构造函数创建一个简单的邮件。
// public client.Send(string from,string to,string subject,string body)
using System.Net.Mail;
SmtpClient client = new SmtpClient();
client.Send("martijn@seamana.cn","test@seamana.cn","Testing!","If this break again,.. I won''t know what to do");
在上面的例子中的电子邮件使用系统的NET框架默认设置为发现的发送的。如果你对什么自己系统作为默认的SMTP服务器感到好奇,您可以查询SmtpClient.Host
Console.WriteLine("Default SMTP Server: {0}",client.Host);
请注意,有可能.NET libraries是无法制订SMTP主机,当您尝试发送电子邮件会失败并出现System.InvalidOperationException ( SMTP主机未指定)的异常。
发送一封合适的邮件
一个基本的电子邮箱是一个发件人,一个或多个收件人的邮件正文和一个或多个附件组成的。当然,电子邮件可能是一种过时的俄罗斯字体的编码。
MailAddress toUser = new MailAddress("martijn@seamana.cn");
MailAddress toUser2 = new MailAddress("martijn@seamana.cn","Martijn Dijksterhuis");
MailAddress toUser3 = new MailAddress("martijn@seamana.cn","Martijn Dijksterhuis", System.Text.Encoding.UTF8);
名字中不包括任何特殊的字符,所以指定默认的UTF - 8编码。
 
发送一封只有单一的发送和接收者的电子邮件
如果您的电子邮件只包含一个单一的发送者和一个接收者,MailMessage ( MailAddress From, MailAddress To)构造函数提供了所有您所需要的。它创建一个新的电子邮件的结构,分配发送者和接收者的构造方法。
MailAddress toUser = new MailAddress("myfriend@yahoo.com");
MailAddress fromUser = new MailAddress("aishijie36@hotmail.com");
MailMessage msg  = new MailMessage(fromUser,toUser);
 
增加更多相同的电子邮件的接收者
一个单一的收件人可能是不够的。不要担心,您可以添加许多人到你的电子邮件,只要你想。
msg.To.Add( new MailAddress("second_to@seamana.cn") );
msg.CC.Add( new MailAddress("first_cc@seamana.cn") );
 msg.CC.Add( new MailAddress("second_cc@seamana.cn") );
msg.Bcc.Add( new MailAddress("first_bcc@seamana.cn") );
 
设置电子邮件主题和内容
设置电子邮件的主题,并不难,只需通过Msg.Subject设置它 。如果你可以使用如Unicode的其他方式编码。
msg.Subject = "我的心太乱"
msg.SubjectEncoding = Encoding.GetEncoding("big5");
 
以非常类似的方式来设置邮件正文
msg.Body = "Dear Customer, " + Environment.NewLine + Environment.NewLine;
msg.Body += "Because of repeated violations of our terms and conditions we had no choice but to";
msg.Body += "terminate your account with us." + Environment.NewLine + Environment.NewLine;
msg.Body += "The Management";
msg.BodyEncoding = System.Text.Encoding.UTF8;
 
添加附件到电子邮件
电子邮件可以拥有一个以上的附件,每个附件的继承于System.Net.Mail.Attachment类。您可以通过调用" Attachments.Add ( ) "把它们添加到附件容器。
using System.Net.Mime;
Attachment firstAttachment = new Attachment("document.doc",MediaTypeNames.Application.Octet);
MailMessage msg  = new MailMessage(fromUser,toUser);
msg.Attachments.Add(firstAttachement);
 
第一个参数传递给构造函数是包含附件的路径。如果没有完整的路径,给出了当前的工作目录。该文件类型的在System.Net.Mime中定义 -可用选项有:
MediaTypeNamesApplicationOctet
  PDF
  RTF
  Soap
  Zip
 ImageGif
  JPEG
  Tiff
 TextHTML
  Plain
  RichText
  XML
如果该类型的文件未指定使用MediaTypesNames.Application.Octet ,怎显示"数据没有解释。 " 
 
添加自定义电子邮件标题到您的电子邮箱
Msg.Header属性允许查询和添加.NET框架所设定的电子邮件标题。全新的电子邮件将只包含一个标题: "Mine: 1.0 " 。
MailMessage Msg = new MailMessage(new  MailAddress("martijn@seamana.cn"),newMailAddress("martijn@seamana.cn"));
 
// Add a custom header to the e-mail
Msg.Headers.Add("X-Header","2.0");
 
// Display all the message headers.
string[] Keys = Msg.Headers.AllKeys;
foreach (string s in Keys) 
Console.WriteLine("{0}: {1}", s,Msg.Headers[s]);
 
用SmtpClient发送电子邮件
  通过the SmtpClient class发送电子邮件的艰巨工作实际只需要下面两行代码:
SmtpClient client = new SmtpClient();
client.Send(Msg);
 
SmtpFailedRecipientsException: The message could not be delivered to one or more of the recipients in To, CC, or Bcc.
SmtpException : Connection failed, authentication failed or a time-out
ArgumentNullException / ArgumentOutOfRangeException / InvalidOperationException : Something wrong with the input fields of the e-mail
 
如果您没有指定任何参数,SmtpClient默认构造函数将查找使用.NET环境。
SMTP服务器
您可以通过第二构造方法指定一个特定的服务器和可选端口
SmtpClient client = new SmtpClient("mail.dijksterhuis.org",3000); 
 
上述SmtpClient.Send是阻塞调用-当电子邮件传送时您的应用程序应停止。当然也有一个
异步调用: SmtpClient.SendAsync 。
使用SmtpClient.SendAsync是多做一点工作。如何做到这一点请看以下示例:
using System;
using System.Net.Mail;
using System.Threading;
using System.ComponentModel;
namespace SnmpMailer
{   
  class MainClass   
  {       
   static Semaphore mailSendSemaphore;        
   private static void MailSendCallback(object sender, AsyncCompletedEventArgs arg)  
   {           
      // Get our unique token for this asynchronous operation.           
     String token = (string) arg.UserState;            
      // Did the user abort the sent ?           
     if (arg.Cancelled)               
        Console.WriteLine("[{0}] Send canceled.", token);         
      // Did an error occur during the send?           
     if (arg.Error != null)                
        Console.WriteLine("[{0}] {1}", token, arg.Error.ToString());              
      else               
        Console.WriteLine("Message sent succesfully!");            
      // Release the main thread           
      mailSendSemaphore.Release();       
      }       
 
  public static void Main(string[] args)       
  {           
   mailSendSemaphore = new Semaphore(0,1);   
   // Create the mail message with to & from   
    MailMessage Msg = new MailMessage(new MailAddress("noreply@dijksterhuis.org"), 
                    new MailAddress("martijn@dijksterhuis.org"));            
    Msg.Body = "Dear Customer, " + Environment.NewLine + Environment.NewLine;   
    Msg.Body += "Because of repeated violations of our terms and conditions we had
                no choice  but to";           
    Msg.Body += "terminate your account with us." + Environment.NewLine   
               + Environment.NewLine;   
    Msg.Body += "The Management";           
    Msg.BodyEncoding = System.Text.Encoding.UTF8;   
    // Set the subject           
    Msg.Subject = "Termination of service notice"; 
    // Add our own header           
    Msg.Headers.Add("X-Deliverator","Terminator");    
    // Deliver the message in an asynchronous fashion           
    SmtpClient Deliverator = new SmtpClient("mymailserver.com");   
    // Print the default client           
    Console.WriteLine("Default SMTP Server: {0}",Deliverator.Host);  
    // Specify the call back function           
    Deliverator.SendCompleted += new SendCompletedEventHandler (MailSendCallback); 
    // For an asyncronous call we can pass a token to help us determine
    //  the message being send  
    Deliverator.SendAsync(Msg,"Msg ID 1212");   
    // Because we have little else to do, we set a semaphore and wait               
    mailSendSemaphore.WaitOne();            
    Console.WriteLine("Mail delivery finished");       
    }   
  }
}
该文章在 2017/11/8 0:00:48 编辑过