邮箱服务器: 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秘密给他发了邮件。