今天來講本系列要介紹的最後一個 基本元件 (服務): Email
上篇在介紹 Notification 的時候有簡單提到 Email 溝通的 Protocol: SMTP, POP3, IMAP
雖然使用第三方寄信服務如 SendGrid 和 Amazon SES 可以省下很多開發成本與時間
但還是可以了解一下自己架設 Email 服務會遇到哪些問題, 以及如何解決
先介紹一下常見的三種 Protocols 和 Webmail
Simple Mail Transfer Protocol (SMTP) 如其名稱, 是用來 "發送信件" 的 Protocol
Port 根據連線類型分為 25, 587 (TLS) 和 465 (SSL)
由信件抬頭 (Header) 和 信件內容組成 (Body)
信件抬頭又分為 Envelop Header 和 Message Header
前者是用來讓 SMTP 伺服器 發送郵件到指定的地址, 包含 "MAIL FROM" (寄件人) 和 "RCPT TO" (收件人)
由於電子郵件地址都會帶有域名 (Domain Name), 此域名代表的是 SMTP 伺服器 的位置
所以需要透過 DNS (Domain Name Service) 來查找 IP 位置 (可以把 Domain Name 想成是 地址, IP 想成是 經緯度)
具體是根據 電子郵件交換紀錄 (MX Record, or Mail Exchange Record) 找到 SMTP 伺服器 名稱後, 查詢其 IP 位置
比如我們可以用 nslookup
指令來查找 gmail 的 SMTP 伺服器 的 郵件交換紀錄
$ nslookup
> set q=mx
> gmail.com
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
gmail.com mail exchanger = 20 alt2.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 30 alt3.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com.
從左至右分別是域名, 伺服器 接收信件的優先度 (數字越小, 優先度越高), 伺服器域名
收件人的 伺服器 收到信件後就會先存著, 等到 客戶端 下載信件
以上面 Gmail 的例子來說, 我如果從 erichung0404@mydomain.tw
寄信到 erichung0404@mgail.com
理論上就會是 gmail-smtp-in.l.google.com
這個 伺服器 收到, 若沒收到則依據 MX 優先度遞減
等到我登入 Gmail 後就能看到信件了~
Post Office Protocol version 3 (POP3) 是用來 "下載" 電子郵件的 Protocol
Port 是 110, 預設在下載電子郵件後會從 伺服器 刪除, 所以沒辦法讓多個 客戶端 存取, 除非修改預設值保留信件
缺點是當信件很大的時候如 大附件, 下載就需要比較久才能看到囧
Internet Message Access Protocol (IMAP) 也是電子郵件 "讀取" 的 Protocol
Port 是 143, 和 POP3 最大的差別是, IMAP "不會下載和刪除伺服器的信件", 所以支援多個客戶端讀取信件且共享狀態, 讚讚
並且可以只下載一部分信件內容, 就不會受到 大附件 拖累下載速度
最後, 雖然 Webmail 不是 Protocol, 但仍然是現代重要的元件, 像 Gmail, Yahoo Mail, Outlook.com 等等
透過瀏覽器讀取信件的都叫做 Webmail
和上述 Protocols 的差別在於, Webmail 是透過 API Service 來管理信件
Webmail 伺服器 會透過 POP3 或 IMAP Protocol 將信件讀取到 Webmail 伺服器, 再提供給 Webmail 客戶端, 也就是瀏覽器
好處是相較於傳統的 IMAP, POP3, IMAP 更好擴展, 且改用 API Service 後, 就可以用到上上篇介紹的一些技術來讀取信件了~