使用C#和.Net通過SMTP發(fā)送郵件詳解
到目前為止,發(fā)電子郵件已經(jīng)不是什么新聞了,.Net中包含郵件客戶端并不足為奇。一個老的編程事實(shí)任然有效:所有程序?qū)U(kuò)大到包括最終發(fā)送(接收)的電子郵件。因此,如何增加電子郵件到您的程序?此帖探討我們?nèi)绾文軌蚴褂肧ystem.Mail.SmtpClient發(fā)送格式化電子郵件。有許多可供選擇的選項(xiàng),我們將探討其中的大多數(shù)。
十五年以后事情變得相當(dāng)容易.發(fā)送電子郵件最直接的就是調(diào)用一些基本的庫函數(shù)和.Net的一些固定的實(shí)現(xiàn)。
快速發(fā)送電子郵件
如果您迫不及待的話,可以使用下面帶有4字符串參數(shù)的
構(gòu)造函數(shù)創(chuàng)建一個簡單的郵件。
// 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");
在上面的例子中的電子郵件使用系統(tǒng)的NET框架默認(rèn)設(shè)置為發(fā)現(xiàn)的發(fā)送的。如果你對什么自己系統(tǒng)作為默認(rèn)的SMTP服務(wù)器感到好奇,您可以查詢SmtpClient.Host
Console.WriteLine("Default SMTP Server: {0}",client.Host);
請注意,有可能.NET libraries是無法制訂SMTP主機(jī),當(dāng)您嘗試發(fā)送電子郵件會失敗并出現(xiàn)System.InvalidOperationException ( SMTP主機(jī)未指定)的異常。
發(fā)送一封合適的郵件
一個基本的電子郵箱是一個發(fā)件人,一個或多個收件人的郵件正文和一個或多個附件組成的。當(dāng)然,電子郵件可能是一種過時(shí)的俄羅斯字體的編碼。
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);
名字中不包括任何特殊的字符,所以指定默認(rèn)的UTF - 8編碼。
發(fā)送一封只有單一的發(fā)送和接收者的電子郵件
如果您的電子郵件只包含一個單一的發(fā)送者和一個接收者,MailMessage ( MailAddress From, MailAddress To)構(gòu)造函數(shù)提供了所有您所需要的。它創(chuàng)建一個新的電子郵件的結(jié)構(gòu),分配發(fā)送者和接收者的構(gòu)造方法。
MailAddress toUser = new MailAddress("myfriend@yahoo.com");
MailAddress fromUser = new MailAddress("aishijie36@hotmail.com");
MailMessage msg = new MailMessage(fromUser,toUser);
增加更多相同的電子郵件的接收者
一個單一的收件人可能是不夠的。不要擔(dān)心,您可以添加許多人到你的電子郵件,只要你想。
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") );
設(shè)置電子郵件主題和內(nèi)容
設(shè)置電子郵件的主題,并不難,只需通過Msg.Subject設(shè)置它 。如果你可以使用如Unicode的其他方式編碼。
msg.Subject = "我的心太亂"
msg.SubjectEncoding = Encoding.GetEncoding("big5");
以非常類似的方式來設(shè)置郵件正文
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類。您可以通過調(diào)用" 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);
第一個參數(shù)傳遞給構(gòu)造函數(shù)是包含附件的路徑。如果沒有完整的路徑,給出了當(dāng)前的工作目錄。該文件類型的在System.Net.Mime中定義 -可用選項(xiàng)有:
MediaTypeNamesApplicationOctet
PDF
RTF
Soap
Zip
ImageGif
JPEG
Tiff
TextHTML
Plain
RichText
XML
如果該類型的文件未指定使用MediaTypesNames.Application.Octet ,怎顯示"數(shù)據(jù)沒有解釋。 "
添加自定義電子郵件標(biāo)題到您的電子郵箱
Msg.Header屬性允許查詢和添加.NET框架所設(shè)定的電子郵件標(biāo)題。全新的電子郵件將只包含一個標(biāo)題: "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發(fā)送電子郵件
通過the SmtpClient class發(fā)送電子郵件的艱巨工作實(shí)際只需要下面兩行代碼:
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
如果您沒有指定任何參數(shù),SmtpClient默認(rèn)構(gòu)造函數(shù)將查找使用.NET環(huán)境。
SMTP服務(wù)器
您可以通過第二構(gòu)造方法指定一個特定的服務(wù)器和可選端口
SmtpClient client = new SmtpClient("mail.dijksterhuis.org",3000);
上述SmtpClient.Send是阻塞調(diào)用-當(dāng)電子郵件傳送時(shí)您的應(yīng)用程序應(yīng)停止。當(dāng)然也有一個
異步調(diào)用: SmtpClient.SendAsync 。
使用SmtpClient.SendAsync是多做一點(diǎn)工作。如何做到這一點(diǎn)請看以下示例:
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:02:31 編輯過