如何在本地主机上设置最小的 smtp 服务器以将消息发送到其他 smtp 服务器

How to setup minimal smtp server on localhost to send messages to other smtp servers

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

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

几乎至关重要的是,我希望这个服务器基本上只是 运行 在本地主机上,这样 只有这个应用程序 可以通过它连接和发送邮件,但是这样它就可以并没有真正“接收”发送到我的域的邮件(我已将此应用服务器的 MX 优先级设置得非常低(嗯,很高))。我认为因为我正在 运行ning 我自己的 SMTP 服务器,所以我真的不需要针对它进行身份验证(它在本地主机上 运行ning),只需接收任何邮件并将其发送到收件人域。

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

我尝试使用 python 的 aiosmtpd 命令行和远程登录从 test@MY_DOMAIN.TLDtest@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 服务器以进行身份​​验证,并且由于我没有这样做,所以这是一个问题?我可以 运行 本地主机上的 SMTP 服务器并让它 发送 邮件到网络之外而不 接收 邮件(无回复服务)?有什么明显的东西是我在这里遗漏的,可以解决我所有的问题吗?

谢谢

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

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

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

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

如果您需要实施邮件列表软件或根据收到的电子邮件执行一些自动化任务,aiosmtpd 可能是一个不错的选择。相机或扫描仪。

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

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

所以,我实际上弄清楚了这里缺少的东西。

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

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