在 localhost:25 上连接 SMTP 服务器而无需认证?

在 2019 年,这是 RHEL/CentOS 上 Postfix 的默认配置。Postfix 仅绑定到回环接口,并丢弃所有非源自 127.0.0.0/8 的 SMTP 请求。无需认证。我不确定 Debian 的情况,但我推测 exim 也有类似的默认配置。

论坛上有其他用户遇到此问题,以下是几个相关主题:

似乎还没有关于如何在 RHEL/CentOS 上设置此配置(包括对 Discourse 和 Postfix 进行必要更改)的主题,因此我在这里记录一下。

这似乎无法通过 discourse-setup 脚本实现,但我确实成功实现了。

首先,我需要找出 Docker 主机在 Docker 容器中看到的 IP 地址。使用 127.0.0.1 行不通,因为 Docker 容器会将 127.0.0.1 视为自身。相反,我们需要指定运行 Postfix SMTP 服务器的 Docker 主机的 IP 地址或主机名,并且该地址必须对 Docker 容器可访问(例如,如果您希望 SMTP 服务器不对外网开放,则不要使用 Docker 主机的公网 IP 地址)。

我在 Docker 主机上执行以下命令,从 docker0 接口中提取了相关的 Docker 主机 IP 地址(172.17.0.1):

[maltfield@osestaging1 ~]$ ip address show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:80:35:65:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:80ff:fe35:65a1/64 scope link 
       valid_lft forever preferred_lft forever
[maltfield@osestaging1 ~]$

然后,我编辑了 Discourse 应用的 yaml 文件,将 “DISCOURSE_SMTP_ADDRESS” 设置为上面的 172.17.0.1

[maltfield@osestaging1 ~]$ cd /var/discourse/
[maltfield@osestaging1 discourse]$ grep SMTP containers/app.yml
  DISCOURSE_SMTP_ADDRESS: 172.17.0.1
  DISCOURSE_SMTP_PORT: 25
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false
[maltfield@osestaging1 discourse]$ 

请注意,我最初尝试使用内部 Docker 主机名 host.docker.internal,但据称该主机名对 Linux Docker 用户不可用。

由于 RHEL/CentOS 中的默认 Postfix 配置仅绑定到 127.0.0.1(这很好),因此您需要修改 /etc/postfix/main.cf,使其也绑定到 docker0 接口,并将该子网添加到 mynetworks 组,以便接受来自 Docker 容器的 SMTP 流量。

[maltfield@osestaging1 postfix]$ grep -ir '172.17' /etc/postfix/*
/etc/postfix/main.cf:inet_interfaces = 127.0.0.1, 172.17.0.1
/etc/postfix/main.cf:mynetworks = 127.0.0.0/8, 172.17.0.0/16
[maltfield@osestaging1 postfix]$ 

进行这些更改后,重新构建 Discourse,它现在应该能够通过 Docker 主机的 Postfix 发送邮件了。

/var/discourse/launcher rebuild app

虽然这可以工作,但我还有几个问题:

  1. 是否已有其他环境变量或主机名指向 Docker 主机(本例中为 172.17.0.1)?

我注意到 launcher “注入”了一个名为 DISCOURSE_HOST_IP 的环境变量。是否可以将此 DISCOURSE_SMTP_ADDRESS yaml 键设置为与其他 yaml 键相同的值,例如:

DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
  1. 一般来说,Docker 主机的 172.17.0.1 IP 地址有多稳定?在 RHEL/CentOS 系统上它总是这个 IP 吗?它会发生变化吗?