有两种方法可以通过本地 SMTP 服务器发送电子邮件:
- 连接到提交端口(如 587,使用 STARTTLS,或 465,使用隐式/即时 TLS)并进行身份验证 => 网络请求,通过
smtpd应用检查和限制 - 使用
sendmail或类似工具,它会调用本地的pickup命令(对于 Postfix),不进行任何网络连接,并绕过为smtpd提交服务配置的所有检查和限制。
后者更简单快捷,已集成到常见的运行时系统和框架中,例如 PHP mailer 和 Discourse 使用的这个 Ruby 邮件库。并且可以绕过身份验证,无需在任何地方存储纯文本凭据。换句话说:在这种情况下,根本不使用 SMTP 服务器,只使用 SMTP 客户端。
我的意思是,是的,与 Discourse 其他功能相比,提交端口连接在服务器负载方面不应有任何显著影响。后者可以通过例如在提交端口设置 smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject 规则来解决,以在进行任何身份验证之前允许来自回环 IP(默认,mynetworks 设置)的提交。如果从容器发出的请求显示为其他 IP,则可以将其添加到 mynetworks。我想这与我之前链接的主题的情况一样。
下次更新/重建我们的 Discourse 时,当应用更改的 SMTP 设置时,我会看看。届时会汇报情况。
但仍然想知道是否有其他方法,以及这个“投递方式”设置是什么意思。
Postfix 运行在主机上,而不是在容器内,但这差别不大,因为它仍然是基于网络的身份验证。
是的,后来一想,sendmail 等从主机/其他容器运行在容器内是说不通的,因为它需要直接访问 Postfix 的大量可执行文件、库和配置,我猜是这样。除非有某种魔术套接字可以绑定挂载到容器中之类的
。