今天分享一個郵件發送的實例,使用的是Smtp服務,實例中使用到了網易的smtp服務器:smtp:163.com 和QQ的smtp服務器:smtp:qq.com,實現主要用到了微軟的System.Net.Mail中提供的SmtpClient類和MailMessage類。
我們要實現郵件發送,必須首先保證郵箱中的對應的服務是開啟狀態,下面以QQ郵箱為例,想要使用Smtp服務必須保證Smtp服務是開啟的,看到QQ郵箱的服務設置,勾選上對應的服務即可,QQ默認是勾選上的,但也有些郵箱默認是不開啟服務的。
頁面端:
首先貼上頁面圖,設計頁面,設置默認端口號為25,Smtp服務統一的端口號:
代碼端:
首先是初始化代碼:

2 private string fileName = "";
3 // 文件操作
4 FileStream fs = null;
5
6 // 設置Smtp協議
7 SmtpClient smtpClient = null;
8 // 設置發信人地址 需要密碼
9 MailAddress AddressFrom = null;
10 // 設置收信人地址 不需要密碼
11 MailAddress AddressTo = null;
12 // 郵件信息
13 MailMessage Message = null;
頁面載入代碼,即Form_Load:

2 private void Form1_Load( object sender, EventArgs e)
3 {
4 // 初始化下拉框
5 cmbHZ.SelectedIndex = 0;
6 cmbReceiveHZ.SelectedIndex = 0;
7 cmbSendHZ.SelectedIndex = 0;
8 cmbSmtp.SelectedIndex = 0;
9 }
頁面載入時,主要是做一些初始化的工作,設定頁面的下拉框為首項選中。
接下來是最重要的代碼,郵件發送,即【發送】按鈕代碼:

2 private void btnSend_Click( object sender, EventArgs e)
3 {
4 if (MessageBox.Show( " 您確定要發送當前郵件嗎? ", " 發送提示 ", MessageBoxButtons.YesNo, MessageBoxIcon.Question)==DialogResult.Yes)
5 {
6 try
7 {
8 // 設置Smtp服務器信息
9 SetSmtpClient( " smtp. " + cmbSmtp.Text + cmbHZ.Text, Convert.ToInt32(nudPort.Value));
10
11 }
12 catch (Exception err)
13 {
14 MessageBox.Show( " 郵件發送失敗,請確定Smtp服務器名是否正確! "+ " \n "+ " 技術信息: "+err.Message);
15 return;
16 }
17 try
18 {
19 if (tbPwd.Text == "")
20 {
21 MessageBox.Show( " 對不起,需要密碼驗證,請輸入密碼! ", " 提示 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
22 tbPwd.Focus();
23 return;
24 }
25
26 // 設置發送地址信息
27 SetAddressFrom(tbSendEmail.Text.Trim() + cmbSendHZ.Text, tbPwd.Text);
28 }
29 catch (Exception)
30 {
31 MessageBox.Show( " 郵件發送失敗,請確認發送郵箱地址和密碼的正確性! ");
32 return;
33 }
34
35 // message信息
36 Message = new MailMessage();
37
38 // 發信人地址
39 Message.From = AddressFrom;
40 // 收信人地址
41 AddressTo = new MailAddress(tbReceiveEmail.Text.Trim() + cmbReceiveHZ.Text);
42 // 添加收信人地址
43 Message.To.Add(AddressTo);
44
45 // 信息的主題
46 Message.Subject = tbTitle.Text;
47 // 主題的編碼方式
48 Message.SubjectEncoding = System.Text.Encoding.UTF8;
49
50 // 郵件正文
51 Message.Body = tbContent.Text;
52 // 郵件正文的編碼
53 Message.BodyEncoding = System.Text.Encoding.UTF8;
54
55 // 清除附件信息
56 Message.Attachments.Clear();
57 // 添加附件
58 if (tbAttachment.Text != "")
59 {
60 Message.Attachments.Add( new Attachment(tbAttachment.Text.Trim()));
61 }
62 // 發送
63 smtpClient.SendAsync(Message, " 000000 ");
64 // 發送完成回調函數
65 smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);
66
67 }
68 }
其中在該事件中還涉及到了SetSmtpClient()方法和SetAddressFrom()方法,在后面會講解到。該事件主要實現了郵件的發送功能,但在郵件發送前需要對郵件的一些信息做一些配置,大致配置過程為:配置SmtpClient實例信息(服務器名,端口,超時等)-->>發件人信息驗證(服務器驗證,發件人地址,密碼),使用Smtp服務時需要驗證密碼-->>配置MailMessage實例的信息(發件人地址,收件人地址,主題,正文,附件信息),同時指定編碼方式-->>郵件發送回調函數(郵件發送成功事件),這就是這個事件代碼執行的大致流程,同時在該事件中加入了一些邏輯判斷,首先Smtp服務必須要有密碼驗證,所以必須使用戶輸入密碼,然后是添加附件部分,我這里指定了附件的格式,即只允許將一定格式的文件作為附件,所以要對文件的格式做個判斷,其次就是附件的大小,附件過大影響傳送速度,所以限制了文件的大小在10M以內。
下面貼上發送郵件中使用到的方法代碼,SetSmtpClient():

2 private void SetSmtpClient( string serverHost, int Port)
3 {
4 smtpClient = new SmtpClient();
5 // 指定Smtp服務名
6 // QQ:smtp.qq.com
7 // sina:smtp.sina.cn
8 smtpClient.Host = serverHost;
9 smtpClient.Port = Port;
10 smtpClient.Timeout = 0;
11 }
該方法主要實現對SmtpClient實例配置,指定其Host(服務器信息),Port(端口號),Timeout(超時)。
接着貼上SetAddressFrom()方法代碼:

2 private void SetAddressFrom( string mailAddress, string mailPwd)
3 {
4 // 創建服務器驗證
5 NetworkCredential networkCreadential_My = new NetworkCredential(mailAddress,mailPwd);
6 // 實例化發件人地址
7 AddressFrom = new MailAddress(mailAddress,tbShowName.Text);
8 // 指定發件人信息 郵箱地址和密碼
9 smtpClient.Credentials = new NetworkCredential(AddressFrom.Address, mailPwd);
10
11 }
由於郵件實現了附件的發送,接下來是附件部分的代碼,首先是選擇附件即【...】按鈕代碼:

2 private void btn_SelectAttach_Click( object sender, EventArgs e)
3 {
4 // 打開文件對話框
5 OpenFileDialog open = new OpenFileDialog();
6 if (open.ShowDialog() == DialogResult.OK)
7 {
8 // 保存選擇的文件名
9 fileName = open.SafeFileName;
10 tbAttachment.Text = open.SafeFileName;
11
12 }
13 }
該事件中主要用到了一個打開文件對話框,從而選擇要附加的文件。
因為當選中了文件之后,需要顯示些信息,必須文件大小啊,文件格式啊,是否添加成功啊...所以我添加了一個文本框內容變化事件(EditValueChanged),對這個方法可能你會陌生,其實只是由於用到了DXperience組件而已,所以對應的方法名也會有所改變了,先貼上該方法的代碼:

2 private void tbAttachment_EditValueChanged( object sender, EventArgs e)
3 {
4 // 判斷時候可以上傳
5 if (CanAddAttachment(tbAttachment.Text))
6 {
7 // 判斷大小是否允許
8 if (CanAddSize(tbAttachment.Text))
9 {
10 lblState.Visible = true;
11 lblState.Text = " 添加成功! ";
12 }
13 else
14 {
15 MessageBox.Show( " 上傳的文件過大! ");
16 btnSend.Enabled = false;
17 return;
18 }
19 }
20 else
21 {
22 MessageBox.Show( " 不支持該格式的附件! ");
23 btnSend.Enabled = false;
24 return;
25 }
26 }
可以發現,該方法中又有兩個方法CanAddAttachment()方法和CanAddSize()方法,看方法名就知道一個用來判斷是否可以添加該附件,一個是用來判斷是否為允許大小。主要是這兩個方法的調用,其他就是寫邏輯判斷,然后是打印出對應信息,比如郵件過大即彈出框提醒,添加成功即設置反饋信息為"添加成功"。
貼上這兩個方法的代碼,CanAddAttachment()方法:

2 private bool CanAddAttachment( string path)
3 {
4 // 實例化文件操作對象
5 fs = new FileStream(path, FileMode.Open);
6 // 設置允許添加的附件類型
7 string[] allowExtensions = new string[] { " .jpg ", " .jpeg ", " .doc ", " .docx ", " .txt ", " .excel ", " .rar ", " .zip "};
8 // 獲取文件的后綴
9 string name = System.IO.Path.GetExtension(fs.Name);
10 for ( int i = 0; i < allowExtensions.Length; i++)
11 {
12 if (name == allowExtensions[i])
13 {
14 return true;
15 }
16 }
17 fs.Flush();
18 fs.Close();
19 return false;
20 }
接着是CanAddSize()方法:

2 private bool CanAddSize( string path)
3 {
4 double size = Convert.ToDouble(fs.Length) / 1024.0 / 1024.0;
5 // 設置最大為10M
6 if (size > 10)
7 {
8 return false;
9 }
10 fs.Flush();
11 fs.Close();
12 return true;
13 }
最后是郵件發送之后的回調函數,代碼:

2 private void SendBack( object sender, AsyncCompletedEventArgs e)
3 {
4 MessageBox.Show( " 您的郵件已成功發送! ", " 恭喜 ",MessageBoxButtons.OK,MessageBoxIcon.Information);
5 }
回調函數我寫的很簡單,就是彈出一個提示框,告知用戶郵件發送成功。調用回調函數是在郵件發送代碼中,即:
至此,該實例的界面,代碼都講解完了.......接下來看看運行效果吧......
首先運行(無附件)----填寫信息:這里設置發送端為網易163郵箱,接收端為QQ郵箱

點擊【發送】,沒有問題,QQ郵箱提示有新郵件信息:
然后再看看帶附件的郵箱發送效果,同樣運行,然后點擊【...】按鈕選擇附件信息,如圖:
此時如果添加附件成功則有提示信息“添加成功”,說明此時的郵件已經帶有了附件信息,然后同樣點擊【發送】按鈕,這時QQ郵箱同樣提示有新郵件信息,只不過這次的郵件是帶附件郵件,如圖:
那么點擊郵件進去看看附件信息,如圖:
沒問題,就是我們剛才添加的"知識點筆記.doc"附件。
至此,這個郵件發送的實例講解就到這為止了,歡迎大家擴展交流,,可以將其擴展成可以實現群發效果.........