【问题标题】:How to setup minimal smtp server on localhost to send messages to other smtp servers如何在 localhost 上设置最小的 smtp 服务器以将消息发送到其他 smtp 服务器
【发布时间】:2022-01-20 06:40:42
【问题描述】:

老实说,我认为我在理解 SMTP 的工作原理方面存在根本性的差距。我似乎无法很好地解释幕后发生的事情,我认为这使我无法做我想做的事情。

为了解释,我正在尝试设置一个应用程序,该应用程序通过连接到 SMTP 服务器向用户发送通知。很公平。我想,由于我使用自己的域,我配置了 SPF/DKIM/DMARC,我可以为我设置应用程序的主机添加 MX 记录(我的 SPF 记录有 mx 关键字来授权任何主机在我的 MX 记录中发送/接收邮件)。然后,我可以让同一台主机运行一个超级轻量级​​的 SMTP 服务器,它可以接受来自应用程序的邮件,并将它们发送给收件人。

最关键的是,我希望这个服务器基本上只在本地主机上运行,​​以便只有这个应用程序可以通过它连接和发送邮件,但它不能真正“接收”发送到的邮件我的域(我已将此应用服务器的 MX 优先级设置得很低(嗯,一个很高的数字))。我想,因为我正在运行自己的 SMTP 服务器,所以我不需要对其进行身份验证(它在 localhost 上运行),只需接收任何邮件并将其发送到收件人域即可。

当向收件人域发送邮件时... SMTP 服务器是否需要进行身份验证才能将 gmail SMTP 服务器作为用户来发送邮件?这看起来很奇怪,因为它不是登录 gmail 来发送邮件的用户,它是一个 SMTP 服务器,在 SPF 中被授权从我的域(我的域中的From 地址)发送邮件到应用服务器用户的电子邮件所在的位置基于(在此示例中,用户将是例如 some_user@gmail.com)。

我尝试使用 python 的 aiosmtpd 命令行和 telnet 将邮件从 test@MY_DOMAIN.TLD 发送到 test@MY_DOMAIN.TLD,但它似乎没有传递消息;我认为aiosmtpd 将连接到我的域的首选 MX 服务器(我的“真实”MX)以传输消息,然后将其放入我的收件箱。情况似乎并非如此,我不知道为什么。

精确的重现步骤,其中example.com 是我的域,终端在我的 MX 记录中列出的主机名的盒子上运行。

A 航站楼:

$ aiosmtpd -n

B 航站楼:

$ telnet localhost 8025
EHLO <example.com>
MAIL FROM: test@example.com
RCPT TO: test@example.com
DATA
FROM: Application Notifications <test@example.com>
TO: User Name <test@example.com>
SUBJECT: App Notify Test

This is a test!
.
QUIT

SMTP 服务器通常如何在彼此之间发送邮件?他们每个人都可以登录到彼此的 SMTP 服务器进行身份验证吗?既然我没有这样做,这是个问题吗?我可以在 localhost 上运行一个 SMTP 服务器并让它发送 邮件到网络之外而不接收 邮件(无回复服务)吗?有什么明显的东西我只是在这里遗漏了可以解决我所有的问题吗?

谢谢

【问题讨论】:

  • 如果您只想发送电子邮件,请使用第三方事务性电子邮件服务,如 Amazon SES 或类似服务。

标签: email smtp aiosmtpd


【解决方案1】:

听起来您想运行一个邮件传输代理 (MTA),将邮件中继 到远程 SMTP 服务器。 MTA 通常充当 SMTP 服务器来接收消息,然后在将消息中继到远程主机时充当 SMTP 客户端。

MTA 通常以两种不同的模式运行:(1) 它们会将来自经过身份验证的用户的消息中继到远程主机,以及 (2) 它们将从远程主机接收消息给其用户并以某种方式存储它们。这两种模式的结合——MTA 将接受来自远程主机的消息并将它们中继到不同的远程主机——称为开放中继,它肯定会吸引垃圾邮件发送者并将您的服务器列入垃圾邮件黑名单。

aiosmtpd 不是 MTA 或开箱即用的电子邮件中继 - 它只是一个 SMTP 服务器,它将接收消息并对您对其编程的消息执行任何操作。默认情况下,它什么也不做——也就是说,它会接收消息并将它们丢弃。如果要在 aiosmtpd 中实现电子邮件中继,则需要实现 MTA 的 SMTP 客户端部分,例如通过实现一个 aiosmtpd 处理程序来实例化 smtplib.SMTP 以连接到远程主机。

但是,如果您只需要一个电子邮件中继,那么您很可能根本不需要 aiosmtpd - postfix 可能是更好的选择。

aiosmtpd 如果您需要实施邮件列表软件或执行一些基于传入电子邮件的自动化任务,例如相机或扫描仪。

如果您想在 aiosmtpd 中实现电子邮件中继,则需要确保软件和服务器的配置方式不会中继来自外部 Internet 的未经身份验证的消息。

另请参阅:Python aiosmtpd - what is missing for an Mail-Transfer-Agent (MTA)?

【讨论】:

    【解决方案2】:

    所以,我实际上弄清楚了这里缺少什么。

    我需要运行一个 SMTP 服务器,是的,但我还需要编写代码来解析“to”域(收件人域),为收件人域的 MX 服务器执行 DNS 请求,以及然后使用smtplib 客户端将邮件发送到收件人域。将该消息中继到收件人服务器不需要身份验证,仅在从给定的收件箱中读取或验证发件人代表域发送时才需要身份验证(我相信自己和我自己只发送邮件)。我可以做到这一切,同时只监听本地主机上的邮件,这样只有我的本地服务器可以使用本地 SMTP 服务器将消息/电子邮件中继到收件人域。

    此外,我不需要将我的外部 IP 列为 MX 服务器,因为它不接受域的邮件,只发送。我确实需要它的 SPF 记录,以便它是来自我的域的电子邮件的授权中继/发件人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2017-06-08
      • 2014-09-29
      • 2012-05-11
      • 2014-05-22
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多