菜鸟科技网

smtp命令行如何发邮件?

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

smtp命令行如何发邮件?-图1
(图片来源网络,侵删)

准备工作

在开始之前,需要确保以下条件已满足:

  1. SMTP服务器信息:包括服务器地址(如smtp.gmail.com)、端口号(通常为587或465,后者需SSL加密)、用户名(通常是邮箱地址)和密码(部分服务商需使用应用专用密码而非账户密码)。
  2. 本地网络环境:确保能访问SMTP服务器,若防火墙或代理可能阻止连接,需提前配置。
  3. 工具选择:Windows系统可使用telnet(需启用)或OpenSSL,Linux/macOS默认自带telnetnc(netcat),推荐使用openssl以支持加密连接。

基本操作步骤

建立加密连接

以Gmail为例,端口号587(STARTTLS)或465(SSL)是常见选择,使用openssl建立SSL连接:

openssl s_client -connect smtp.gmail.com:465 -quiet

连接成功后,会显示SSL证书信息,进入交互式命令行界面。

发送SMTP命令

以下是核心SMTP命令及顺序,需严格按RFC 5321规范执行:

smtp命令行如何发邮件?-图2
(图片来源网络,侵删)
命令 参数示例 说明
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

常见问题与注意事项

  1. 认证失败:检查用户名、密码是否正确,Gmail等服务商需启用“应用专用密码”。
  2. 连接超时:确认服务器地址、端口号正确,检查本地网络或防火墙设置。
  3. 邮件被拒收:发件人域名需正确配置SPF、DKIM记录,避免被标记为垃圾邮件。
  4. 编码问题:非ASCII字符需在头部指定charset(如UTF-8),并确保正文编码一致。

相关问答FAQs

Q1: 如何通过命令行发送带附件的邮件?
A: SMTP标准协议本身不支持附件,需通过MIME(Multipurpose Internet Mail Extensions)协议将附件编码为Base64,并添加Content-Type: multipart/mixed头部,在DATA命令后添加:

smtp命令行如何发邮件?-图3
(图片来源网络,侵删)
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--

实际操作中建议使用swaksmutt等工具简化流程。

Q2: 为什么使用telnet连接SMTP服务器时提示“Could not open connection”?
A: 可能原因包括:1)未安装或启用telnet客户端(Windows需通过“启用或关闭Windows功能”安装);2)SMTP服务器地址或端口号错误;3)本地网络被防火墙或代理拦截,可尝试使用opensslnc替代,或检查网络连通性(如ping smtp.gmail.com)。

分享:
扫描分享到社交APP
上一篇
下一篇