如何设置 exim4 以在任何地方发送电子邮件,但仅限于授权用户?

Rob*_*ell 4 smtp exim

努力让我了解 exim4 配置中的各种中继控件。

我可以从我的服务器发送电子邮件,我可以从家里和工作中发送电子邮件(因为我明确为它添加了合适的网络块),但我无法获得我编写的程序来将电子邮件发送到 googlemail 地址 - 我得到了一个 550 中继不允许。

我的目标是能够从任何服务器向任何(有效)电子邮件地址发送电子邮件,前提是我提供了合适的用户名和密码。我怀疑 SASL 在这里发挥作用,但我目前在我可以中继的域和我可以中继的机器之间感到困惑。

有谁能解开这个吗?

[注意:Ubuntu 盒子,因此 Debian 风格的 exim4 拆分配置]

gro*_*wse 5

这类似于我的进出口设置。从我的网络内部,我可以向任何域发送电子邮件,但从网络外部,唯一的邮件 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
Run Code Online (Sandbox Code Playgroud)

这基本上将我的本地域设置为example.com. 它还列出了允许 exim 中继任何邮件的子网范围。relay_to_domains是空白的,因为除了example.com.

tls_advertise_hosts = *
Run Code Online (Sandbox Code Playgroud)

我宣传 TLS 可用性,以便任何客户端都可以通过 TLS 进行身份验证。

acl_check_rcpt:
    [...]
    accept  hosts         = +relay_from_hosts
    accept  authenticated = *
    require message = relay not permitted
        domains = +local_domains : +relay_to_domains
Run Code Online (Sandbox Code Playgroud)

在决定是否转发之前,这个 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
Run Code Online (Sandbox Code Playgroud)

显然,这需要一个编译了 sasl 功能的 exim 构建,以及系统上工作的 SASL 守护进程。我使用 Cyrus SASLD 并且从记忆中,安装和忘记它相当简单。

我实际上是在 OpenBSD 上运行它的,所以不确定这些步骤如何准确地转换为拆分配置的 Ubuntu 框。但是,它应该足以让您前进:)