8

我不是指SMTP/IMAP 客户端,我指的是可以接收和发送电子邮件的工作SMTP服务器。

有很多只侦听 SMTP 连接的部分PHPGo SMTP 服务器示例 - 没有显示如何发送邮件的示例吗?

我对学习简单邮件传输协议的后半部分非常感兴趣。我知道有很多与标准不同的不良服务器 - 但我想了解整个协议从头到尾是如何实现的。

4

5 回答 5

16

我认为您误解了 SMTP 应该如何工作。这是一个简化版本:

  1. 邮件用户代理 (MUA) 通过将邮件发送到邮件提交代理 (MSA) 来对邮件进行排队以进行传递。

  2. MSA 通过 SMTP 连接到邮件传输代理(“smtp 服务器”)。

  3. 然后 MTA 使用 DNS 查找收件人域的 MX 记录。然后它作为SMTP 客户端联系收件人的 MX 服务器。

  4. MX 服务器接受信封;然后它将其转发给邮件传递代理 (MDA)。

  5. 然后,MDA 将信封放入某个消息存储区,一些 IMAP 或 POP3 服务器在其中读取消息。然后 MUA 连接到这些服务器以检索消息。

整个过程使用三个主要命令。MAIL,RCPTDATA.

  • MAIL= 信封信息、退回地址等。
  • RCTP= 收件人。
  • DATA= 有效载荷。

SMTP 服务器做出响应——实际上很像 HTTP,带有错误代码,基于此,MTA 知道如何处理信封(它会被退回,因此发送适当的回复等)

在此过程中,没有“检索电子邮件”之类的东西(暂时忽略ETRN);因为 SMTP 纯粹用于电子邮件传输而不是检索。

于 2012-09-28T18:36:53.180 回答
3

我发现了一个用 PHP 编写的完整SMTP 服务器——甚至包括一个令人讨厌的开放中继。

$ sudo php php-smtp.php [ip-address] [port]
于 2012-09-28T22:28:49.223 回答
1

没有 SMTP 的“后半部分”,只有协议。如果您的 MUA 直接通过 TCP 与邮件服务器交互(而不是使用像大多数 Unix 上的/usr/bin/sendmail二进制文件这样的帮助程序),那么它使用 SMTP 协议。MTA 在投递邮件时使用相同的协议与其他 MTA 通信。视情况而定,它可能会使用更大的可用动词集。

查看 MTA 的 PHP 或 Go 实现的代码将向您展示一个人/团队如何实现SMTP 协议。

于 2012-09-30T12:50:57.187 回答
1

这是一个只处理邮件的 PHP smtpd 服务器 - https://github.com/flashmob/Guerrilla-SMTPd 和一个端口 https://github.com/flashmob/go-guerrilla

于 2013-08-29T23:32:50.670 回答
1

在 ReactPhp 之上有一个用 PHP 编写的非阻塞 SMTP 服务器:

https://bitbucket.org/david_garcia_garcia/smtpserver

它是为最终用户设计的,具有自定义身份验证和传递实现,其余的 SMTP 行为开箱即用。

于 2017-01-19T12:47:54.793 回答