傳送郵件那些事

純潔的微笑發表於2018-01-29

郵件歷史

世界的第一封電子郵件

1969年10月世界上的第一封電子郵件是由電腦科學家Leonard K.教授發給他的同事的一條簡短訊息。

據《網際網路週刊》報導世界上的第一封電子郵件是由電腦科學家Leonard K.教授發給他的同事的一條簡短訊息(時間應該是1969年10月),這條訊息只有兩個字母:"LO"。Leonard K.教授因此被稱為電子郵件之父。所以第一條網上資訊就是‘LO’,意思是‘你好!’”

當然這個說法也有一點爭議,另外一種說法是麻省理工學院博士Ray Tomlinson傳送的第一封郵件,這裡不再展開討論。

中國的第一封電子郵件

1987年9月14日中國第一封電子郵件是由“德國網際網路之父”維納·措恩與王運豐在當時的兵器工業部下屬單位—計算機應用技術研究所(簡稱ICA)發往德國卡爾斯魯厄大學的,其內容為德文和英文雙語,第一段大意如下:

原文:“ Across the Great Wall we can reach every corner in the world. ”
中文大意:“ 越過長城,我們可以到達世界的每一個角落。 ”

這是中國通過北京與德國卡爾斯魯厄大學之間的網路連線,發出的第一封電子郵件。現在看這封郵件內容,頗具深意呀!

電子郵件的發展

雖然電子郵件是在70年代發明的,它卻是在80年才開始有人用,70年代的沉寂主要是由於當時使用Arpanet網路的人太少,網路的速度也僅為目前56Kbps標準速度的二十分之一。受網路速度的限制,那時的使用者只能傳送些簡短的資訊,根本別想象現在那樣傳送大量照片。

到80年代中期,個人電腦興起,電子郵件開始在電腦迷以及大學生中廣泛傳播開來;到90年代中期,網際網路瀏覽器誕生,全球網民人數激增,電子郵件被廣為使用。2000零幾年的時候,那時候沒有網盤,上大學的時候常常使用郵箱儲存東西,那時候的郵箱也主要以網易為主;到了現在,幾乎每個人都有好幾個郵箱,QQ郵箱、126郵箱、公司郵箱。

郵件協議

傳送郵件的本質是將一個人的資訊傳輸給另外一個人,那麼如何傳輸就需要商量好標準,這些標準就是協議。最初只有兩個協議:

SMTP協議

SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。它的一個重要特點是它能夠在傳送中接力傳送郵件,即郵件可以通過不同網路上的主機接力式傳送。

SMTP 認證,簡單地說就是要求必須在提供了賬戶名和密碼之後才可以登入 SMTP 伺服器,這就使得那些垃圾郵件的散播者無可乘之機。增加 SMTP 認證的目的是為了使使用者避免受到垃圾郵件的侵擾。

SMTP主要負責底層的郵件系統如何將郵件從一臺機器傳至另外一臺機器。

POP3協議

POP3是Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將個人計算機連線到Internet的郵件伺服器和下載電子郵件的電子協議。它是因特網電子郵件的第一個離線協議標準,POP3允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件。

POP 協議支援“離線”郵件處理。其具體過程是:郵件傳送到伺服器上,電子郵件客戶端呼叫郵件客戶機程式以連線伺服器,並下載所有未閱讀的電子郵件。這種離線訪問模式是一種儲存轉發服務,將郵件從郵件伺服器端送到個人終端機器上,一般是 PC機或 MAC。一旦郵件傳送到 PC 機或 MAC上,郵件伺服器上的郵件將會被刪除。但目前的POP3郵件伺服器大都可以“只下載郵件,伺服器端並不刪除”,也就是改進的POP3協議。

SMTP和POP3是最初的倆個協議,隨著郵件的不斷髮展後來又增加了兩個協議:

IMAP協議

全稱 Internet Mail Access Protocol(互動式郵件存取協議),IMAP是史丹佛大學在1986年開發的研發的一種郵件獲取協議,即互動式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。不同的是,開啟了IMAP後,在電子郵件客戶端收取的郵件仍然保留在伺服器上,同時在客戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應的動作。所以無論從瀏覽器登入郵箱或者客戶端軟體登入郵箱,看到的郵件以及狀態都是一致的。

IMAP的一個與POP3的區別是:IMAP它只下載郵件的主題,並不是把所有的郵件內容都下載下來,而是你郵箱當中還保留著郵件的副本,沒有把你原郵箱中的郵件刪除,你用郵件客戶軟體閱讀郵件時才下載郵件的內容。較好支援這兩種協議的郵件客戶端有:ThunderMail,Foxmail,outlook等。

Mime協議

由於SMTP這個協議開始是基於純ASCⅡ文字的,在二進位制檔案上處理得並不好。後來開發了用來編碼二進位制檔案的標準,如MIME,以使其通過SMTP來傳輸。今天,大多數SMTP伺服器都支援8位MIME擴充套件,它使二進位制檔案的傳輸變得幾乎和純文字一樣簡單。

郵件傳送流程

傳送郵件那些事

  • 發信人在使用者代理上編輯郵件,並寫清楚收件人的郵箱地址;
  • 使用者代理根據發信人編輯的資訊,生成一封符合郵件格式的郵件;
  • 使用者代理把郵件傳送到發信人的的郵件伺服器上,郵件伺服器上面有一個緩衝佇列,傳送到郵件伺服器上面的郵件都會加入到緩衝佇列中,等待郵件伺服器上的SMTP客戶端進行傳送;
  • 發信人的郵件伺服器使用SMTP協議把這封郵件傳送到收件人的郵件伺服器上
  • 收件人的郵件伺服器收到郵件後,把這封郵件放到收件人在這個伺服器上的信箱中;
  • 收件人使用使用者代理來收取郵件。首先使用者代理使用POP3協議來連線收件人所在的郵件伺服器,身份驗證成功後,使用者代理就可以把郵件伺服器上面的收件人郵箱裡面的郵件讀取出來,並展示給收件人。

Java和郵件

JavaMail

最早期使用Java Mail進行傳送郵件

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail{
   public static void main(String [] args){   
      // 收件人電子郵箱
      String to = "ityouknow@gmail.com";
      // 發件人電子郵箱
      String from = "webMail@gmail.com";
      // 指定傳送郵件的主機為 localhost
      String host = "localhost";
      // 獲取系統屬性
      Properties properties = System.getProperties();
      // 設定郵件伺服器
      properties.setProperty("mail.smtp.host", host);
      // 獲取預設session物件
      Session session = Session.getDefaultInstance(properties);
      try{
         // 建立預設的 MimeMessage 物件
         MimeMessage message = new MimeMessage(session);
         // Set From: 頭部頭欄位
         message.setFrom(new InternetAddress(from));
         // Set To: 頭部頭欄位
         message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
         // Set Subject: 頭部頭欄位
         message.setSubject("This is the Subject Line!");
         // 設定訊息體
         message.setText("This is actual message");
         // 傳送訊息
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

在後來有了Spring,一切變的更簡單

Spring Mail

public void simpleSend() {
    // 構建簡單郵件物件,見名知意
    SimpleMailMessage smm = new SimpleMailMessage();
    // 設定郵件引數
    smm.setFrom(mailSender.getUsername());
    smm.setTo("ityouknow@126.com");
    smm.setSubject("Hello world");
    smm.setText("Hello world via spring mail sender");
    // 傳送郵件
    mailSender.send(smm);
}

貌似幾句就搞定了,可以看出Spring的力量還是很強大的。

Spring Boot And Mail

再到了後來,Spring Boot就出現了,更加簡單了郵件傳送的步驟,想了解如何使用Spring Boot傳送郵件看這裡:springboot(十):郵件服務

參考:

郵件傳送的原理

相關文章