使用C#寄送電子郵件

來源:互聯網
上載者:User
前幾天學生問怎樣用C#寄送電子郵件,網上文章很多,隨手找了一篇,給學生,讓他自己去看下。結果,搞了一天沒有搞定,只好來仔細看一下。用C#寄送電子郵件,網上介紹的很多文章都是使用SmtpClient,也有System.Web.Mail ,但是,System.Web.Mail 已經是不推薦使用的了。以下是在網上常見的一種寄送電子郵件的代碼:Code
 1MailMessage MyEmilMessage=new MailMessage();
 2string attachFile;        //用於構造附件的字串變數
 3
 4MyEmailMessage.From="Writer@sadf.com";
 5MyEmailMessage.To="Geter@dff.com;tome@asd.com";
 6MyEmailMessage.Subject="郵件發送的一個簡單例子";
 7MyEmailMessage.body="貓王呼叫耗子,收到請回答!!!";
 8MyEmailMessage.BodyFormat=MailFormat.Text;
 9MyEmailMessage.Priority=MailPriority.High;
10
11//構造添加附件
12attachFile=@"D:\test\test.txt";
13MailAttachment mailAttach=new MailAttachment(attachFile);
14MyEmailMessage.Attachments.Add(mailAttach);
15
16//寄送電子郵件
17SmtpMail.SmtpServer="寄送電子郵件的SMTP地址或者IP";// 指定smtp伺服器
18SmtpMail.Send(MyEmailMessage);//寄送電子郵件
19

這些代碼基本上都沒有任何錯誤,編譯也都會通過,但是,如果使用這種方式發送,基本上可以保證,你的電子郵件發送不成功。然後,這裡是缺少身分識別驗證,而且比較麻煩就是這個身分識別驗證。下面是我給學生寫的一個樣本:Code
 1           string mailContent="郵件內容";
 2
 3            MailMessage msg = new System.Net.Mail.MailMessage();
 4            msg.To.Add("******@gmail.com"); //收件者
 5
 6            //寄件者資訊
 7            msg.From = new MailAddress("*****@gmail.com", "發送人姓名", System.Text.Encoding.UTF8);
 8            msg.Subject = "這是測試郵件";   //郵件標題
 9            msg.SubjectEncoding = System.Text.Encoding.UTF8;    //標題編碼
10            msg.Body = mailContent; //郵件主體
11            msg.BodyEncoding = System.Text.Encoding.UTF8;
12            msg.IsBodyHtml = true;  //是否HTML
13            msg.Priority = MailPriority.High;   //優先順序
14
15            SmtpClient client = new SmtpClient();
16            //設定GMail郵箱和密碼 
17            client.Credentials = new System.Net.NetworkCredential("帳號@gmail.com", "密碼");
18            client.Port = 587;
19            client.Host = "smtp.gmail.com";
20            client.EnableSsl = true;
21            object userState = msg;
22            try
23            {
24                client.Send(msg);
25                MessageBox.Show("發送成功");
26            }
27            catch (Exception ex)
28            {
29                MessageBox.Show(ex.Message, "發送郵件出錯");
30            } 
31

這裡的重點是郵箱身分識別驗證那個地方,一定不能寫錯,否則,郵件發送不出去。到這裡,似乎是大功告成了,但是,你會發現,相同的程式,在某些機器上可以發送成功,在某些機器上發送總是失敗,是系統的原因?似乎不是,因為相同的系統,也是有的發送成功,有的發送失敗。那是,架構的原因?似乎也不是。
這裡就有一個很令人迷惑的現象出現,同樣的系統,同樣的架構,還是有的能發送成功,有的發送失敗。失敗的具體原因說是郵件標題編碼有錯誤。那麼,我們去掉Subject,不寫,用預設的可以嗎?也是一樣的。這個問題很見鬼,於是使用EtherPeek進行抓包,發現了一個有趣的現象,這裡有一個很重要的包:

這裡要注意的是紅色劃線的地方,“EHLO xqxPC”,我的機器名就是xqxPC,問題就在這裡啦,SmtpClient寄送電子郵件的時候,需要發送一條EHLO指令到郵件伺服器,參數是機器名,如果機器名使用中文,就發送不成功了。

簡單總結一下:
1、使用SmtpClient寄送電子郵件是很簡單的,只要正確建立了MailMessage對象和SmtpClient就可以很容易的發送出去電子郵件。
2、如果電子郵件伺服器需要身分識別驗證【似乎現在都需要身分識別驗證,除非自己配置的】,注意下面這句話:
smtpClient.Credentials = new System.Net.NetworkCredential("帳號@gmail.com", "密碼");
3、機器名不能使用中文。PS:為什麼這樣一篇文章也有人反對呢?Why?莫非以後不能在這裡寫東西啦?呵呵……,一直在猶豫要不要在這裡開博,繼續猶豫吧……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.