使用本地邮件服务器/sendmail 发送出站邮件?

我们设置了自己的电子邮件服务器,我想知道如何最好地将其与 Discourse Docker 容器一起使用。

当然,我可以配置我们的 SMTP 详细信息和凭据,但这似乎是不必要的开销,因为 SMTP 服务器运行在同一台机器上。

sendmail 可以工作,但 Discourse 在容器中,因此无法访问其主机上的 sendmail

在这里论坛上搜索会找到一个示例,其中 DISCOURSE_SMTP_DOMAIN 在没有凭据的情况下使用,而在容器内使用 swaks 执行相同的操作可以正常工作:How to get Discourse to work with Postfix - #18 by sonmicrosystems 我猜在这种情况下,它仍然是默认端口上的正常 SMTP 提交,并且 Postfix 在没有身份验证的情况下接受它,因为请求来自 localhost?

有人知道其他方法吗?我看到使用的 Ruby 库通常支持所有内容:GitHub - discourse/mail: A Really Ruby Mail Library
在 Discourse 设置中,引起我注意的是一个字段 Delivery method

我无法在 GUI 中更改这些设置,我想是因为容器 YAML 通过 DISCOURSE_SMTP_ADDRESS 等强制设置了它们?但我找不到用于传递方法的变量。

也许有人知道其他方法,在此之前,我将设置正常的 SMTP 提交端口身份验证。感谢 DISCOURSE_SMTP_FORCE_TLS,它最近才添加,但尚未包含在任何示例中(应该包含)。我不打算允许 STARTTLS,只允许隐式/即时 TLS。

不必要的开销是什么意思?你必须以某种方式将数据从 Discourse 发送到 SMTP 服务器吧?不是吗?

附注:如果这是另一个容器,你理论上可以使用桥接网络,并使用 smtp 容器名称而不是主机名(如果你追求的是这个),但这不会带来任何性能优势。

2 个赞

有两种方法可以通过本地 SMTP 服务器发送电子邮件:

  1. 连接到提交端口(如 587,使用 STARTTLS,或 465,使用隐式/即时 TLS)并进行身份验证 => 网络请求,通过 smtpd 应用检查和限制
  2. 使用 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 的大量可执行文件、库和配置,我猜是这样。除非有某种魔术套接字可以绑定挂载到容器中之类的 :smile:

2 个赞

自从我深入微调 sendmail 以来已经有一段时间了。我有一个虚拟机上的 mailcow stack 和另一个虚拟机上的 Discourse。我不知道除了好玩之外,深入研究是否值得。

祝你在你的冒险中一切顺利,并汇报你的学习成果。

1 个赞

可能不值得 :sweat_smile:。但在某些情况下,我是一个完美主义者,我喜欢深入挖掘并了解所有细节。我花了几个晚上逐步设置 Dovecot、Postfix、rspamd、dkimpy-milter、PostSRSd 等,了解了几乎所有可用的设置,默认值为什么是这样,我们是否以及为什么可能想要不同的设置等等。但是,嘿,现在我似乎比大多数任意邮件服务器指南的作者们更能理解大多数事情 :face_with_tongue:

我将此主题移至 #installation:hosting。我们不建议尝试自行托管电子邮件服务器,正如您在阅读官方安装说明时所知。电子邮件很难!

我不确定 Discourse 与系统是否可以另外托管电子邮件服务器有什么关系?当然,除了这在理论上为发送电子邮件打开了另一条途径这一事实之外。

然而,对于接收电子邮件(另一个话题),它有影响,因为你不能托管电子邮件接收器容器,至少不能直接在端口 25 上收听。但是,直接使用 Discourse 的电子邮件接收器 API 在 Postfix 配置中只需 2-3 行即可完成:Is there a way to only IMAP polling for incoming emails - #2 by MichaIng

但我同意,如上所述,正确设置电子邮件服务器并非易事。但学习起来非常有趣 :slightly_smiling_face:

1 个赞

是的!这当然既有挑战性又有趣。在我过去的经历中,我曾亲自安装和运行过各种各样的服务,经历过不少冒险!:upside_down_face:

很高兴你能更新这个话题,分享你的学习经验,让未来的勇敢旅行者(包括你自己)受益。但请记住,Support 分类是用于已支持的安装、Discourse 核心以及官方插件和组件的。

1 个赞

什么。Dovecoat 很好。为什么是 postfix?为什么不是 Dovecoat Exim?

Postfix 有什么问题?它是我读过的第一个邮件服务器设置指南的一部分,而且它内部的过滤器选项可以在管道早期减少垃圾邮件和机器人访问,这似乎是一个不错的论点。

嗯,有点离题了,关于 Discourse 的 sendmail/pickup 用法。

将此标记为已解决/已回答。Discourse 容器无法访问主机的 sendmail 是有道理的,无论是在哪个服务器上。因此,它需要使用 SMTP 提交,为此可以通过 Postfix 中的 Docker 容器 IP 范围进行身份验证,从而跳过 Dovecot 上的 passdb/userdb 身份验证。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.