使用C#編寫簡(jiǎn)單的圖形化的可發(fā)送附件的郵件客戶端程序
今天談一下C#(WinForm)如何發(fā)送帶附件的電子郵件!廢話少說,先截圖伺候:
首先C#發(fā)送郵件需要smtp服務(wù)的支持,我也不知道是不是C#只支持smtp協(xié)議,不過好像在MSDN里,Mail這個(gè)命名空間下只有介紹smtp的方法的,好像沒看到POP的,算了,先不要說這個(gè)
我們暫時(shí)用smtp協(xié)議來做就好了!因此首先你要確保你的發(fā)件郵箱支持smtp服務(wù),據(jù)我說知,雅虎郵箱,HotMail郵箱和GMail郵箱都不支持smtp的,不過沒事,還好我們常用的QQ郵箱,163郵箱,新浪郵箱等郵箱都支持smtp的,這樣我們就可以用這些郵箱來發(fā)郵件了,哈哈,不過QQ郵箱的smtp服務(wù)默認(rèn)是關(guān)閉的,需要我們手動(dòng)去開通,開通很簡(jiǎn)單,進(jìn)入你的QQ郵箱后,選擇【設(shè)置】,在賬戶選項(xiàng)卡里就有個(gè)smtp的復(fù)選框,打個(gè)勾保存一下就OK了。163郵箱和新浪郵箱開通smtp服務(wù)也差不多這樣的,很簡(jiǎn)單。好了 開通好了接下來就開始來講代碼了 OK!
為了方便菜鳥理解,我把整個(gè)程序分成一下幾部分:
- smtp服務(wù)信息設(shè)置
- 驗(yàn)證發(fā)件人信息
- 添加附件
- 正式發(fā)送郵件
- 發(fā)送郵件后處理
OK 以下代碼伺候:
一些全局變量,都有注釋的
SmtpClient SmtpClient = null; //設(shè)置SMTP協(xié)議 MailAddress MailAddress_from = null; //設(shè)置發(fā)信人地址 當(dāng)然還需要密碼 MailAddress MailAddress_to = null; //設(shè)置收信人地址 不需要密碼 MailMessage MailMessage_Mai = null; FileStream FileStream_my = null; //附件文件流
1.smtp服務(wù)信息設(shè)置
#region 設(shè)置Smtp服務(wù)器信息 /// <summary> /// 設(shè)置Smtp服務(wù)器信息 /// </summary> /// <param name="ServerName">SMTP服務(wù)名</param> /// <param name="Port">端口號(hào)</param> private void setSmtpClient(string ServerHost, int Port) { SmtpClient = new SmtpClient(); SmtpClient.Host = ServerHost;//指定SMTP服務(wù)名 例如QQ郵箱為 smtp.qq.com 新浪cn郵箱為 smtp.sina.cn等 SmtpClient.Port = Port; //指定端口號(hào) SmtpClient.Timeout = 0; //超時(shí)時(shí)間 } #endregion
2.驗(yàn)證發(fā)件人信息
#region 驗(yàn)證發(fā)件人信息 /// <summary> /// 驗(yàn)證發(fā)件人信息 /// </summary> /// <param name="MailAddress">發(fā)件郵箱地址</param> /// <param name="MailPwd">郵箱密碼</param> private void setAddressform(string MailAddress, string MailPwd) { //創(chuàng)建服務(wù)器認(rèn)證 NetworkCredential NetworkCredential_my = new NetworkCredential(MailAddress, MailPwd); //實(shí)例化發(fā)件人地址 MailAddress_from = new System.Net.Mail.MailAddress(MailAddress, textBoxX4.Text); //指定發(fā)件人信息 包括郵箱地址和郵箱密碼 SmtpClient.Credentials = new System.Net.NetworkCredential(MailAddress_from.Address, MailPwd); ; } #endregion
3.添加附件
#region 檢測(cè)附件大小 private bool Attachment_MaiInit(string path) { try { FileStream_my = new FileStream(path, FileMode.Open); string name = FileStream_my.Name; int size = (int)(FileStream_my.Length / 1024/1024); FileStream_my.Close(); //控制文件大小不大于10M if (size > 10) { MessageBox.Show("文件長(zhǎng)度不能大于10M!你選擇的文件大小為"+ size.ToString()+"M","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning); return false; } return true; } catch (IOException E) { MessageBox.Show(E.Message); return false; } } #endregion
4.正式發(fā)送郵件
private void btnSend_Click(object sender, EventArgs e) { //檢測(cè)附件大小 發(fā)件必需小于10M 否則返回 不會(huì)執(zhí)行以下代碼 if (txt_Path.Text != "") { if (!Attachment_MaiInit(txt_Path.Text.Trim())) { return; } } if (txt_SmtpServer.Text == "") { MessageBox.Show("請(qǐng)輸入SMTP服務(wù)器名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (textBoxX2.Text == "") { MessageBox.Show("請(qǐng)輸入發(fā)件人郵箱地址!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (txtformPwd.Text == "") { MessageBox.Show("請(qǐng)輸入發(fā)件人郵箱密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (dataGridViewX1.Rows.Count == 0) { MessageBox.Show("請(qǐng)?zhí)砑邮占耍?, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (MessageBox.Show("您確定要發(fā)送當(dāng)前郵件嗎?", "詢問", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { try { //初始化Smtp服務(wù)器信息 setSmtpClient("smtp." + txt_SmtpServer.Text.Trim() + comboBoxEx3.Text, Convert.ToInt32(numericUpDown1.Value)); } catch (Exception Ex) { MessageBox.Show("郵件發(fā)送失敗,請(qǐng)確定SMTP服務(wù)名是否正確!" + "\n" + "技術(shù)信息:\n" + Ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } try { //驗(yàn)證發(fā)件郵箱地址和密碼 setAddressform(textBoxX2.Text.Trim() + comboBoxEx2.Text, txtformPwd.Text.Trim()); } catch (Exception Ex) { MessageBox.Show("郵件發(fā)送失敗,請(qǐng)確定發(fā)件郵箱地址和密碼的正確性!" + "\n" + "技術(shù)信息:\n" + Ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //清空歷史發(fā)送信息 以防發(fā)送時(shí)收件人收到的錯(cuò)誤信息(收件人列表會(huì)不斷重復(fù)) MailMessage_Mai.To.Clear(); //添加收件人郵箱地址 foreach (DataGridViewRow row in dataGridViewX1.Rows) { MailAddress_to = new MailAddress(row.Cells["Column1"].Value.ToString()); MailMessage_Mai.To.Add(MailAddress_to); } MessageBox.Show("收件人:" + dataGridViewX1.Rows.Count.ToString() + " 個(gè)"); //發(fā)件人郵箱 MailMessage_Mai.From = MailAddress_from; //郵件主題 MailMessage_Mai.Subject = txttitle.Text; MailMessage_Mai.SubjectEncoding = System.Text.Encoding.UTF8; //郵件正文 MailMessage_Mai.Body = Rtb_Message.Text; MailMessage_Mai.BodyEncoding = System.Text.Encoding.UTF8; //清空歷史附件 以防附件重復(fù)發(fā)送 MailMessage_Mai.Attachments.Clear(); //添加附件 MailMessage_Mai.Attachments.Add(new Attachment(txt_Path.Text.Trim(), MediaTypeNames.Application.Octet)); //注冊(cè)郵件發(fā)送完畢后的處理事件 SmtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); //開始發(fā)送郵件 SmtpClient.SendAsync(MailMessage_Mai, "000000000"); } }
5.發(fā)送郵件后處理
#region 發(fā)送郵件后所處理的函數(shù) private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) { try { if (e.Cancelled) { MessageBox.Show("發(fā)送已取消!"); } if (e.Error != null) { MessageBox.Show("郵件發(fā)送失?。? + "\n" + "技術(shù)信息:\n" + e.ToString(), "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show("郵件成功發(fā)出!", "恭喜!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception Ex) { MessageBox.Show("郵件發(fā)送失敗!" + "\n" + "技術(shù)信息:\n" + Ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #endregion
上一篇:詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn)
欄 目:C#教程
下一篇:使用C#寫了一個(gè)可以推算火車票身份證號(hào)碼的小程序
本文標(biāo)題:使用C#編寫簡(jiǎn)單的圖形化的可發(fā)送附件的郵件客戶端程序
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6727.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)簡(jiǎn)單的Login窗口實(shí)例
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法
- 01-10C#使用windows服務(wù)開啟應(yīng)用程序的方法
- 01-10c# ArrayList的使用方法小總結(jié)
- 01-10winform簡(jiǎn)單緩存類實(shí)例
- 01-10C#一個(gè)簡(jiǎn)單的定時(shí)小程序?qū)崿F(xiàn)代碼
- 01-10C#圓角窗體簡(jiǎn)單實(shí)現(xiàn)方法
- 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫(kù)的方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什