我不是指SMTP/IMAP 客户端,我指的是可以接收和发送电子邮件的工作SMTP服务器。
有很多只侦听 SMTP 连接的部分PHP和Go SMTP 服务器示例 - 没有显示如何发送邮件的示例吗?
我对学习简单邮件传输协议的后半部分非常感兴趣。我知道有很多与标准不同的不良服务器 - 但我想了解整个协议从头到尾是如何实现的。
我认为您误解了 SMTP 应该如何工作。这是一个简化版本:
邮件用户代理 (MUA) 通过将邮件发送到邮件提交代理 (MSA) 来对邮件进行排队以进行传递。
MSA 通过 SMTP 连接到邮件传输代理(“smtp 服务器”)。
然后 MTA 使用 DNS 查找收件人域的 MX 记录。然后它作为SMTP 客户端联系收件人的 MX 服务器。
MX 服务器接受信封;然后它将其转发给邮件传递代理 (MDA)。
然后,MDA 将信封放入某个消息存储区,一些 IMAP 或 POP3 服务器在其中读取消息。然后 MUA 连接到这些服务器以检索消息。
整个过程使用三个主要命令。MAIL
,RCPT
和DATA
.
MAIL
= 信封信息、退回地址等。RCTP
= 收件人。DATA
= 有效载荷。SMTP 服务器做出响应——实际上很像 HTTP,带有错误代码,基于此,MTA 知道如何处理信封(它会被退回,因此发送适当的回复等)
在此过程中,没有“检索电子邮件”之类的东西(暂时忽略ETRN
);因为 SMTP 纯粹用于电子邮件传输而不是检索。
我发现了一个用 PHP 编写的完整SMTP 服务器——甚至包括一个令人讨厌的开放中继。
$ sudo php php-smtp.php [ip-address] [port]
没有 SMTP 的“后半部分”,只有协议。如果您的 MUA 直接通过 TCP 与邮件服务器交互(而不是使用像大多数 Unix 上的/usr/bin/sendmail二进制文件这样的帮助程序),那么它使用 SMTP 协议。MTA 在投递邮件时使用相同的协议与其他 MTA 通信。视情况而定,它可能会使用更大的可用动词集。
查看 MTA 的 PHP 或 Go 实现的代码将向您展示一个人/团队如何实现SMTP 协议。
这是一个只处理邮件的 PHP smtpd 服务器 - https://github.com/flashmob/Guerrilla-SMTPd 和一个端口 https://github.com/flashmob/go-guerrilla
在 ReactPhp 之上有一个用 PHP 编写的非阻塞 SMTP 服务器:
https://bitbucket.org/david_garcia_garcia/smtpserver
它是为最终用户设计的,具有自定义身份验证和传递实现,其余的 SMTP 行为开箱即用。