OpenSMTPD

来自 ArchWiki

OpenSMTPD 是一个免费的邮件传输代理,作为 OpenBSD 项目的一部分开发。本文基于邮件服务器

安装

安装 opensmtpd 软件包。

配置

OpenSMTPD 在 /etc/smtpd/ 中配置。

注意: 从 OpenSMTPD version 6.4.0 开始,配置文件语法已被完全重写,与以前的配置文件不兼容。有关将配置迁移到新语法的说明,请参阅 https://poolp.org/posts/2018-05-21/switching-to-opensmtpd-new-config/

本地邮件

此条目或章节已过时。

原因: OpenSMTPD 6.6.3p1 更改了默认配置以使用 Maildir 而不是 mbox。(在 Talk:OpenSMTPD 中讨论)

要使本地邮件工作,例如对于 cron 邮件,只需 启动 smtpd.service 即可。

OpenSMTPD 的默认配置是进行本地邮件检索和传递,以及中继传出邮件。请参阅 smtpd.conf(5)

要使您的本地邮件转到 /var/spool/mail/username,即大多数电子邮件客户端期望的邮件路径,请使用 action "local" maildir "/var/spool/mail/%{rcpt.user}" alias <aliases> 而不是 action "local" mbox alias <aliases>

仅本地邮件

要仅进行本地邮件,以下内容就足够了

/etc/smtpd/smtpd.conf
listen on lo
action "local" mbox alias <aliases>
match for local action "local"

混合模式 :本地邮件和中继

/etc/smtpd/smtpd.conf 中的这两行 

action "local" mbox alias <aliases>
action "relay" relay host "smtp://smtp.foo.bar" mail-from "@foo.bar"
match for local action "local"
match for any action "relay"

配置 OpenSMTPD 以 

  • 本地发送本地电子邮件,无需通过中继(对于 cron 和 at 邮件通知很有用)
  • 使用中继发送 localhost 之外的邮件

只需将 smtp.foo.bar 替换为您的 ISP 邮件服务器,或您方便的其他服务器。

仅中继

要通过中继发送所有本地电子邮件,请调用 procmail

/etc/smtpd/smtpd.conf
action "local" mda "procmail -f -" virtual <aliases>
action "relay" relay host "smtps://label@smtp.foo.bar" auth <secrets> mail-from "@foo.bar"
match for local action "local"
match for any action "relay"

aliases 选项用于本地用户映射,为了简化映射,您可以使用带有 catch all 的虚拟别名

/etc/smtpd/aliases
@ foo@bar

简单的 OpenSMTPD/mbox 配置

TLS

要获取证书,请参阅 OpenSSL#Usage

注意: OpenSMTPD 具有可靠的默认设置,SSLv3 始终被禁用,并且默认的 ciphers 未知是不安全的。您可能仍然想按照 Server-side TLS 中的描述测试服务器。

创建用户账户

  • 在邮件服务器上为每个所需的邮箱创建一个用户账户。
# useradd -m roger
# useradd -m shirley
  • OpenSMTPD 将消息传递到用户账户的 mbox 文件,位于 /var/spool/mail/<username>
  • 如果需要,可以将多个 SMTP 电子邮件地址路由到给定的 mbox。

编写简单的 smtpd.conf 设置

  • 一个可用的配置只需九行代码即可实现!
/etc/smtpd/smtpd.conf
pki mx.domain.tld cert         "/etc/smtpd/tls/smtpd.crt"
pki mx.domain.tld key          "/etc/smtpd/tls/smtpd.key"

table creds                    "/etc/smtpd/creds"
table vdoms                    "/etc/smtpd/vdoms"
table vusers                   "/etc/smtpd/vusers"

listen on eth0 tls pki mx.domain.tld
listen on eth0 port 465 smtps pki mx.domain.tld auth <creds>
listen on eth0 port 587 tls-require pki mx.domain.tld auth <creds>

action receive	mbox virtual <vusers>
action send relay

match from any for domain <vdoms> action receive
match for any action send

创建表

  • 对于域表文件;只需每行放置一个域
/etc/smtpd/vdoms
personaldomain.org
businessname.com
  • 对于用户表文件;每行列出一个入站 SMTP 电子邮件地址,然后将其映射到右侧的 mbox 用户账户名、SMTP 电子邮件地址或两者的任意组合,以逗号分隔。
/etc/smtpd/vusers
roger@personaldomain.org          roger
newsletters@personaldomain.org    roger,roger.rulz@gmail.com

roger@businessname.com            roger
shirley@businessname.com          shirley
info@businessname.com             roger,shirley
contact@businessname.com          info@businessname.com
  • 对于 creds 表文件;将用户名放在第 1 列,将密码哈希放在第 2 列
/etc/smtpd/creds
roger                              <password hash created using 'smtpctl encrypt' command>
shirley                            <password hash created using 'smtpctl encrypt' command>

测试配置

# smtpd -n

如果您收到一条消息,提示“configuration OK” - 您就可以 rock and roll 了。如果不是,请处理任何配置错误并重试。

故障排除

控制台调试

如果您在邮件传递方面遇到问题,请尝试停止 smtpd.service 并使用“do not daemonize”和“verbose output”选项手动启动守护程序。然后观察控制台中的错误。

# smtpd -dv

子系统追踪

添加 -T 标志以获取实时子系统追踪

# smtpd -dv -T smtp

或者,如果守护程序已在运行,请使用 smtpctl trace <subsystem> 命令。追踪输出将出现在上面的控制台输出以及 smtpd.service 的 journalctl 输出中。例如

# smtpctl trace expand && smtpctl trace lookup

...将追踪别名/虚拟/转发扩展以及用户/凭据查找

手动提交端口认证

  • 在 base64 中编码用户名和密码
    $ printf '\0%s\0%s' 'username' 'password' | base64
  • 使用 openssl s_client 命令连接到提交端口,使用以下命令之一
    • 通过端口 465 连接(隐式 TLS)
      $ openssl s_client -host mx.domain.tld -port 465
    • 通过端口 587 连接 (STARTTLS)
      $ openssl s_client -host mx.domain.tld -port 587 -starttls smtp
  • 输入 EHLO myhostname,然后输入 AUTH PLAIN。在 334 响应后粘贴上面步骤中的 base64 字符串。
250 HELP
EHLO test.domain.tld
250-mx.hostname.tld Hello test.domain.tld [5.5.5.5], pleased to meet you
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SIZE 36700160
250-DSN
250-AUTH PLAIN LOGIN
250 HELP
AUTH PLAIN
334 
dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcmQ=
235 2.0.0: Authentication succeeded

“Helo 命令被拒绝:需要完全限定的主机名”

发送电子邮件时,如果您收到此类消息,请在文件 /etc/smtpd/mailname 中设置您的 FQDN。否则,服务器名称将从本地 主机名 派生,该主机名由 gethostname(3p) 返回,如果它是完全限定的域名,则直接返回,或者通过 getaddrinfo(3) 检索关联的规范名称。

系统用户认证失败

如果您正在使用系统用户,并且使用有效凭据的身份验证失败,则必须配置 PAM

/etc/pam.d/smtpd
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so

参见