通過telnet使用stmp協議發送郵件


郵箱服務器: stmp.aliyun.com  端口: 25

 

通過 SMTP 協議發送郵件的整體過程如下:

  1. 客戶端使用 telnet 命令連接到SMTP服務器,建立會話。
  2. 客戶端發送一個 HELO 或 EHLO 命令。
  3. 客戶端發送一個 AUTH 認證命令進行用戶登錄(使用 smtpd 方式)。
  4. 客戶端發送一個 MAIL 命令指定發件人。
  5. 客戶端發送一個 RCPT 命令指定收件人。
  6. 客戶端發送一個 DATA 命令准備輸入郵件正文。
  7. 客戶端發送一個 . 命令(點命令)表示 DATA 命令結束。
  8. 客戶端發送一個 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秘密給他發了郵件。

 

參考:

使用stmp發送郵件

如何通過 SMTP 方式發送帶附件的郵件?


免責聲明!

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



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