C# 網路程式設計之基於SMTP傳送電子郵件
本文主要講述基於C#網路程式設計的傳送郵件的程式設計,郵件傳送功能是基於郵件協議的,常見的電子郵件協議有SMTP(簡單郵件傳輸協議)、POP3(郵局協議)、IMAP(Internet郵件訪問協議),文章主要參考周存傑的《C#網路程式設計例項教程》.這也是最後一篇參照該書的網路程式設計文章,之後的該系列文章都是基於網路實際應用的,不會再大量講述原理知識.
一.SMTP協議
SMTP協議是TCP/IP協議家族定義的機器間交換郵件的標準,它主要負責底層郵件系統如何將一個報文從一臺機器傳輸到另一臺機器,而不關心郵件如何儲存及傳輸速度.它的步驟基本如下:客戶端首先建立與伺服器TCP連線,然後伺服器傳送220報文(服務就緒),客戶端收到220報文後傳送HELLO命令,伺服器收到HELLO後作出響應,最後伺服器和客戶端可以開始郵件通訊.
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的一種替代協議,提供了郵件檢索和郵件處理的新功能,使用者可以完全不必下載郵件正文就可以看到郵件的標題摘要,從郵件客戶端軟體就可以對伺服器上的郵件和資料夾目錄進行操作.
二.SMTP協議封裝的類(舊版)
1.SmtpMail類
該類用於傳送郵件,其名稱空間為System.Web.Mail.該類常用屬性只有一個:
public static string SmtpServer {get; set;}
獲取或設定SMTP伺服器名稱,如不設定將使用本地主機名.如果提示新增名稱空間不存在,需要在專案中新增引用,新增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 Normal
public 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 配置值無效”或“伺服器未響應”等,但是它與新版的方法及屬性基本沒有變換.C#更新的smtp名稱空間為System.Net.Mail,其中SmtpClient類用於smtp傳送郵件.
1.Host屬性用於設定主機名或IP地址
2.Port屬性用於設定SMTP事務埠
3.Credentials屬性用於驗證寄件者的認證
4.DeliveryMethod屬性用於指定如何處理待送的電子郵件訊息
5.Send方法用於將電子郵件傳送到 SMTP 伺服器以便傳遞
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();
//郵件伺服器設定smtp埠 預設25
client.Host = "smtp.163.com";
client.Port = 25;
//郵件傳送方式 通過網路傳送到SMTP伺服器
client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//憑證 發件人登入郵箱的使用者名稱和密碼
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.
)
推薦相參考的關資料,非常不錯,值得學習:
1.[C# 網路程式設計系列]專題十:實現簡單的郵件收發器 -- Learning_Hard
http://blog.csdn.net/learning_hard/article/details/9071041
2.C#使用163的SMTP伺服器傳送郵件 -- PowerCoder
http://www.cnblogs.com/OpenCoder/archive/2010/07/16/1779247.html
3.C#郵件下載 -- zhouquanandy
http://download.csdn.net/detail/zhouquanandy/4444802