使用SMTP协议通过命令行发送邮件是一种灵活且高效的方式,尤其适用于自动化脚本、服务器监控通知或无需图形界面的场景,SMTP(Simple Mail Transfer Protocol)是电子邮件传输的标准协议,大多数邮件服务器都支持其命令交互,以下是详细的操作步骤、注意事项及实例说明。

准备工作
在开始之前,需要确保以下条件已满足:
- SMTP服务器信息:包括服务器地址(如smtp.gmail.com)、端口号(通常为587或465,后者需SSL加密)、用户名(通常是邮箱地址)和密码(部分服务商需使用应用专用密码而非账户密码)。
- 本地网络环境:确保能访问SMTP服务器,若防火墙或代理可能阻止连接,需提前配置。
- 工具选择:Windows系统可使用
telnet
(需启用)或OpenSSL
,Linux/macOS默认自带telnet
或nc
(netcat),推荐使用openssl
以支持加密连接。
基本操作步骤
建立加密连接
以Gmail为例,端口号587(STARTTLS)或465(SSL)是常见选择,使用openssl
建立SSL连接:
openssl s_client -connect smtp.gmail.com:465 -quiet
连接成功后,会显示SSL证书信息,进入交互式命令行界面。
发送SMTP命令
以下是核心SMTP命令及顺序,需严格按RFC 5321规范执行:

命令 | 参数示例 | 说明 |
---|---|---|
EHLO |
EHLO yourdomain.com |
向服务器标识发件人,启用扩展功能(如STARTTLS、AUTH) |
AUTH LOGIN |
无 | 请求登录认证,后续需Base64编码的用户名和密码 |
MAIL FROM |
MAIL FROM:<sender@example.com> |
指定发件人邮箱地址 |
RCPT TO |
RCPT TO:<recipient@example.com> |
指定收件人邮箱地址(可多次使用发送给多人) |
DATA |
无 | 进入邮件内容输入模式,以单独一行的结束内容 |
QUIT |
无 | 断开连接 |
格式
DATA命令后需按SMTP邮件格式编写内容,包括头部和正文。
From: "Sender Name" <sender@gmail.com>
To: recipient@example.com
Subject: Test Email via SMTP
Content-Type: text/plain; charset=UTF-8
This is the email body.
It can contain multiple lines.
.
注意:必须单独成行且顶格,表示邮件内容结束。
认证与安全
- Base64编码:用户名和密码需通过Base64编码(如
echo -n "user@gmail.com" | base64
)。 - STARTTLS:若服务器支持,在
EHLO
后使用STARTTLS
命令升级为加密连接,再进行认证。
完整实例(使用OpenSSL)
以Gmail为例,完整流程如下:
openssl s_client -connect smtp.gmail.com:465 -quiet EHLO yourdomain.com AUTH LOGIN (输入Base64编码的用户名) (输入Base64编码的密码) MAIL FROM:<sender@gmail.com> RCPT TO:<recipient@example.com> DATA From: Test <sender@gmail.com> To: recipient@example.com Subject: Command Line Test Hello, this is a test email. . QUIT
常见问题与注意事项
- 认证失败:检查用户名、密码是否正确,Gmail等服务商需启用“应用专用密码”。
- 连接超时:确认服务器地址、端口号正确,检查本地网络或防火墙设置。
- 邮件被拒收:发件人域名需正确配置SPF、DKIM记录,避免被标记为垃圾邮件。
- 编码问题:非ASCII字符需在头部指定
charset
(如UTF-8),并确保正文编码一致。
相关问答FAQs
Q1: 如何通过命令行发送带附件的邮件?
A: SMTP标准协议本身不支持附件,需通过MIME(Multipurpose Internet Mail Extensions)协议将附件编码为Base64,并添加Content-Type: multipart/mixed
头部,在DATA命令后添加:

Content-Type: multipart/mixed; boundary="BOUNDARY"
--BOUNDARY
Content-Type: text/plain
Hello, this is the body.
--BOUNDARY
Content-Type: application/pdf; name="file.pdf"
Content-Transfer-Encoding: base64
(此处粘贴Base64编码的附件内容)
--BOUNDARY--
实际操作中建议使用swaks
或mutt
等工具简化流程。
Q2: 为什么使用telnet
连接SMTP服务器时提示“Could not open connection”?
A: 可能原因包括:1)未安装或启用telnet
客户端(Windows需通过“启用或关闭Windows功能”安装);2)SMTP服务器地址或端口号错误;3)本地网络被防火墙或代理拦截,可尝试使用openssl
或nc
替代,或检查网络连通性(如ping smtp.gmail.com
)。