標籤:style blog http io ar color os 使用 sp
最近在用outlook同步郵件。對郵件協議有一點興趣。於是就去收集了一些資料,學習了一下如何通過.net來實現郵件的收發。
一:SMTP協議
1.什麼是SMTP協議:
SMTP目前已是事實上的在Internet傳輸E-Mail的標準,是一個相對簡單的基於文本的協議。在其之上指定了一條訊息的一個或多個接收者(在大多數情況下被確定是存在的),然後訊息文本就傳輸了。可以很簡單地通過Telnet程式來測試一個SMTP伺服器,SMTP使用TCP連接埠25。要為一個給定的網域名稱決定一個SMTP伺服器,需要使用MX(Mail eXchange)DNS。(來自百度百科)
2.如何?:
為了實現SMTP協議,.net提供了MailMessage類,用於儲存郵件資訊(包括主題,寄件者地址,收件者地址,附件,包括郵件的格式[文本,HTML...]。SmtpClient類來實現協議串連。StmpClient提供了stmp 和port兩個參數,有關協議和連接埠號碼是可以再網上查詢到的。常用郵箱連接埠號碼: STMP預設25.實現代碼如下:
public static bool SendEmail() { try { MailMessage msg = new MailMessage(); msg.From = new MailAddress(fromEmailAddress); // 寄件者郵箱 msg.Subject = "來自小聰的郵件"; msg.Body = "今天吃飯了沒有呀,小強同學"; msg.BodyEncoding = System.Text.Encoding.Default; msg.To.Add(toEmailAddress); //收件者地址,可以添加多個 SmtpClient client = new SmtpClient(smtp, port); // smtp = "smtp.qq.com"; port=25 QQ郵箱 client.Credentials = new System.Net.NetworkCredential(msg.From.Address, password); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.Send(msg); } catch (Exception ex) { return false; } return true; }
二:POP3協議:
1.什麼是POP3協議:
郵局協議(Post Office Protocol,簡稱POP)是TCP/IP協議族中的一員,由RFC 1939 定義。本協議主要用於支援使用用戶端遠端管理在伺服器上的電子郵件。最新版本為POP3,全名“Post Office Protocol - Version 3”,而提供了SSL加密的POP3協議被稱為POP3S。(來自維基百科)
2.如何?:
要想實現郵件的操作。只需要遵守相應的命令協議即可。對於一般操作。需要先通過user 和pass的驗證。驗證成功後。方可執行後面的命令。
| 命令 |
描述 |
| user |
使用者名稱 |
| pass |
密碼,執行命令後可以擷取到郵件數量和郵件總位元組 |
| apop |
一種安全傳輸口令的辦法,digest是md5訊息摘要,執行成功導致狀態轉換 |
| stat |
請求伺服器發回關於郵箱的統計資料,如郵件總數和總位元組數 |
| uidl |
返回郵件的唯一識別碼,pop3會話的每個標識符都將是唯一的 |
| list |
返回郵件數量和每個郵件的大小 |
| retr |
返回由參數標識的郵件的全部文本,retr+5 表示返回前5封郵件的文本,但是返回回來的資訊是亂碼,需要轉碼 |
| dele |
伺服器將由參數標識的郵件標記為刪除,由quit命令執行 |
| rset |
伺服器將重設所有標記為刪除的郵件,用於撤消dele命令 |
| top |
伺服器將返回由參數標識的郵件前n行內容,n必須是正整數 |
| noop |
伺服器返回一個肯定的響應,不做任何操作。 |
| quit |
退出 |
如上面的命令為了更方便的理解,請看下面代碼: 對於每次的sr.Readline 如果擷取成功了。在讀取的字串裡面都會有一個"+OK",可以通過判斷字串是否包含OK,來確定是否命令操作成功(代碼中我忽略了). 其次對於RERT命令來說。返回的是亂碼。需要轉碼。這個會在後續的部落格更新。
NOTES: pop3連接埠號碼預設110,代碼的寬口好。帳號密碼,是存在了類的靜態變數。沒有展示出來。
public static void GetMessage() { TcpClient Server = new TcpClient(pop3,pop_port); //Tcp協議 NetworkStream netSream = Server.GetStream(); StreamReader sr = new StreamReader(netSream); byte[] byData; string data; try { string str = string.Empty; data = "USER " + fromEmailAddress+ "\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); Console.WriteLine(sr.ReadLine()); data = "PASS " + password + "\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); Console.WriteLine(sr.ReadLine());
data = "STAT" + "\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); Console.WriteLine(sr.ReadLine()); Console.WriteLine("連結成功..."); } catch (Exception ex) { Console.Write("連結的伺服器失敗..."); return; } try { data = "RETR " +5 +"\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); string emailData = string.Empty; string szTemp = sr.ReadLine(); if (szTemp[0] != ‘-‘) // 如果擷取有錯的話.伺服器會返回一個字串以"-"開頭 { while (szTemp != ".") { szTemp = sr.ReadLine(); emailData += szTemp; } Console.WriteLine(emailData); } else { Console.WriteLine(szTemp); } } catch (Exception ex) { Console.WriteLine("Get email 失敗"); } }
三.總結:部落格很多地方需要改進。裡面大部分都是借鑒的別人的代碼。以及其他部落格的文章。然後湊在一起的。希望博友對這方面瞭解多的。都給給自己的意見。3KU。
代碼Link:http://files.cnblogs.com/FourLeafCloverZc/SpongeBob.Email.Learn.zip
C#基礎--基於POP3協議的郵件接收和基於STMP的郵件發送