如何设置 exim4 向任何地方发送电子邮件(但仅限于授权用户)?

如何设置 exim4 向任何地方发送电子邮件(但仅限于授权用户)?

努力理解 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 盒子。然而,这应该足以让你开始 :)

相关内容