CMD命令行调用远程服务器SMTP和POP3服务收发电子邮件


前言

上一篇文章中我搭建了一个简单的Apache James电子邮箱服务器,使用的客户端是foxmail,foxmail图形化界面的客户端确实便于操作,但无法使用脚本操作,很多事情就做不了,因而作者又去翻了翻SMTP服务和POP3服务的指令,实现了使用命令行收发邮件,记录一下。

一、SMTP发送邮件

调用SMTP服务我们需要用到telnet指令连接,telnet是一个比较老的远程登录网络协议。作者这里使用远程Windows11主机的CMD命令行连接云服务器的电子邮箱服务,因此需要提前开启Windows上面的telnet客户端。telnet客户端的开启方法是通过win+r运行OptionalFeatures这一指令打开Windows功能界面,在该界面中勾选Telnet Client功能,点击确定后根据提示重启即可。
windows telnet功能启用

  • 通常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调用函数啥的。而且还是那句话,限于作者的水平,本文可能有些细节还不到位,甚至可能存在一些错误,希望大家批评指正,感谢感谢。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值