努力理解 exim4 配置中的各种中继控制。
我可以从我的服务器发送电子邮件,我可以从家里和工作中发送电子邮件(因为我明确为其添加了合适的网络块),但我无法获得我编写的将电子邮件发送到 googlemail 地址的程序 - 我收到不允许的 550 中继。
我的目标是能够从任何服务器向任何(有效)电子邮件地址发送电子邮件,只要我提供合适的用户名和密码。我怀疑 SASL 在这里发挥作用,但我目前对可以中继的域和可以中继的机器感到困惑。
有人能解开这个谜吗?
[注意:Ubuntu 系统,因此 exim4 采用 Debian 风格的拆分配置]
答案1
这与我的 exim 设置类似。在我的网络内,我可以将电子邮件发送到任何域,但从网络外,exim 只会将邮件发送到我的本地域,除非用户首先向 exim 进行身份验证。这样,只要我先进行身份验证,我就可以从世界任何地方通过我的邮件服务器发送邮件。
我的配置的关键部分是:
domainlist local_domains = @ : example.com
domainlist relay_to_domains =
hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/24 : 2001:111:1111::/64
这基本上将我的本地域(exim 知道其为“主域”)设置为example.com
。它还设置了 exim 被允许中继任何邮件的子网范围。relay_to_domains
为空白,因为除了 之外,没有其他域可供我中继example.com
。
tls_advertise_hosts = *
我宣传 TLS 可用性,以便任何客户端都可以通过 TLS 进行身份验证。
acl_check_rcpt:
[...]
accept hosts = +relay_from_hosts
accept authenticated = *
require message = relay not permitted
domains = +local_domains : +relay_to_domains
此 acl 在决定是否中继之前,会对邮件的目的地和发送者进行一些检查。第一行中继来自先前定义的内部网络内的主机的邮件。第二行中继来自任何经过身份验证的用户的邮件。第三和第四行要求,如果任何先前的条件不满足,则仅为我的本地域中继。
最后一部分是身份验证器,以便 exim 知道经过身份验证的用户是什么样子。我的身份验证器如下所示:
plain_saslauthd_server:
driver = plaintext
public_name = PLAIN
server_condition = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}
server_set_id = $auth2
server_prompts = :
login_saslauthd_server:
driver = plaintext
public_name = LOGIN
server_prompts = "Username:: : Password::"
# don't send system passwords over unencrypted connections
server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}
server_set_id = $auth1
显然,这需要一个编译了 sasl 功能的 exim 版本,以及系统上一个可运行的 SASL 守护进程。我使用 Cyrus SASLD,从记忆中看,安装起来相当简单,而且不用管它。
我实际上是在 OpenBSD 上运行这个,所以不确定这些步骤如何准确地转化为分割配置的 Ubuntu 盒子。然而,这应该足以让你开始 :)