郵箱服務器: stmp.aliyun.com 端口: 25
通過 SMTP 協議發送郵件的整體過程如下:
- 客戶端使用 telnet 命令連接到SMTP服務器,建立會話。
- 客戶端發送一個 HELO 或 EHLO 命令。
- 客戶端發送一個 AUTH 認證命令進行用戶登錄(使用 smtpd 方式)。
- 客戶端發送一個 MAIL 命令指定發件人。
- 客戶端發送一個 RCPT 命令指定收件人。
- 客戶端發送一個 DATA 命令准備輸入郵件正文。
- 客戶端發送一個 . 命令(點命令)表示 DATA 命令結束。
- 客戶端發送一個 QUIT 命令結束會話。
一封普通的文本郵件的信息包含一個頭部分(例如:From、To、Subject 等等)和一個體部分。
體部分通常為單體類型(例如:text、image、audio、video、application 等等)或是復合類型(即:multipart)。
頭部分和體部分之間用一個空行進行分隔,並且體部分的類型由信頭內容類型字段 Content-Type 描述。
信頭部分:
| 域名 | 含義 |
|---|---|
| Received | 傳輸路徑 |
| Return-Path | 回復地址 |
| Delivered-To | 發送地址 |
| Reply-To | 回復地址 |
| From | 發件人地址 |
| To | 收件人地址 |
| Cc | 抄送地址 |
| Bcc | 暗送地址 |
| Date | 日期和時間 |
| Subject | 主題 |
| Message-ID | 消息 ID |
| MIME-Version | MIME 版本 |
| Content-Type | 內容的類型 |
| Content-Transfer-Encoding | 內容的傳輸編碼方式 |
相關指令:

實例:
發件人: hello@aliyun.com
收件人: a1@163.com、q1@qq.com
轉發: q2@qq.com
密送: q3@qq.com
標題: 終端使用telent發送郵件
正文: 你好telnet,你好python
在linux中可以使用echo -n Content|base64 對指定內容進行 base64 編碼
[hupeng@hupeng-vm:~]$telnet smtp.aliyun.com 25 Trying 140.205.94.10... Connected to smtp.aliyun.com. Escape character is '^]'. 220 smtp.aliyun.com MX AliMail Server(127.0.0.1) EHLO localhost # EHLO 開啟smtp會話,並向服務器提供客戶機主機名 250-smtp.aliyun.com 250-8BITMIME 250-AUTH=PLAIN LOGIN XALIOAUTH 250-AUTH PLAIN LOGIN XALIOAUTH 250-PIPELINING 250 DSN AUTH LOGIN # 開啟身份認證 334 dXNlcm5hbWU6 aGVsbG9AYWxpeXVuLmNvbQ== #base64編碼后的用戶名 334 UGFzc3dvcmQ6 5LiN5ZGK6K+J5L2g #base64編碼后的密碼 235 Authentication successful MAIL FROM: <hello@aliyun.com> # 發件人 , 郵件地址放在<>中 250 Mail Ok RCPT TO: <a1@163.com> # 收件人,如果有多個收件人要分開寫 250 Rcpt Ok RCPT TO: <q1@qq.com> # 收件人 250 Rcpt Ok RCPT TO: <q2@qq.com> # 收件人 250 Rcpt Ok RCPT TO: <q3@qq.com> # 收件人 250 Rcpt Ok DATA # 收件方把該命令之后的數據作為發送的數據 354 End data with <CR><LF>.<CR><LF> Content-Type: text/plain; charset="utf-8" # 指定編碼類型,防止中文亂碼 Content-Transfer-Encoding: base64 # 指定數據壓縮格式 From: hello@aliyun.com # 發件人 To: a1@163.com,q1@qq.com # 收件人,如果時多個收件人中間用逗號隔開 Cc: q2@qq.com # 抄送對象 Bcc: q3@qq.com # 暗送對象 Subject: =?utf-8?b?57uI56uv5L2/55SodGVsZW505Y+R6YCB6YKu5Lu2?= # 主題,如果utf-8編碼,並采用base64對數據壓縮,其格式為: =?utf-8?b?base64壓縮后的數據?=, 壓縮前數據為:終端使用telent發送郵件 5L2g5aW9dGVsbmV0LOS9oOWlvXB5dGhvbg== # 這里是正文,base64壓縮后的數據,壓縮前為: 你好telnet,你好python 注意: 正文與上面的Subject之前需要兩個換行(\r\n), 即空一行,而正文與下面的.也需要一個換行 . # .表示郵件數據結束 250 Data Ok: queued as freedom QUIT # 結束會話 221 Bye Connection closed by foreign host.
關於收件人、抄送、密送
抄送好比微博中的@即告知。職場中慣用的郵件抄送是用來告訴上級或者團隊,便於其他人對事情進度的知情,也是對自己工作進度的一種反饋。
密送好比私信。所有收件人、抄送人都無法獲知秘密收件人郵箱地址。即使秘密收件人本身,也無法獲取除自身以外的其他密送人信息。
重要:
- 發一次郵件,如果有N個人接收(N為收件人、抄送人、密送之和),就需要在N次RCPT TO。也就是說如果每少寫一次RCTP TO,就會有一個人接收人收不到郵件
- 在DATA里面寫的TO、CC、BCC等信息只起顯示作用,與實際接收人無關。
因此存在這樣的情況: A要發送郵件給B,C,同時抄送給D,密送給E ,假設是通過telnet 發送, RCTP TO了四次,但是在DATA中少寫了CC項即抄送項。由於DATA里的TO、CC、BCC等信息只起顯示作用。 實際D能收到郵件,但是因為郵件中只有接收人,缺少抄送人選項。因此你D會誤以為是A秘密給他發了郵件。
