最近看了一下郵件發送的相關原理,在網上找了一些資料,基本弄清楚了基本流程,在這裏記錄一下,歡迎你們拍磚。服務器
概述網絡
電子郵件是因特網上使用得很是多的一種應用,它能夠很是方便的使相隔很遠的人進行通訊。它主要的特色就是操做簡單,快捷。當你發送一封郵件的時候,它首先會發送到收件人的郵件服務器上,並放入收件人的信箱中。(若是你在某一個郵件服務器提供商那裏申請了一個郵箱帳號,那麼你在這個郵件服務器上面就有一個電子信箱)。收件人只須要定時讀取它的電子信箱,就能夠接收別人發送過來的信件,並與別人進行通訊了。app
基本組成部分:測試
一個簡單的郵件系統,應該包含三部分:首先是郵件服務器,而後是用戶代理和郵件傳送協議。 google
郵件服務器就是一個供在網上存儲郵件的空間。通常每一個郵件服務器的提供商都有本身的郵件服務器,只要你申請了他的郵箱帳號,你就會在他的郵件服務器上擁有本身郵箱。像Google,騰訊都是郵件服務的提供商,他們都有本身的郵件服務器,若是你申請了Gamil郵箱,那麼在Google的郵件服務器上面,你就有本身的一塊存儲空間了。一樣,若是你申請了qq郵箱,那麼在qq郵件服務器上面也有你本身的空間了,也就是你的郵箱。當你要收取信件的時候,你就須要鏈接到不一樣的服務器上面。不一樣的郵件服務提供商,他們的郵件服務器的地址是不同的。後面會介紹一些經常使用的郵件服務器的地址。編碼
用戶代理也就是你用來從郵件服務器上讀取或者發送郵件到郵件服務器上的一個軟件。好比經常使用的OutLook,Foxmail等等。咱們知道,咱們的郵件都是存儲在郵件服務器上面的,咱們發送郵件的時候,去往郵件服務器上面發,咱們收取郵件的時候,也須要從服務器上面讀。爲了方便的完成這些工做,咱們就須要用戶代理。spa
郵件傳送協議是指郵件在傳送過程當中必須遵照的約定,它規定了不一樣的服務器(或客戶端)之間應如何交換信息。比較常見的有郵件服務器之間的通訊協議SMTP以及用戶代理與郵件服務器之間的通訊協議POP3。(注意:郵件服務器之間的協議是使用SMTP,用戶發送郵件到郵件服務器使用的仍是SMTP協議,用戶從郵件服務器讀取郵件用的纔是POP3協議)。.net
基本流程:計算機網絡
截圖來自謝希仁《計算機網絡》代理
郵件的收發過程:
1. 發信人在用戶代理上編輯郵件,並寫清楚收件人的郵箱地址;
2. 用戶代理根據發信人編輯的信息,生成一封符合郵件格式的郵件;
3. 用戶代理把郵件發送到發信人的的郵件服務器上,郵件服務器上面有一個緩衝隊列,發送到郵件服務器上面的郵件都會加入到緩衝隊列中,等待郵件服務器上的SMTP客戶端進行發送;
4. 發信人的郵件服務器使用SMTP協議把這封郵件發送到收件人的郵件服務器上(它會自動根據收件人的郵箱來分析出收件人的郵箱服務器);
5. 收件人的郵件服務器收到郵件後,把這封郵件放到收件人在這個服務器上的信箱中;
6. 收件人使用用戶代理來收取郵件。首先用戶代理使用POP3協議來鏈接收件人所在的郵件服務器,身份驗證成功後,用戶代理就能夠把郵件服務器上面的收件人郵箱裏面的郵件讀取出來,並展現給收件人。
下面以一個簡短的例子來講明這個過程:
好比Tom要給Lucy發一封郵件,邀請她明天晚上一塊兒看電腦。首先TOM會打開OutLook(用戶代理),第一次使用用戶代理時,須要進行相關的配置,詳細的配置過程見後面的例子。咱們先假設Tom已經配置好用戶代理.Tom打開OutLook後,首先會填寫收件人的郵箱,而後是郵件的主題以及郵件的內容,寫好以後,點擊發送。OutLook就會把這封郵件發送到Tom郵箱的服務器上面(好比Tom申請的是Gmail郵箱,那麼這封郵件就會發送到Gmail的郵件服務器上面,這個郵件服務器的地址通常會由郵件服務商給出,在第一次配置OutLook時,就須要填寫這個地址)。Tom郵箱服務器上面的SMTP客戶端就根據收件人的地址,找到收件人所在的郵箱服務器,而後與收件人郵件服務器上面的SMTP端創建一個TCP鏈接,通過三次握手後,這封郵件就會經過這個鏈接傳送到收件人的郵件服務器上面,也就是Lucy的郵箱服務器上面。若是Lucy須要收取郵件,它也須要一個用戶代理,就假設她用的也是OutLook(她在第一次使用OutLook時,也要配置她的郵箱服務器地址),啓動OutLook後,OutLook會每隔一段時間(這個時間能夠由用戶本身設置)去鏈接郵箱服務器,判斷是否收到新的郵件,若是收到了新的郵件,就使用POP3協議把這封郵件讀取出來,並經過OutLook顯示給Lucy看。Lucy看到郵件後,答應了Tom的請求,她就會向Tom回覆一封郵件,回覆郵件的過程與上面的過程是同樣的,這裏就不細說了。
協議簡介:SMTP
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,是一種提供可靠且有效電子郵件傳輸的協議。SMTP是創建在FTP文件傳輸服務上的一種郵件服務,主要用於傳輸系統之間的郵件信息並提供與來信有關的通知。(來自百度百科)
協議簡介:POP3
POP3(Post Office Protocol 3)即郵局協議的第3個版本,它是規定我的計算機如何鏈接到互聯網上的郵件服務器進行收發郵件的協議。它是因特網電子郵件的第一個離線協議標準,POP3協議容許用戶從服務器上把郵件存儲到本地主機(即本身的計算機)上,同時根據客戶端的操做刪除或保存在郵件服務器上的郵件,而POP3服務器則是遵循POP3協議的接收郵件服務器,用來接收電子郵件的。(來自百度百科)
POP 協議支持「離線」郵件處理。其具體過程是:郵件發送到服務器上,電子郵件客戶端調用郵件客戶機程序以鏈接服務器,並下載全部未閱讀的電子郵件。這種離線訪問模式是一種存儲轉發服務,將郵件從郵件服務器端送到我的終端機器上,通常是 PC機或 MAC。一旦郵件發送到 PC 機或 MAC上,郵件服務器上的郵件將會被刪除。但目前的POP3郵件服務器大均可以「只下載郵件,服務器端並不刪除」,也就是改進的POP3協議。(來自百度百科)
協議簡介:IMAP
Internet Mail Access Protocol(交互式郵件存取協議)IMAP是斯坦福大學在1986年開發的研發的一種郵件獲取協議。它的主要做用是郵件客戶端(例如MS Outlook Express)能夠經過這種協議從郵件服務器上獲取郵件的信息,下載郵件等。當前的權威定義是RFC3501。IMAP協議運行在TCP/IP協議之上,使用的端口是143。它與POP3協議的主要區別是用戶能夠不用把全部的郵件所有下載,能夠經過客戶端直接對服務器上的郵件進行操做。
IMAP協議比較酷的功能是用戶能夠維護本身在服務器上的郵件目錄;能夠直接抓取郵件的特定部分(例如只有文本)。(來自百度百科)
IMAP的一個與POP3的區別是:IMAP它只下載郵件的主題,並非把全部的郵件內容都下載下來,而是你郵箱當中還保留着郵件的副本,沒有把你原郵箱中的郵件刪除,你用郵件客戶軟件閱讀郵件時才下載郵件的內容。較好支持這兩種協議的郵件客戶端有:ThunderMail,Foxmail,outlook等。(來自百度百科)
協議簡介:Mime
因爲SMTP這個協議開始是基於純ASCⅡ文本的,在二進制文件上處理得並很差。後來開發了用來編碼二進制文件的標準,如MIME,以使其經過SMTP來傳輸。今天,大多數SMTP服務器都支持8位MIME擴展,它使二進制文件的傳輸變得幾乎和純文本同樣簡單。(來自百度百科)
在.NET中如何實現:
在.NET中,已經有實現郵件發送的相關類,在System.Net.Mail命名空間下,有實現SMTP鏈接的SmtpClient類,還有封裝郵件信息的實體類MailMessage。咱們首先須要用給定的服務器地址和端口號實例化一個SmtpClient對象;
1:
2: SmtpClient smtp = new SmtpClient(smtpHost, smptPort);
3:smtp.Credentials = new NetworkCredential("test.qq.com", "test008");
而後定義一個MailMessage對象,MailMessage對象裏面包括了一封標準郵件所須要的全部信息,好比收件人,郵件主題,郵件內容等。你只須要對相關的屬性賦值便可,
1: MailMessage msg = new MailMessage(sender, receivers, title, content);
2: msg.BodyEncoding = Encoding.UTF8;
3: msg.SubjectEncoding = Encoding.UTF8;
4: msg.IsBodyHtml = true;
5: smtp.Send(msg);
6: msg.Dispose();
賦值完畢後,調用smtp.Send(msg);郵件便可發送出去。注意,若是有身份驗證的話,還須要輸入你的用戶名和密碼。msg.CC.Add(new MailAddress("test002qq.com"));這樣能夠增長抄送人;msg.Attachments.Add()能夠增長相應的附件。還有其餘一些用法參見文章最後的參考網址。
經常使用的郵件服務器地址:(如下數據來自網絡)
126郵箱 |
POP3服務器:pop.126.com |
163郵箱 |
POP3服務器:pop.163.com |
yahoo郵箱 |
注意:yahoo在foxmail 4.1以上的版本設置以下: |
POP3服務器:pop.mail.yahoo.com.cn |
Sohu郵箱 |
POP3服務器:pop3.sohu.com |
Gmail郵箱 |
第一步:要手動配置: POP3服務器是pop.gmail.com |
QQ郵箱 |
POP3服務器:pop.qq.com |
從上面你們能夠看出,通常的POP3郵件服務器地址爲pop而後加上本身的域名,SMTP郵件服務器地址爲smtp加上本身的域名。經常使用的郵件服務器地址均可以在網上找到。各大型郵箱smtp服務器及端口收集 。 |
遇到的問題:
當我用qq郵箱測試時,發現郵件並無發送成功。找了半天緣由,才發現原來是個人QQ郵箱的SMTP服務沒有啓用,若是你按照上面的代碼,也沒有發送成功,有可能也是這個緣由。咱們只須要進入本身的郵箱,把這個服務啓用便可。
首先登陸QQ郵箱,選擇「郵箱設置」的「帳戶」一欄
而後往下瀏覽到「POP3/IMAP/SMTP/Exchange服務」這個地方,打上對勾便可。
有沒有發現上面的單詞那麼熟悉,就是上面討論的幾種協議,如今發現理解是否是更容易了。QQ郵箱作得比較好,若是你尚未理解這些協議的意思,你能夠點擊後面的超連接,裏面有更詳細的解釋。
配置用戶代理:
若是你理解了上面的內容,配置用戶代理將是一件很是容易的事情。這裏以FoxMail爲例,解釋一個地方就能夠了,就是設置郵件服務器。(截圖來自QQ郵箱裏面的「幫助」)
上面的接收服務器類型,你能夠選擇POP3,也能夠選擇IMAP,選擇了什麼類型的,下面的地址中就應該輸入這個類型的郵件服務器地址。最下面的是發送郵件服務器,這個沒得選,非要寫SMTP郵件服務器的地址。對於其餘設置,你徹底能夠登陸進入QQ郵箱,裏面的幫助說的很是詳細,並且網上也有許多配置用戶代理的資料,能夠參考。
總結
上面的就是郵件發送的一些基本知識,大部份內容網上都有,我這裏只是把它串起來,但願對你們有幫助,若是有任何錯誤,請指正。還有一點要說明的是,.NET中封裝的「太好」了,徹底對咱們屏蔽了實現的具體細節,若是想深刻研究,徹底能夠本身寫一個發送郵件的類,實現SMTP通訊,而不使用.NET中的SMTPClient類,若是你們有興趣,能夠繼續研究。