1

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

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

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

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

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

精确的复制步骤,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 服务器并让它从网络发送邮件而不接收邮件(无回复服务)吗?有什么明显的东西我只是在这里想念可以解决我所有的问题吗?

谢谢

4

2 回答 2

1

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

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

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

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

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

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

另请参阅:Python aiosmtpd - 邮件传输代理 (MTA) 缺少什么?

于 2022-01-25T18:18:21.733 回答
0

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

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

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

于 2022-02-05T07:42:03.517 回答