郵件發送(附源碼)


   今天分享一個郵件發送的實例,使用的是Smtp服務,實例中使用到了網易的smtp服務器smtp:163.com QQ的smtp服務器:smtp:qq.com,實現主要用到了微軟的System.Net.Mail中提供的SmtpClient類和MailMessage類。

注意點:

      我們要實現郵件發送,必須首先保證郵箱中的對應的服務是開啟狀態,下面以QQ郵箱為例,想要使用Smtp服務必須保證Smtp服務是開啟的,看到QQ郵箱的服務設置,勾選上對應的服務即可,QQ默認是勾選上的,但也有些郵箱默認是不開啟服務的。


頁面端:

首先貼上頁面圖,設計頁面,設置默認端口號為25,Smtp服務統一的端口號:

 


代碼端:

首先是初始化代碼:

初始化
 1          // 保存名稱
 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:

Form_Load
1          // 頁面載入
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         }

頁面載入時,主要是做一些初始化的工作,設定頁面的下拉框為首項選中。

接下來是最重要的代碼,郵件發送,即【發送】按鈕代碼:

發送郵件
 1  // 發送郵件
 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():

SetSmtpClient
 1         // 設置Smtp服務器信息
 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()方法代碼:

SetAddressFrom
 1          // 驗證發件人信息
 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         }

 

NetworkCredential 類是為基於密碼的身份驗證方案(如基本、簡要、NTLM 和 Kerberos)提供憑據的基類.通過該類進行服務器驗證,然后指定發件人的地址及密碼,因為Smtp需要密碼驗證。

由於郵件實現了附件的發送,接下來是附件部分的代碼,首先是選擇附件即【...】按鈕代碼:

選擇附件
 1   // 選擇附件
 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組件而已,所以對應的方法名也會有所改變了,先貼上該方法的代碼:

EditValueChanged
 1          // 文本框變化事件
 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()方法:

CanAddAttachment
 1          // 判斷附件類型是否合法
 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()方法:

CanAddSize
 1          // 獲取文件大小
 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         }

最后是郵件發送之后的回調函數,代碼:

回調函數
1          // 回調函數
2           private  void SendBack( object sender, AsyncCompletedEventArgs e)
3         {
4             MessageBox.Show( " 您的郵件已成功發送! ", " 恭喜 ",MessageBoxButtons.OK,MessageBoxIcon.Information);
5         }

回調函數我寫的很簡單,就是彈出一個提示框,告知用戶郵件發送成功。調用回調函數是在郵件發送代碼中,即:

smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);

 

至此,該實例的界面,代碼都講解完了.......接下來看看運行效果吧......

首先運行(無附件)----填寫信息:這里設置發送端為網易163郵箱,接收端為QQ郵箱

點擊【發送】,沒有問題,QQ郵箱提示有新郵件信息:

 

然后再看看帶附件的郵箱發送效果,同樣運行,然后點擊【...】按鈕選擇附件信息,如圖:

 

此時如果添加附件成功則有提示信息“添加成功”,說明此時的郵件已經帶有了附件信息,然后同樣點擊【發送】按鈕,這時QQ郵箱同樣提示有新郵件信息,只不過這次的郵件是帶附件郵件,如圖:

 

那么點擊郵件進去看看附件信息,如圖:

 

沒問題,就是我們剛才添加的"知識點筆記.doc"附件。


至此,這個郵件發送的實例講解就到這為止了,歡迎大家擴展交流,,可以將其擴展成可以實現群發效果.........

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM