OpenSMTPD
OpenSMTPD 是一个免费的邮件传输代理,作为 OpenBSD 项目的一部分开发。本文基于邮件服务器。
安装
配置
OpenSMTPD 在 /etc/smtpd/
中配置。
本地邮件
要使本地邮件工作,例如对于 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。
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
- 通过端口 465 连接(隐式 TLS)
- 输入
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
参见
- Wikipedia:OpenSMTPD
- OpenSMTPD 与 Dovecot 配合良好。将两者结合起来,创建一个简洁的邮件服务器
- OpenSMTPD 项目页面
- 使用 OpenSMTPD 的简单 SMTP 服务器