C和C#兩種方式實現郵件的簡單接收

来源:http://www.cnblogs.com/liubibi23/archive/2017/02/17/6410078.html
-Advertisement-
Play Games

本文的主要內容是通過兩種方式實現簡單郵件的接收,一種方式是通過C語言實現,另一種是通過C#實現的, 兩種方式在實現上有許多的不同之處,但是本質上都是一樣的. 一,C語言實現方式 C語言接收郵件的步驟: 1.創建TCP連接 埠:預設110 2.連接到Pop3伺服器 伺服器名稱:例如"pop3.163 ...


  本文的主要內容是通過兩種方式實現簡單郵件的接收,一種方式是通過C語言實現,另一種是通過C#實現的,

兩種方式在實現上有許多的不同之處,但是本質上都是一樣的.

一,C語言實現方式

C語言接收郵件的步驟:

1.創建TCP連接   埠:預設110

2.連接到Pop3伺服器 伺服器名稱:例如"pop3.163.com"   

3.認證登錄      用戶賬號,密碼

4.發送請求,接收服務端信息   send(...)  返回"+OK"  

   a.獲取郵箱中郵件的數量    "STAT\r\n" 返回"+OK 10 ..."  

   b.獲取每個郵件的大小      "LIST\r\n" 

   c.獲取指定郵件的前n行數據 "TOP [nMsg] [nLine]"        

                   nMsg:第nMsg封        

                   nLine:前nLine行

      d.獲取指定郵件信息內容    "RETR [nMsg]\r\n"  

實現代碼如下:

 

//創建TCP連接

1 if ((connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
2 {
3    return INVALID_SOCKET;
4 }

 

//連接到Pop3伺服器

 1 void ConnectToServer()
 2 {
 3     //設置SockAddr_In地址結構 
 4     SOCKADDR_IN serAddr;
 5     serAddr.sin_family = AF_INET;
 6     serAddr.sin_port = htons(POP3_PORT);/*POP3_PORT=110*/
7
//serverName="POP3.163.com";
8 serAddr.sin_addr.s_addr = inet_addr(serverName); 9 if (serAddr.sin_addr.s_addr == INADDR_NONE) 10 { 11 LPHOSTENT lphost; 12 lphost = gethostbyname(serverName); 13 if (lphost != NULL) 14 { 15 serAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->S_un.S_addr; 16 } 17 else 18 { 19 WSASetLastError(WSAEINVAL); 20 return; 21 } 22 //連接 23 connect(connection, (SOCKADDR *)&serAddr, sizeof(serAddr)) 24 return; 25 26 }

 

 //接收數據

//獲取郵箱中郵件的數量

 1 //獲取郵件的數量
 2 int GetNumEmail(SOCKET connection)
 3 {
 4   char sStat[10]={"STAT\r\n"};
 5   char response_buf[RESPONSE_BUFFER_SIZE]={0};
 6 
 7   send(connection,sStat,strlen(sStat),0);
 8   if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR )
 9       return -1;
10 
11   char szResponse[20]={0};
12   strncpy(szResponse,response_buf,3);
13   if( strcmp(szResponse,"+OK")==0 )    //返回正確的消息內容   "+OK 10..."
14       return GetNumFromBuf(response_buf);    
15   return 0;
16 }

 

//獲取每個郵件的大小

 1 //獲取每個郵件的大小
 2 BOOL GetList(SOCKET connection)
 3 {
 4    char szList[100]={0};
 5    sprintf(szList,"LIST\r\n");
 6 
 7    char response_buf[RESPONSE_BUFFER_SIZE]={0};
 8    send(connection,szList,strlen(szList),0);
 9    if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR )
10       return FALSE;
11 
12    printf("receive data:%s",response_buf);   //返回的數據
13   return TRUE;
14 }

 

//獲取指定郵件的前n行數據

 1 //獲取指定郵件的前n行數據
 2 BOOL GetTop(SOCKET connection,int nMsg,int nLine)
 3 {
 4   char szTop[100]={0};
 5   sprintf(szTop,"TOP %d %d\r\n",nMsg,nLine);
 6 
 7   char response_buf[RESPONSE_BUFFER_SIZE]={0};
 8   send(connection,szTop,strlen(szTop),0);
 9   Sleep(nLine*20);     //   延遲,等待數據完全接收完畢
10   if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR)
11       return    FALSE;
12 
13   printf("Receive Data:%s\n",response_buf);
14   return TRUE;
15 }


//獲取指定郵件的內容

 1 //獲取指定郵件的內容
 2 BOOL GetEmail(SOCKET connection,int nMsg,char *msg)
 3 {
 4   char sRetr[100]={0};
 5   sprintf(sRetr,"RETR %d\r\n",nMsg);
 6   
 7   char response_buf[RESPONSE_BUFFER_SIZE*10]={0};
 8   send(connection,sRetr,strlen(sRetr),0);
 9   Sleep(1000);     //必須添加延遲,以便能夠完整的接收數據
10   if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE*10,0) ==SOCKET_ERROR )
11       return FALSE;
12 
13   printf("Receive Data:%s\n",response_buf);
14   return TRUE;
15 }


 


一,C#實現方式

C#接收郵件的步驟:

1.需要引入第三方的類庫(OpenPop.dll 官網下載地址:http://sourceforge.net/projects/hpop/)   ,並且在項目中添加OpenPop的引用.

2.使用OpenPop.dll類庫中的Pop3Client類創建一個Pop3服務端的對象,   

   連接伺服器,併進行認證登錄.     host:pop3.163.com port:預設110

3.通過Pop3Client對象中的方法收取郵件信息.  

  a.GetMessageCount()                             //獲取郵件的數量  

  b.GetMessage(int messageNumber)      //獲取編號為messageNumber的郵件的內容        

  c.GetMessageSize(int messageNumber)   //獲取編號為messageNumber的郵件的大小

  d.DeleteMessage(int messageNumber)      //刪除編號為messageNumber的郵件(僅僅是標記,只有QUIT之後才真正刪除) 

  //...

4.關閉連接,釋放資源.

 

部分代碼如下:

//創建PopClient對象,連接認證

1 using( Pop3Client client=new Pop3Client() )
2 {
3    Client.Connect(host, Pop3_Port, false);
4 
5   //賬號,密碼,認證方式
6    Client.Authenticate(userAddr, password, AuthenticationMethod.Auto);  //登錄認證
7   //...
8 } 


//獲取郵箱中郵件的相關信息

1  //...
2   int count=client.GetMessageCount(); //獲取郵箱總數
3   int size=client.GetMessageSize(1);  //獲取編號為1的郵件的大小
4   OpenPop.Mime.Message msg=client.GetMessage(1);                    //獲取編號為1的郵件的內容
5   client.DeleteMessage(1);      //標記編號為1的郵件為"刪除" 
6 
7 //...    


//獲取郵件的頭部以及附件信息

 1 //...
 2   OpenPop.Mime.Message msg=client.GetMessage(1);
 3 
 4   //從msg中的Headers成員中獲取信息
 5  string from=msg.Headers.From.Address;
 6   string SendDate=msg.Headers.DateSent.ToLocalTime().ToString();
 7   string Subject=msg.Headers.Subject;
 8   string Body=msg.FindFirstPlainTextVersion().GetBodyText();
 9 
10   //獲取附件信息
11  List<MessagePart> attachments=msg.FindAllAttachments();
12  int attachCount=attachments.Count;
13  if( attachCount>0 )
14  {
15    string fileName=attachments[0].FileName;   //附件名稱
16 
17    //保存附件內容
18   using( FileStream fs=new FileStream(@"C:\01.txt",FileMode.OpenOrCreate) )
19    {
20       attachments[0].Save(fs);
21    }
22 }
23 //...

 

參考頁面:

http://www.yuanjiaocheng.net/CSharp/Csharp-if-else.html

http://www.yuanjiaocheng.net/CSharp/Csharp-ternary-operator.html

http://www.yuanjiaocheng.net/CSharp/Cshartp-switch.html

http://www.yuanjiaocheng.net/CSharp/Csharp-for-loop.html

http://www.yuanjiaocheng.net/CSharp/Csharp-while-loop.html

it學習資料


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 經過本周的努力,昨晚終於完成OSS.Social微信項目的標準庫支持,當前項目你已經可以同時在.net framework和.net core 中進行調用,調用方法也發生了部分變化,這裡我簡單分享下,主要包含下邊幾個部分: · 移植後的變化 · 和OSS.Common,OSS.Http關係 · 非同步 ...
  • #define aaa //放在代碼最前面 int a = 1; a = a + 1; #if !aaa {a = a + 1;}#elif !aaaaa {a=a+11;}#endif Console.WriteLine(a); Console.ReadKey(); 據說與版本有關 ,#undef ...
  • 為什麼叫T4?因為簡寫為4個T。 T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開始使用的代碼生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本塊和控制邏輯組成的混合模板,它可以生成文本文件。 ...
  • 在大型網站系統中,為了提高系統訪問性能,往往會把一些不經常變得內容發佈成靜態頁,比如商城的產品詳情頁,新聞詳情頁,這些信息一旦發佈後,變化的頻率不會很高,如果還採用動態輸出的方式進行處理的話,肯定會給伺服器造成很大的資源浪費。但是我們又不能針對這些內容都獨立製作靜態頁,所以我們可以在系統中利用偽靜態 ...
  • Static Using static using聲明允許直接調用靜態方法而不需要指定類名: C# 5 C# 6 Expression-Bodied Methods 使用expression-bodied methods,一個只有一句statement的函數可以使用lambda寫法。 C# 5 C# ...
  • 5.5 HTTP Cookies in ASP.NET Web API 5.5 ASP.NET Web API中的HTTP Cookie 本文引自:http://www.asp.net/web-api/overview/working-with-http/http-cookies By Mike W ...
  • EF雖然是一個晚生畸形的ORM框架,但功能強大又具有靈活性的,給了開發人員一定的發揮空間。因為微軟出發點總是好的,讓開發變得簡單,但實際上不是所有的事情都這麼理想。這裡順便推薦馬丁大叔的書《企業應架構模式》。 本節主要深入分析EF的分層問題,下麵是本節的已列出的要探討內容。 領域模型的概念 DbCo ...
  • 導航 閱讀本文之前,您也可以到Asp.Net Web API 2 系列導航進行查看 http://www.cnblogs.com/aehyok/p/3446289.html。 本文主要來講解以下內容: 〇、前言 Ⅰ、Using[FromUri] Ⅱ、Using[FromBody] Ⅲ、Type Co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...