使用 Exim 和 Dovecot 构建小型邮件系统
如果您想要为家庭服务器搭建一个超简单的 SMTP / IMAP 设置,本指南正适合您。本文档涵盖了在小型家庭网络上启动并运行邮件传递的最低步骤。您不希望将其用于任何严肃的企业级应用,但对于小型家庭局域网来说,它运行良好。
为什么有人会这样做?
我创建这个小型邮件系统的个人动机是为了传递来自 Monit 的警报,这样我就能知道我的系统何时需要关注。您可以将其用于此目的或类似的极简邮件需求。只是不要做任何疯狂的事情,比如将其暴露在互联网上。
为什么选择 Exim 和 Dovecot?
对于邮件服务器,Exim 易于配置。Dovecot 稍微复杂一些,但并非无法克服。两者都有完善的文档。
安装软件包
第一步是安装 Exim、Dovecot 和 Mailx。(Mailx 用于测试。)
apk add exim dovecot mailx
配置 Exim
下一步是让 Exim 工作,以便将电子邮件传递给系统上的用户。这是一个非常简单的配置,在提供的 exim.conf 文件中只需更改几个参数。
- 备份 /etc/exim/exim.conf
- 在您喜欢的文本编辑器中打开 /etc/exim/exim.conf。
- 进行以下陈述的更改并保存。
找到看起来像这样的行
# group = mail # mode = 0660
它们将在 local_delivery:
标题下
找到它们后,删除注释(井号符号)。local_delivery 部分现在应该看起来像这样
local_delivery: driver = appendfile file = /var/mail/$local_part_data delivery_date_add envelope_to_add return_path_add group = mail mode = 0660
唯一改变的是删除了最后两行的井号符号。
修复 /var/mail 的所有权和权限
目前,Exim 将无法将消息传递到存储用户邮箱的 /var/mail。这是由于权限问题。
要修复它,运行这两个命令
chgrp mail /var/mail chmod 2775 /var/mail
完成后,使用 ls -ld /var/mail
验证它。它应该看起来像这样
$ ls -ld /var/mail/ drwxrwsr-x 3 root mail 4096 May 11 12:58 /var/mail/
将组所有权设置为 mail,使 exim 可以在新邮件到达时写入用户的邮箱。
启动 Exim 服务
启动 Exim 并配置它在启动时使用常用命令启动。
service exim start rc-update add exim
测试 Exim 设置
以普通用户身份登录,并尝试向自己发送测试电子邮件。您可以使用 mail 命令执行此操作,如下所示
mail -s Testing dave This is a test. .
这会将测试消息发送给用户 dave。(显然,您需要将 dave 替换为您的用户名。)最后一行上的句点 . 很重要。它告诉 mail 命令消息已完成。
发送消息后,通过运行不带命令行参数的 mail
来检查您是否收到它。如果一切顺利,它应该看起来像下面的示例。
$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/mail/dave": 1 messages > 1 dave@myserver.home Wed May 11 03:51 27/847 "Testing" &
您可以键入消息编号 (1) 以显示邮件的内容,然后键入 q 以退出邮件程序。
邮件传递故障排除
如果邮件测试失败,请查看目录 /var/spool/exim/msglog。如果那里有文件,则表示它们是卡住的消息。这些文件是纯文本。显示内容以显示任何错误消息。在大多数情况下,问题将与 /var/mail 目录或目录内邮箱文件的权限有关。
目录权限应如下所示
# ls -ld /var/mail drwxrwsr-x 3 root mail
内部邮箱文件的权限应如下所示
# ls -l -rw-rw---- 1 dave mail
配置 Dovecot
如果本地传递一切正常,那么是时候使用 Dovecot 设置 IMAP 了。
Alpine 的 Dovecot 软件包在 /etc/dovecot/conf.d 中带有二十个配置文件。作为小型邮件管理员,您可能会感到不知所措。不用担心,一切都可以浓缩到一个包含十六行的配置文件中。
首先,制作 /etc/dovecot/dovecot.conf 的备份副本。
接下来,创建一个新的 dovecot.conf,如下所示
listen = * log_path = /var/log/dovecot.log protocols = imap disable_plaintext_auth = no mail_privileged_group = mail mail_location = mbox:~/mail:INBOX=/var/mail/%u userdb { driver = passwd } passdb { driver = passwd-file args = scheme=sha512-crypt username_format=%n /etc/dovecot/passwd } # These are self-signed certs generated when the dovecat apk was installed. ssl=yes ssl_cert=</etc/ssl/dovecot/server.pem ssl_key=</etc/ssl/dovecot/server.key
此配置没有原始 dovecot.conf 中的 !include conf.d/*.conf
,因此 conf.d 中的那二十个文件将被忽略。现在一切都在这个单独的 dovecot.conf 中。
启动 Dovecot 服务
启动 Dovecot 并配置它在启动时使用常用命令启动。
service dovecot start rc-update add dovecot
为 Dovecot 用户创建凭据
按照配置,Dovecot 将使用 /etc/passwd 查找用户信息,但不用于身份验证。从技术上讲,可以使用可插拔身份验证模块 (PAM) 完成 /etc/passwd 身份验证,但 PAM 不是 Alpine Linux 基本安装的一部分。下一个最好的选择是为 Dovecot 凭据使用单独的密码文件,并使用与 /etc/passwd 中使用的相同的 SHA512-Crypt 哈希算法。
上面的 Dovecot 配置指定密码文件为 /etc/dovecot/passwd。Dovecot 密码文件看起来像这样
dave:{SHA512-CRYPT}$6$mQ1rxB0gZHqg8Tg9$nxZ8odJZ6xVpmOVpsnYfAo1i7SuoLDhsvoykieukWF9NyNBq.WwhDA7udcYxP1iEm/IzlBmnwz6/vOO3SX8gA.
有两个字段,用户名和密码,用冒号分隔。请注意密码的 {SHA512-CRYPT} 前缀。这表示哈希算法。
您可以使用 doveadm
命令创建密码,如下所示
# doveadm pw -s sha512-crypt Enter new password: Retype new password:
该命令将输出哈希密码。您需要使用文本编辑器编辑 Dovecot 的密码文件,并手动创建用户名/密码对。
Dovecot 密码文件的权限应使 dovecot 可以读取它,但不能写入它。只有 root 用户应该能够写入它。
ls -l /etc/dovecot/passwd -rw-r----- 1 root dovecot
测试 Dovecot 设置
要测试 IMAP,您需要一个电子邮件客户端。就个人而言,我在 Windows 上使用 Thunderbird,在 Android 上使用 K-9 Mail。最棘手的部分是让电子邮件客户端信任自签名证书。配置电子邮件客户端超出了本文档的范围。
从服务器端,Dovecot 日志文件可以帮助您诊断错误。dovecot.conf 文件指定了日志文件的位置。
log_path = /var/log/dovecot.log
我见过的一个常见错误如下所示
Disconnected: TLS initialization failed. Error: Failed to initialize SSL server context: Can't load SSL certificate
这是我在 Dovecot 配置文件中犯的排版错误的结果。
您可以通过注释掉 dovecot.conf 中的 ssl 行来进一步简化操作,使其看起来像这样
# These are self-signed certs generated when the dovecat apk was installed. #ssl=yes #ssl_cert=</etc/ssl/dovecot/server.pem #ssl_key=</etc/ssl/dovecot/server.key
现在 TLS 已被排除在外,让您可以诊断其他潜在问题。但是,您可能需要做一些工作来说服您的邮件客户端,以明文形式发送登录凭据是可以的。仅在您信任用户的网络上执行此操作!
使用并享受您的小型邮件系统
现在一切都已设置好,您可以开始给自己发送猫咪图片,或者您可以配置其他程序以使用电子邮件系统发送通知。例如,我使用 Monit 来监控服务和文件系统空间。当 Monit 检测到问题时,它会向我发送电子邮件。
本指南中介绍的设置使用端口 25 用于 SMTP,端口 143 用于 IMAP。没有专用的 TLS 端口。加密使用 STARTTLS 完成。
关于别名的一句话
如果您曾经使用 /etc/aliases 进行邮件传递,您应该知道 Exim 将此文件放在 /etc/mail/aliases 中。格式与 Sendmail 相同。
脚本化安装和配置
如果您喜欢冒险(或者如果您有一个您不在乎的测试系统),您可以使用单个脚本完成上面介绍的所有服务器配置,如下所示
chgrp mail /var/mail chmod 2775 /var/mail apk add exim mailx sed -i~ \ -e 's/# group = mail/ group = mail/' \ -e 's/# mode = 0660/ mode = 0660/' \ /etc/exim/exim.conf ln -s mail/aliases /etc/aliases rc-update add exim service exim start apk add dovecot mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf~ cat <<EOF > /etc/dovecot/dovecot.conf listen = * log_path = /var/log/dovecot.log protocols = imap disable_plaintext_auth = no mail_privileged_group = mail mail_location = mbox:~/mail:INBOX=/var/mail/%u userdb { driver = passwd } passdb { driver = passwd-file args = scheme=sha512-crypt username_format=%n /etc/dovecot/passwd } # These are self-signed certs generated when the dovecat apk was installed. ssl=yes ssl_cert=</etc/ssl/dovecot/server.pem ssl_key=</etc/ssl/dovecot/server.key EOF touch /etc/dovecot/passwd chown root:dovecot /etc/dovecot/passwd chmod 640 /etc/dovecot/passwd service dovecot start rc-update add dovecot echo "Create dovecot user passwords with: doveadm pw -s sha512-crypt"