前言
上一篇文章中我搭建了一个简单的Apache James电子邮箱服务器,使用的客户端是foxmail,foxmail图形化界面的客户端确实便于操作,但无法使用脚本操作,很多事情就做不了,因而作者又去翻了翻SMTP服务和POP3服务的指令,实现了使用命令行收发邮件,记录一下。
一、SMTP发送邮件
调用SMTP服务我们需要用到telnet指令连接,telnet是一个比较老的远程登录网络协议。作者这里使用远程Windows11主机的CMD命令行连接云服务器的电子邮箱服务,因此需要提前开启Windows上面的telnet客户端。telnet客户端的开启方法是通过win+r运行OptionalFeatures这一指令打开Windows功能界面,在该界面中勾选Telnet Client功能,点击确定后根据提示重启即可。

-
通常telnet使用的端口是23,但这里我们使用telnet连接smtp服务,所以应该指定连接目标主机的25号端口,这里云服务器的25端口应提前开放。
telnet 123.123.123.123 25连接成功回复220状态码,表示服务就绪。
220 mail.sample.com JAMES SMTP Server Server (JAMES SMTPServer ) ready -
连接成功后,需要发送问候指令确定发送方是否支持ESMTP,并标识发送方主机
HELO mail.sample.com 或 EHLO mail.sample.com回复250状态码表示连接正式建立,可以进行后续的操作。
250 mail.sample.com Hello mail.sample.com -
连接建立后,需要进行身份验证,此处需要依次输入邮箱账号和密码的base64加密后的密文,base64加密可以直接去百度一个在线加密器加密一下,验证成功后会回传235状态码。(这里334命令行是服务器回传的,解密过来是“334 Username:”和“334 Password:”)
auth login 334 VXNlcm5hbWU6 dXNlcjFAc2FtcGxlLmNvbQ== 334 UGFzc3dvcmQ6 MTIzNDU2enp6MTIzNDU2enp6 235 Authentication Successful -
接下来就可以进行邮件的发送了,首先指定邮件发送和接收账号,指定成功后会回传250.
mail from:<user1@sample.com> 250 2.1.0 Sender <user1@sample.com> OK rcpt to:<user2@sample.com> 250 2.1.5 Recipient <user2@sample.com> OK -
之后就可以撰写邮件内容了,smtp使用data指令开始邮件内容撰写,使用单独一行的“.”号结束邮件内容,邮件具体内容包含:
- 发送方字段(from:“发送方昵称”<发送方邮箱>)
- 接收方字段(to:“接收方昵称”<接收方邮箱>)
- 时间字段(date:RFC 5322时间格式)
- 主题字段(subject:主题内容)
- 空行
- 正文
- 结束符(.)
-
此处作者就不拓展到MIME协议了,在MIME协议中可包含更多字段,其中正文与前面的字段之间应该分隔一行,否则可能出现发出去的邮件看不到正文内容的情况。因而一个完整的邮件内容撰写操作如下:
data 354 Ok Send data ending with <CRLF>.<CRLF> from:"me"<user1@sample.com> to:"you"<user2@sample.com> Date:Sat, 16 Nov 2025 14:30:00 +0800 subject: test e-mail test content. . 250 2.6.0 Message received -
发送完成后服务器会返回250,我们可以从接收方邮箱里找到我们发送的邮件。

-
发送完邮件后如果长时间不操作,smtp服务器将自动关闭与客户端的连接,若想保持活跃,可以周期性的发送noop指令以保持服务器的连接。如果使用Apache James搭建的邮件服务器,可以在软件包目录下的conf/smtpserver.xml文件中修改字段以实现超时时间的自定义,默认超时时间为360s。
noop 250 2.0.0 OK -
发送完邮件后,可以使用quit指令断开与服务器之间的smtp连接。
quit 221 2.0.0 mail.sample.com Service closing transmission channel -
一些smtp服务器状态码含义:
| 状态码 | 含义 |
|---|---|
| 211 | 系统状态或显示系统帮助。 |
| 214 | 显示系统帮助,通常用于显示非标准命令的帮助。 |
| 220 | 服务就绪,表示服务器已准备好接收命令。 |
| 221 | 服务关闭传输通道,通常在响应QUIT命令后出现。 |
| 235 | 用户验证成功。 |
| 250 | 请求的邮件操作已完成,这是在MAIL FROM、RCPT TO等关键命令后最希望看到的成功响应。 |
| 251 | 用户非本地,将转发到指定路径。 |
| 334 | 等待用户输入验证信息(如用户名或密码)。 |
| 354 | 开始接收邮件内容输入,以单独一行的英文句点.结束输入。这是在发送DATA命令后服务器的典型响应。 |
| 421 | 服务不可用,正在关闭传输通道。可能由于服务器过载或维护,可以稍后重试。 |
| 450 | 请求的邮件操作未完成:邮箱不可用。可能因为对方邮箱忙、被临时禁用或IP被拒绝,可以稍后重试。 |
| 451 | 请求的操作中止:处理过程中出现本地错误。通常是服务器端临时性问题,如策略拒绝或资源不足,可以稍后重试。 |
| 452 | 请求的操作未执行:系统存储空间不足。可能由于发送邮件过多或收件人过多导致,可以稍后重试。 |
| 500 | 语法错误,无法识别的命令。可能是命令拼写错误或格式不正确。 |
| 501 | 参数或参数中存在语法错误。命令正确,但附带的参数(如邮箱地址格式)有问题。 |
| 502 | 命令未实现。该SMTP服务器不支持此命令。 |
| 503 | 错误的命令序列。表示命令的发送顺序不正确。 |
| 504 | 命令参数未实现。该SMTP服务器不支持此命令参数。 |
| 550 | 请求的操作未执行:邮箱不可用。最常见的硬退信原因之一,通常意味着收件人邮箱地址不存在。 |
| 551 | 用户非本地,请尝试指定的转发路径。收件人不在该服务器上,服务器建议尝试另一个地址。 |
| 552 | 请求的邮件操作中止:超出存储分配。表示收件人的邮箱已满,无法接收新邮件。 |
| 553 | 请求的操作未执行:邮箱名称不允许。通常是因为收件人地址格式不合法,或服务器被禁止向该域发送邮件。 |
| 554 | 事务失败。这是一个通用的失败响应,可能发生在初始握手或交易中途,原因可能包括您的IP被列入黑名单等。 |
二、POP3接收邮件
-
接收邮件依旧使用telnet连接POP3服务器,端口从25改为110端口,连接成功后,服务器会显示+OK状态。
telnet 123.123.123.123 110 +OK <e4sddadaw5e.17622223957@mail.sample.com> POP3 server (JAMES POP3 Server ) ready -
登录邮箱,分别使用 USER 和 PASS 指令输入用户账号和密码,成功登录后会返回+OK状态。
USER user1@sample.com +OK PASS 123456123456 +OK Welcome user1@sample.com -
使用STAT指令可以查看收件箱邮件数和占用容量,返回值依次为:状态(+OK),邮件数(8),占用容量(5402Byte)
STAT +OK 8 5402 -
使用LIST指令可以显示每件邮件编号和占用容量,邮件序号按照时间由先到后排列。
LIST +OK 8 5402 1 1609 2 541 3 512 4 544 5 560 6 549 7 546 8 541 . -
使用RETR指令可以查看指定序号的邮件。
retr 2 +OK Message follows Return-Path: <user1@sample.com> Date: Sun, 16 Nov 2025 18:17:36 +0800 (CST) Message-ID: <17183332302.6.1722388255423@localhost> MIME-Version: 1.0 X-UserIsAuth: true Delivered-To: user2@sample.com Received: from 123.123.123.123 (HELO mail.sample.com) ([123.123.123.123]) by mail.sample.com (JAMES SMTP Server ) with SMTP ID c0bcad09 for <user2@sample.com>; Sun, 16 Nov 2025 18:17:34 +0800 (CST) from:"me"<user1@sample.com> to:<user2@sample.com> Date: Sat, 16 Nov 2025 14:30:00 +0800 subject: test e-mail test content . -
断开连接依旧为QUIT指令
quit +OK Apache James POP3 Server signing off.
总结
以上面的方法为基础,就可以开始使用脚本收发邮件了。当然这仅是提供一种思路,像是C,Java,Python这些语言都有自己的SMTP和POP3调用函数啥的。而且还是那句话,限于作者的水平,本文可能有些细节还不到位,甚至可能存在一些错误,希望大家批评指正,感谢感谢。
9513

被折叠的 条评论
为什么被折叠?



