SMTP Commands with Telnet mailserver 25

SMTP Commands

下列是 Mail Client 用來與 Server 溝通的指令。這些指令沒有大小寫的區別(not case sensitive)。

HELO

 
 

啟始與 Mail Server 之間的對話。一般來說,HELO 是 Mail client 送出的第一個指令,用途是告訴 Mail Server 來者為何,通常我們會把電腦的 domain name 告訴 Server。例如:

Helo mail.companyName.com

MAIL FROM  
  告訴 Server 發信人是誰,例如:

MAIL FROM: google@yahoo.com

注意,這邊的發信人郵件地址並不會顯示在信件的寄件者欄中,當信件無法順利送到目的地時,退回的信件就會寄到這個地方。(寄件者欄、收件者欄、標題欄、副本、密件副本欄,這些是在 Message 的 Header 中指定的。有關 Mail Message 的格式,請參考 Email Service 投影片。)

RCPT TO  
  告訴 Server 收件人是誰,例如:

RCPT TO: yahoo@google.com

如果需要同時寄一封信給很多人,多下幾次 RCPT TO 指令即可。如果給的不是完整的 e-mail address,代表要寄信到該台 Mail Server 的指定信箱,例如:

RCPT TO: kimo

意思就是要寄信到連線中這台 Mail Server 的 kimo 這個信箱。有一點要注意的是,為了避免成為發垃圾信的工具,大部份 Mail Server 是不允許你透過它寄信到其它地方的,除非先經過身份的確認

DATA  
  告訴 Server 你已經準備好要開始輸入信件的本文了(Mail Message, 包括 Message Header 與 Message Body)。要結束 Message 的輸入時,在信件結尾輸入個 . 點符號即可。
NOOP  
  NOOP 是『NO OPeration 』的縮寫,用途是請 Server 回應一下,藉此讓 Client 得以確定與 Server 的連線還在。
QUIT  
  結束對話,關閉與 Server 間的連線。

SMTP Server Reply codes

每當 Mail Client 丟出一個指令,Server 這端就會回應一個固定格式的訊息:一個 3 位數的數字,然後緊接的一串文字描述,說明 Server 收到 client 端傳來的指令之後,Server 處理完後的情形,例如:

250 ok

或是

221 Bye bye

底下列出 Mail Server 回傳的各個代碼以及文字說明(只要下的 SMTP 指令正確,底下絕大部份的代碼應該都不會遇到的!):

221

 
  A system status or help reply
214  
  Help Message
220  
  The server is ready.
221  
  The server is ending the conversation.
250  
  The requested action was completed
251  
  The specified user is not local, but the server will forward the mail message
354  
  This is a reply to the DATA command. After getting this, start sending the body of the mail message, ending with "\r\n.\r\n."
421  
  The mail server will be shut down. Save the mail message and try again later
450  
  The mailbox that you are trying to reach is busy. Wait a little while and try again.
451  
  The requested action was not done. Some error occurmiles in the mail server
452  
  The requested action was not done. The mail server ran out of system storage.
500  
  The last command contained a syntax error or the command line was too long.
501  
  The parameters or arguments in the last command contained a syntax error.
502  
  The mail server has not implemented the last command.
503  
  The last command was sent out of sequence. For example, you might have sent DATA before sending RECV
504  
  One of the parameters of the last command has not been implemented by the server.
550  
  The mailbox that you are trying to reach can't be found or you don't have access rights.
551  
  The specified user is not local; part of the text of the message will contain a forwarding address.
552  
  The mailbox that you are trying to reach has run out of space. Store the message and try again tomorrow or in a few days-after the user gets a chance to delete some messages.
553  
  The mail address that you specified was not syntactically correct
554  
  The mail transaction has failed for unknown causes.

SMTP Authentication

由於 SMTP 協定極為簡單,任何人只要懂得 SMTP 指定,就有可能寫出自動發廣告信、垃圾信的程式。為了防堵這些日益氾濫的垃圾信件,後來就出現了加強版的 ESMTP 協定 (Enhanced SMTP ),支援 ESMTP 的 Mail Server 會對那些和它連線的 Mail Client 有較為嚴格的要求,在某些狀況下,例如要透過 Server 發信到其它地方,而非寄到本地的信箱時,限制他們必須先通過身份的驗證,才允許發信出去。(換句話說,如果你透過了身份的確認,要發信到什麼地方都是可以的!)

一般而言,現在網路上的 Mail Server 主要支援兩種驗證身份的方式: 1. 明碼驗證 和 2. base64 編碼驗證。

  1. 明碼驗證

明碼驗證指的是,當 Client 要跟 Server 進行身份驗證時,傳送的 username 和 password 不需要經過任何編碼,只要送給 Server 端 AUTH PLAIN 這個指令後,再直接將 username 和 password 傳給 Server 端,Server 就會進行身份的驗證。(註:大部份 Mail Server 甚至連明碼驗證都覺得不夠安全,因而捨棄這種方式只支援 base64 編碼驗證!)

  1. base64 編碼驗證

當 Client 端送出 AUTH LOGIN 這個指令到 Server 端時,代表著要使用 base64 編碼的身份驗證。此時 Client 端就必須先將 username 和 password 以 base64 演算法編碼之後,再傳送給 Server 端,Server 這端在拿到編碼字串後先做解碼然後再進行驗證。底下是個 base64 編碼驗證成功的範例畫面,畫面上的 username 和 password 已經使用 base64 演算法編碼過。:

你可以不用自己撰寫 base64 演算法,有一些網站提供了線上 base64 編碼的服務,例如:http://www.motobit.com/util/base64-decoder-encoder.asp。在 ActiveTcl 中,也有 base64 的套件可供使用,底下是個 base64 編碼的範例:

# Load base64 package
package require base64

# encode username "maa", you'll get "bWFh"
base64::encode maa

# encode password "12345", you'll get "MTIzNDU="
base64::
encode 12345

Read more

How to migrate Raspberry Pi 5 OS from micro SD to NVME m.2 SSD

首先我買了Raspberry Pi CM5後來買了Raspberry Pi CM5 I/O board來當個人電腦使用,系統是安裝在256GB SD卡上運行的很好。用久了在開啟較肥的程式像Web Browser或LiberOffice會有慢半拍的反應,而有了升級NVME m.2 SSD念頭。 因為Raspberry Pi 5支援的最快PCIe gen3 x 4就不去考慮快的Gen4 or Gen5 m.2 SSD。找了ADATA出的 LEGEND 710入門級的產品,會利用HMB(Host Memory Buffer)來加速I/O速度,因為是Raspberry Pi OS kernel會認不得而無法正常使用 事先在SD卡的/boot/firmware/cmdline.txt 加入 kernel command line參數如下,然後重開機m.

By Phillips Hsieh

How to document Home Lab and Network

運維機房和跨域的網路,會遇到各式需求與問題,用對工具才能分析問題,個人覺得最重要的是使用能處理問題的工具。 推薦目前想學和正在使用的平台與軟體,協助將公司/家用機房文件化 佈告欄任務管理 Focalboard 白板可管理任務指派 網路架構文件編寫 netbox 精細管理網路設備與連接線路 IP 資源管理 phpipam 專注網路IP分配 邏輯塊文件編寫 draw.io 視覺化概念圖 機房設備管理 ITDB 管理設備生命週期與使用者

By Phillips Hsieh

如何在Raspberry Pi4上安裝Proxmox for ARM64

第一步 準備好Raspberry Pi 4 / CM4 4GB RAM,這裡要留意CM4如果是買有內建eMMC storage會限制不能使用SD卡開機而限制本地空間容量,如果沒有NAS外接空間或使用USB開機的話,建議買CM4 Lite插上大容量SD卡 第二步 去Armbian官網下載最小化Debian bookworm image https://www.armbian.com/rpi4b/ Armbian 25.2.2 Bookworm Minimal / IOT 然後寫入SD/USB開機碟,寫入方法參考官方文件 https://github.com/raspberrypi/usbboot/blob/master/Readme.md Note: 官方提供的預先設定系統方法,可以在Armbian初次啟動自動化完成系統設定。連結在此 https://docs.armbian.com/User-Guide_Autoconfig/

By Phillips Hsieh

世界越快心越慢

在晚飯後的休息時間,我特別享受在客廳瀏灠youtube上各樣各式創作者的影音作品。很大不同於傳統媒體,節目多是針對大多數族群喜好挑選的,在youtube上我會依心情看無腦的動畫、一些旅拍記錄、新聞時事談論。 尤其在看了大量的Youtube的分享後,我真的感受到會限制我的是我的無知,特別是那些我想都沒想過的實際應用,在學習後大大幫助到我的生活和工作層面。 休息在家時,我喜歡想一些沒做過的菜,動手去設計生活和工作上的解決方案,自己是真的很難閒著沒事做。 如創作文章,陪養新的習慣都能感覺到成長的喜悅,是不同於吃喝玩樂的快樂的。 創作不去限制固定的形式,文字是創作、影像聲音也是創作,記錄生活也是創作,我想留下的就是創造—》實現—》回憶,這樣子的循環過程,在留下的足跡面看到自己一路上的成長、失敗、絕望、重新再來。 雖然大部份的時候去做這些創作也不明白有什麼特別的意義,但不去做也不會留下什麼,所以呀不如反事都去試試看,也許能有不一樣的水花也許有意想不到的結果,投資自己永遠不會是失敗的決定,不是嗎?先問問自己再開始計畫下一步,未來沒人說得準。 像最近看youtube仍大一群人在為DOS開

By Phillips Hsieh