郵件發送和接收原理以及smtp和pop3和imap協議


一、 郵件開發涉及到的一些基本概念

1.1、郵件服務器和電子郵箱

  要在Internet上提供電子郵件功能,必須有專門的電子郵件服務器。例如現在Internet很多提供郵件服務的廠商:sina、sohu、163等等他們都有自己的郵件服務器。

  這些郵件服務器類似於現實生活中的郵局,它主要負責接收用戶投遞過來的郵件,並把郵件投遞到郵件接收者的電子郵箱中。

  電子郵箱(E-Mail地址)的獲得需要在郵件服務器上進行申請,確切地說,電子郵箱其實就是用戶在郵件服務器上申請的一個賬戶,用戶在郵件服務器上申請了一個帳號后,郵件服務器就會為這個賬號分配一定的空間,用戶從而可以使用這個帳號以及空間發送電子郵件和保存別人發送過來的電子郵件。

1.2、郵件傳輸協議

1.2.1、SMTP協議

  用戶連接上郵件服務器之后,要想給它發送一封電子郵件,需要遵循一定的通訊規則,SMTP協議就是用來定義這種通訊規則的。因此,我們通常也把處理用戶smtp請求(郵件發送請求)的服務器稱之為SMTP服務器(郵件發送服務器)。

1.2.2、POP3協議

  同樣,用戶若想從郵件服務器管理的電子郵箱當中接收一封電子郵件話,它連上郵件服務器后,也要遵循一定的通訊格式,POP3協議就是用來定義這種通訊格式的。因此,我們通常也把處理用戶pop3請求(郵件接收請求)的服務器稱之為POP3服務器(郵件接收服務器)。

1.3、電子郵件的發送和接收過程

  通過一張圖來說明一封郵件的發送和接收過程,如下圖所示:

  

  簡單說一下這個郵件收發過程:

  1、xdp@sohu.com 用戶寫好一封Email發送到sohu的Smtp服務器。對應於上圖的步驟①

  2、sohu的Smtp服務器開始處理xdp@sohu.com 用戶的請求,它會根據收件人的地址判斷,當前收件人是不是自己管轄的用戶,如果是,就直接將Email存放到為該收件人的分配的郵箱空間當中。sohu的Smtp服務器判斷收件人地址發現,這一封Email的收件人gacl@sina.com 是Sina的郵件服務器管理的,於是又將Email轉發給Sina的Smtp服務器。對應於上圖的步驟②

  3、Sina的Smtp服務器開始處理sohu的Smtp服務器發送過來的Email,Sina的Smtp服務器根據收件人的地址判斷,發現收件人自己管轄的用戶,於是就直接將Email存放到為gacl@sina.com 用戶的分配的郵箱空間當中。對應於上圖的步驟③。

  4、xdp@sohu.com 用戶將郵件發出去之后,就通知gacl@sina.com 用戶去收取。gacl@sina.com 用戶於是就連接上Sina的POP3服務器收取郵件,對應於上圖的步驟④。

  5、POP3服務器從gacl@sina.com 用戶的郵箱空間當中取出Email,對應於步驟⑤。

  6、POP3服務器將取出來的Email發給gacl@sina.com 用戶,對應於步驟⑥。

二、使用Smtp協議發送郵件

2.1、Smtp協議講解

  使用smtp協議發送郵件給郵件服務器時規定了要做以下幾件事

  1、使用"ehlo"命令和連接上的smtp服務器打聲招呼,例如:

     ehlo gacl

  2、使用"auth login"命令登錄到Smtp服務器,登錄使用的用戶名和密碼必須經過Base64加密,例如:   

    ①、輸入命令:auth login  

    ②、輸入使用Base64加密過后的用戶名:Z2FjbA==  

    ③、輸入Base64加密過后的密碼:MTIzNDU2

  3、指明郵件的發件人和收件人

    mail from:<gacl@sohu.com>

    rcpt to:<xdp_gacl@sina.cn>

   4、編寫要發送的郵件內容,郵件的編寫格式是有一定的規則的,一封格式良好的郵件應該包含郵件頭和郵件的主體內容。

    郵件頭使用下面的三個字段來指明

    1. from字段用於指明郵件的發送人
    2. to字段用於指明郵件的收件人
    3. subject字段用於指明郵件的主題

    郵件的內容包含了這些信息之后才是一封格式良好的郵件。

    ①、輸入"data"命令

      data

    ②、編寫郵件內容

      from:<gacl@sohu.com>    ----郵件頭

      to:<xdp_gacl@sina.cn>     ----郵件頭

      subject:hello          ----郵件頭

                      -----空行

      hello gacl            ----郵件的具體內容

  5、輸入一個.告訴郵件服務器郵件內容已經寫完了

    .

  6、輸入quit命令斷開與郵件服務器的連接

    quit

  以上的6個步驟就是Smtp協議規定的發送一封Email必須要做的事情。

2.2、使用Smtp協議手工發送郵件

  在對Smtp協議有一定的了解之后,我們就可以使用Smtp協議來發送郵件了。下面演示一下使用Telnet客戶端連接上搜狐的郵件服務器然后發一封Email到新浪的郵箱中去

  為了能夠對Smtp協議有一個直觀的認識,這里我們不借助任何第三方郵件客戶端工具,而是使用最原始的的Telnet客戶端來完成郵件的發送過程,Telnet是一個Window自帶的網絡客戶端程序,通過它可以連接上互聯網上面的任意一台主機。

  使用telnet客戶端連接到搜狐的smtp服務器,如下圖所示:

  

  通過telnet客戶端發Email,如下圖所示:

   

  我們登錄到<xdp_gacl@sina.cn>郵箱當中,就可以收取到由<gacl@sohu.com>發送的Email了,如下圖所示:

  

  這就是使用Smtp協議發送郵件的過程。

三、使用POP3協議接收郵件

3.1、POP3協議講解

  POP3協議規定了收取郵件時要做以下幾件事

①、輸入用戶名和密碼登錄到POP3服務器,用戶名和密碼不需要經過Base64加密

  user username --登錄郵箱的用戶名
  pass password --登錄郵箱使用的密碼

②、使用retr命令收取郵件
  retr 數字 收取郵件,retr 1表示收取郵箱當中的第一封郵件,這是POP3協議里面最重要的一個命令。

  在使用retr命令收取郵件之前,可以使用如下的兩個命令查看一下郵箱里面的郵件的一些相關信息。

  stat

    返回郵箱里面的郵件數量以及郵件占用的空間大小信息
  list 數字

    返回某一封郵件的統計信息

③、郵件收取完成之后使用quit命令斷開與POP3服務器的連接。
  quit 斷開與POP3服務器的連接

3.2、使用POP3協議手工接收郵件

  收取郵件我們也不借助任何第三方客戶端工具,而是使用Telnet客戶端連接到POP3服務器進行收取。

  例如:現在我的搜狐郵箱當中有這樣的一封郵件,如下圖所示:

  

  現在我們不用使用foxmail或者outLook這樣的客戶端工具去收取,而是使用Telnet客戶端連接到搜狐的POP3服務器去手工收取。

  1、使用Telnet連接上搜狐的POP3服務器,使用命令:telnet pop3.sohu.com 110,如下圖所示:

  

  根據POP3協議規定的郵件收取步驟來收取郵件。如下圖所示:

  

  可以看到,我們POP3協議純手工從搜狐的POP3服務器當中收取回來了一封Email,Email里面的內容都經過了Base64編碼處理,下面我們寫一個小程序將經過Base64編碼后的郵件內容進行解碼,還原回郵件的內容,代碼如下:

復制代碼
復制代碼
 1 package me.gacl.encrypt;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 
 7 import sun.misc.BASE64Decoder;
 8 import sun.misc.BASE64Encoder;
 9 
10 public class Base64Encrypt {
11 
12     public static void main(String args[]) throws IOException{
13         /*System.out.print("請輸入用戶名:");
14         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
15         String userName = in.readLine();
16         System.out.print("請輸入密碼:");
17         String password = in.readLine();
18         BASE64Encoder encoder = new BASE64Encoder();
19         System.out.println("編碼后的用戶名為:" + encoder.encode(userName.getBytes()));
20         System.out.println("編碼后的密碼為:" + encoder.encode(password.getBytes()));*/
21         
22         BASE64Decoder decoder = new BASE64Decoder();
23         //郵件主題的Base64編碼
24         String emailSubject = "=?GBK?B?08q8/rLiytQ=?=";
25         //郵件文本內容的Base64編碼
26         String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E=";
27         //帶html標簽和郵件內容的Base64編碼
28         String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+";
29         //將使用Base64編碼過后的文本內容再使用Base64來解碼
30         emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK");
31         emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK");
32         emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK");
33         System.out.println("郵件標題:"+emailSubject);
34         System.out.println("郵件內容:"+emailPlainContent);
35         System.out.println("帶html標簽的郵件內容:"+emailHtmlContent);
36     }
37 }
復制代碼
復制代碼

  運行結果如下:
  

  這就是使用POP3協議收取郵件的過程。

  以上就是郵件的發送與接收原理的相關內容,這一篇文章主要是介紹郵件發送和接收過程中使用到的smtp協議和pop3協議。沒有涉及到太多代碼方面的東西,后面會具體介紹使用JavaMail來進行郵件發送。

 

原文連接:https://www.cnblogs.com/panxuejun/p/10094152.html

 

IMAP(Internet Message Access Protocol,因特網郵件讀取協議)是一個應用層協議,用來從本地郵件客戶端訪問遠程服務器上的郵件。

測試代碼下載

 

IMAP和POP3是郵件訪問最為普遍的Internet標准協議。事實上絕大多數現代的郵件客戶端和服務器都對兩者給予支持。IMAP現在的版本是"IMAP第四版第一次修訂版"(IMAP4rev1),在RFC3501中定義。

相對於POP3,IMAP提供了一些重要的功能:

1、支持連接和斷開兩種操作模式。

2、支持多個客戶同時連接到一個郵箱。

3、支持訪問消息中的MIME部分和部分獲取。

4、支持在服務器保留消息狀態信息。

5、支持在服務器上訪問多個郵箱。

6、支持服務器端搜索。

7、支持一個定義良好的擴展機制。

 

不像大多數舊的Internet協議,IMAP4原生支持加密注冊機制。IMAP4中也支持明文傳輸密碼。因為加密機制的使用需要客戶端和服務器雙方的一致,明文密碼的使用是在在一些客戶端和服務器類型不同的情況下(例如Microsoft Windows客戶端和非Windows服務器)。使用SSL也可以對IMAP4的通信進行加密,通過將在SSL上的IMAP4通信通過993端口傳輸或者在IMAP4線程創建的時候聲明 " " "、"STARTTLS"。

IMAP4使用端口143在TCP/IP連接上工作。

.NET 框架中沒有封裝IMAP的相關操作,故繼續使用第三方組件LumiSoft.Net。

LumiSoft.Net是一個開源的組件,實現了很多協議,源代碼是學習網絡協議的不錯的參考資料。

 

 

測試代碼:

 

復制代碼
        private static void fnIMAPDemo()
        {
            IMAP_Client client = new IMAP_Client();
            FileStream log = new FileStream(@"C:\log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(log);

            try
            {
                //連接郵件服務器通過傳入郵件服務器地址和用於IMAP協議的端口號
                client.Connect("imap.gmail.com", 993, true);
                client.Login("mymbrooks", "******");

                IMAP_Client_FetchHandler fetchHandler = new IMAP_Client_FetchHandler();
                fetchHandler.Rfc822 += new EventHandler<IMAP_Client_Fetch_Rfc822_EArgs>(delegate(object s, IMAP_Client_Fetch_Rfc822_EArgs e)
                {
                    MemoryStream storeStream = new MemoryStream();
                    e.Stream = storeStream;
                    e.StoringCompleted += new EventHandler(delegate(object s1, EventArgs e1)
                    {
                        storeStream.Position = 0;
                        Mail_Message mime = Mail_Message.ParseFromStream(storeStream);
                        sw.WriteLine(mime.BodyText);
                    });
                });

                //獲取郵件
                IMAP_SequenceSet seqSet = new IMAP_SequenceSet();
                seqSet.Parse("1:*");

                IMAP_r_u_List[] list = client.GetFolders(null);
                foreach (IMAP_r_u_List l in list)
                {
                    client.SelectFolder(l.FolderName);

                    client.Fetch(
                            true,
                            seqSet,
                            new IMAP_Fetch_DataItem[]{
                                new IMAP_Fetch_DataItem_Rfc822()
                                            },
                            fetchHandler
                        );
                }
            }
            catch
            {

            }
            finally
            {
                sw.Flush();
                sw.Close();
                log.Close();
            }
        }
復制代碼

 

 

我將Gmail中的郵件寫入到了C:\log.txt文件里:

 

hMail Server 配置

hMail Server 是Windows下的一款免費郵件服務器,支持SMTP、POP3、IMAP協議,官方主頁:http://www.hmailserver.com/

我使用的是最新測試版:hMailServer 5.3.4 - 1913

支持SQL Server、MySQL、PgSQL數據庫,安裝時需要注意一下,SQL Server很簡單,若使用的MySQL,需要將MySQL x86 lib目錄下的一個dll復制過去,PgSQL 我在Windows Server 2008 R2 SP1上無法安裝成功,有點bug。

首先添加一個domain:

 

由於只是測試,我使用了127.0.0.1,添加了兩個測試賬戶:user1@127.0.0.1、user2@127.0.0.1。

配置一下 SMTP、POP3、IMAP協議:

 

其他選項默認即可,可擴展性很強,可以配置訪問規則、DNS、反病毒、日志等,功能很強大。結合DNS服務器完全可以當做一個小型的企業級郵件服務器使用。

 

配置好了服務端,下面配置一下客戶端,我用的ThunderBird:

 

將剛才設置的user1、user2添加進來:

 

發送郵件試試:

 

可以看到,順利收到了郵件:

 

小結:

IMAP是目前獲取郵件的事實上的標准,絕大多數郵件服務提供商均支持加密的IMAP服務,建議在工作生活中使用IMAP(SSL、TLS)來收取郵件。LumiSoft.Net提供了大量封裝好的組件,很有研究價值,有興趣的朋友可以深入研究。最后簡單介紹了下hMail Server的安裝與配置,在Windows下可以快速的搭建一個小型的企業級郵件服務器,給很多中小企業帶來了福音。

 

原文連接:https://www.cnblogs.com/brooks-dotnet/archive/2011/03/20/1989463.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM