【问题标题】:Are there any SMTP servers written in PHP or Go?是否有任何用 PHP 或 Go 编写的 SMTP 服务器?
【发布时间】:2012-09-20 15:26:30
【问题描述】:

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

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

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

【问题讨论】:

  • 与通过 SMTP 发送的 MUA 相比,哪些部分会丢失?
  • @IgnacioVazquez-Abrams,只要 MUA 也在侦听电子邮件(这使其成为服务器)。我只是对通过 SMTP 发送的工作原理仍然很模糊,我正在寻找 PHP 或 Go 中的示例实现。我所看到的几乎所有东西都是通过 SMTP 连接到 SMTP 服务器(如 gmail)的用户代理,然后 _________ 将电子邮件发送到实际目的地。
  • 您确定需要创建自己的服务器吗?为什么不使用 GNU 服务器,然后使用 php IMAP 例程编写自己的前端?
  • 如果它只是一个学习练习,请通读原始 RFC(我相信 RFC 821),它肯定会说明您必须编码的所有组件和事务。
  • @Dave well RFC 5321 与其当前的 RFC 更相关,并且包括 ESMTP 之类的内容。

标签: php email smtp go


【解决方案1】:

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

https://bitbucket.org/david_garcia_garcia/smtpserver

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

        整个过程使用三个主要命令。 MAILRCPTDATA

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

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

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

        【讨论】:

        • 因此,它实际上可以自己进行 MX 查找并连接到接收 MX 服务器(例如.com)并发送bob@example.com的SMTP有效负载?
        • 是的,当然——但通常有一个单独的进程(它不需要是传统意义上的程序)专门用于网络通信。这就是所谓的“MSA”。例如,sendmail 是一个 MSA。你告诉它“嘿,送这个”,它会处理剩下的事情。
        • 另外,请记住,大多数 ISP 现在阻止出站端口 25。因此,要发送邮件,您必须 (A) 使用 ISP 的 SMTP 服务器作为中继或 (B) 连接到备用端口(例如 587 或 465)。大多数服务器仅接受来自 587 上经过身份验证的用户的邮件,并且您不能依赖所有支持 SSL (465) 的服务器。最后,邮件并不总是通过第一次尝试。 MTA 担心重试,即使您的计算机关闭也会重新尝试。
        【解决方案5】:

        我找到了一个用 PHP 编写的完整的 SMTP server - 甚至包括一个讨厌的开放式中继。

        $ sudo php php-smtp.php [ip-address] [port]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          • 1970-01-01
          • 2016-08-03
          • 2013-04-16
          • 2011-03-22
          • 2013-02-15
          相关资源
          最近更新 更多