標籤:
本文主要講述基於C#網路編程的發送郵件的編程,郵件發送功能是基於郵件協議的,常見的電子郵件協議有SMTP(簡易郵件傳輸通訊協定)、POP3(郵局協議)、IMAP(Internet郵件訪問協議),文章主要參考周存傑的《C#網路編程執行個體教程》.這也是最後一篇參照該書的網路編程文章,之後的該系列文章都是基於網路實際應用的,不會再大量講述原理知識.
一.SMTP協議
SMTP協議是TCP/IP協議家族定義的機器間交換郵件的標準,它主要負責底層郵件系統怎樣將一個報文從一台機器傳輸到還有一台機器,而不關心郵件怎樣儲存及傳輸速度.它的步驟基本例如以下:
client首先建立與serverTCP串連,然後server發送220報文(服務就緒),client收到220報文後發送HELLO命令,server收到HELLO後作出響應,最後server和client能夠開始郵件通訊.
本文不準備對SMTP命令(該命令定義了郵件傳輸或使用者定義的系統功能)和SMTP應答狀態代碼進行描寫敘述,你僅僅須要知道使用SMTP發送郵件的操作通常例如以下:
1.由MAIL命令(用於將郵件發送到一個多個郵箱)開始給出寄件者標識,RCPT命令(用於確定郵件內容的接受者)給出接受者資訊.
2.用DATA命令(用於郵件內容增加緩衝區,<CRLF>.<CRLF>標識結束)列出發送郵件的內容.
3.郵件內容指示符確認操作,假設此命令被接受,接收方返回一個250 OK應答.
.NET平台上SmtpMail類實現了對SMTP協議的封裝.所以我主要通過這些類介紹怎樣SMTP郵件收發.
POP3:Post Office Protocol,眼下版本號碼為POP3,它是把郵件從電子郵箱中傳輸到本機電腦的協議.
IMAP:Internet Message Access Protocol,是POP3的一種替代協議,提供了郵件檢索和郵件處理的新功能,使用者能夠全然不必下載郵件內文就能夠看到郵件的標題摘要,從郵件client軟體就能夠對server上的郵件和檔案夾檔案夾進行操作.二.SMTP協議封裝的類(舊版)
1.
SmtpMail類
該類用於發送郵件,其命名空間為System.Web.Mail.該類經常使用屬性僅僅有一個:
public static string SmtpServer {get; set;}
擷取或設定SMTPserver名稱,如不設定將使用本地主機名稱.假設提示加入命名空間不存在,須要在項目中加入引用,加入System.Web.dll就可以.
//SMTP類經常用法//構造方法public SmtpMail();//Send()方法 發送郵件 傳回值:無public static void Send( MailMessage message //郵件);public static void Send( string from, //寄件者地址 string to, //收信人地址 string subject, //郵件主題 string messageText //郵件內容);
2.MailMessage類
其命名控制項為System.Web.Mail,該類用於設定郵件內容以及與郵件內容相關的資訊,如發送人地址、收信人地址等.
//MailMessage經常使用屬性//1.Attachments屬性 用於擷取附件的檔案清單public IList Attachments {get;}//2.Bcc屬性 用於擷取或設定暗送於地址,被暗送者的地址public string Bcc {get; set;}//3.Body屬性 用於擷取或設定郵件內容public string Body {get; set;}//4.BodyFormat屬性 用於擷取或設定郵件內容的格式 有Html Text格式public MailFormat BodyFormat {get; set;}//5.Cc屬性 用於擷取或設定抄送於地址,被抄送者的地址public string Cc {get; set;}//6.From屬性 用於擷取或設定發信人的地址public string From {get; set;}//7.Headers屬性 用於擷取郵件標題public IDictionary Headers {get;}//8.Priority屬性 用於擷取或設定郵件的優先順序,包含High Low Normalpublic MailPriority Priority {get; set;}//9.Subject屬性 用於擷取或設定郵件的主題public string Subject {get; set;}//10.To屬性 用於擷取或設定郵件的收信人地址public string To {get; set;}//構造方法 public MailMessage();
3.MailAttachment類
該類用於構造和設定郵件的附件,命名空間為System.Web.Mail.
//MailAttachment類經常使用屬性//Encoding屬性 用於設定附件的編碼public MailEncoding Encoding {get;}//Filename屬性 用於設定附件的檔案名稱public string Filename {get;}//構造方法public MailAttachment( string filename //檔案名稱);public MailAttachment( string filename, //檔案名稱 MailEncoding encoding //編碼);
三.SMTP協議封裝的類(新版)
使用舊版的SMTP可能會出現非常多錯誤,譬如“SendUsing 配置值無效”或“server未響應”等,可是它與新版的方法及屬性基本沒有變換.
C#更新的smtp命名空間為System.Net.Mail,當中SmtpClient類用於smtp發送郵件.
1.Host屬性用於設定主機名稱或IP地址
2.Port屬性用於設定SMTP事務port
3.Credentials屬性用於驗證寄件者的認證
4.DeliveryMethod屬性用於指定怎樣處理待送的電子郵件訊息
5.Send方法用於將電子郵件發送到 SMTP server以便傳遞
MailMessage類中屬性也有變化,如To屬性(郵件收信人地址屬性)變為僅僅讀屬性須要通過Add函數加入收件者郵件地址,但大體都與舊版的同樣.
Attachment類是在System.Net.Mail中新增,表示電子郵件的附件,曾經System.Web.Mail中的是MailAttachment類.以下是詳細的發送郵件的執行個體源碼及效果:
//加入命名空間using System.Net.Mail;//加入私人成員private MailMessage msg; //用於構造郵件屬性和方法private Attachment att; //用於構造郵件附件屬性和方法public Form1(){ InitializeComponent(); msg = new MailMessage(); //執行個體化}//點擊"發送郵件"按鈕private void button1_Click(object sender, EventArgs e){ try { //To郵件收信人地址屬性 僅僅讀屬性不能賦值 msg.To.Add(textBox1.Text); //From郵件寄件者地址屬性 msg.From = new MailAddress(textBox2.Text); //Subject郵件主題屬性 msg.Subject = textBox3.Text; msg.SubjectEncoding = Encoding.Default; //Body設定郵件內容屬性 msg.Body = richTextBox1.Text; msg.BodyEncoding = Encoding.Default; //設定郵件的優先順序Priority屬性 if (radioButton1.Checked) msg.Priority = MailPriority.High; else if (radioButton2.Checked) msg.Priority = MailPriority.Low; else if (radioButton3.Checked) msg.Priority = MailPriority.Normal; else msg.Priority = MailPriority.Normal; //發送郵件 SmtpClient client = new SmtpClient(); //郵件server設定smtpport 預設25 client.Host = "smtp.163.com"; client.Port = 25; //郵件發送方式 通過網路發送到SMTPserver client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; //憑證 寄件者登入郵箱的username和password client.Credentials = new System.Net.NetworkCredential("1520161xxxx", "19911203xxxx"); client.Send(msg); MessageBox.Show("郵件發送成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception m) //異常處理 { MessageBox.Show(m.Message); }}//點擊"加入附件"按鈕private void button2_Click(object sender, EventArgs e){ OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.CheckFileExists = true; //不存在檔案名稱顯示警告 openFileDialog.ValidateNames = true; //值接受Win32檔案 openFileDialog.Multiselect = false; //不同意多選檔案 openFileDialog.Filter = "全部檔案(*.*)|*.*"; //加入附件 現僅支援加入一個附件 if (openFileDialog.ShowDialog() == DialogResult.OK) { richTextBox1.Text = openFileDialog.FileName; att = new Attachment(openFileDialog.FileName); msg.Attachments.Add(att); }}//點擊"刪除附件"按鈕private void button3_Click(object sender, EventArgs e){ msg.Attachments.Clear();}
執行結果例如以所看到的:
這不過C#使用SMTP發送郵件的基礎知識,讀者能夠自己完好做成更好的介面.
四.總結
你也能夠調用Windows內建的郵件發送程式實現,Windows內建Outlook Express軟體,能夠通過函數ShellExecute()或CreateProcess()調用Outlook Express,Ctrl+R調用"執行",輸入“mailto:[email protected]”就可以調用發送郵件.使用該軟體時首先須要測試賬戶,我綁定的是163郵箱.讀者感興趣能夠自己完畢.
本文主要講述C#網路編程中SMTP郵件協議,怎樣發送郵件的過程,並比較了新版的和舊版的方法.這將是我的C#網路編程的最後一篇文章,接下來想學習C#網路編程爬蟲、下載網片、資料採礦結合之類的知識.希望文章對大家有所協助,假設有錯誤或不足之處,請海涵!眼下法國VS瑞士 3:0.
(By:Eastmount 2014-6-21 夜4點 原創CSDN http://blog.csdn.net/eastmount/)
推薦相參考的關資料,很不錯,值得學習:
1.[C# 網路編程系列]專題十:實現簡單的郵件收發器 -- Learning_Hard
http://blog.csdn.net/learning_hard/article/details/9071041
2.C#使用163的SMTPserver發送郵件 -- PowerCoder
http://www.cnblogs.com/OpenCoder/archive/2010/07/16/1779247.html
3.C#郵件下載 -- zhouquanandy
http://download.csdn.net/detail/zhouquanandy/4444802
4.《C#網路編程執行個體教程》-- 周存傑
5.C#發送郵件(加入附件)-- 期待秋天的葉
http://blog.csdn.net/kkkkkxiaofei/article/details/7941239
C# 網路編程之基於SMTP寄送電子郵件