使用 Exim 和 Dovecot 构建小型邮件系统

来自 Alpine Linux

如果您想要为家庭服务器搭建一个超简单的 SMTP / IMAP 设置,本指南正适合您。本文档涵盖了在小型家庭网络上启动并运行邮件传递的最低步骤。您不希望将其用于任何严肃的企业级应用,但对于小型家庭局域网来说,它运行良好。

为什么有人会这样做?

我创建这个小型邮件系统的个人动机是为了传递来自 Monit 的警报,这样我就能知道我的系统何时需要关注。您可以将其用于此目的或类似的极简邮件需求。只是不要做任何疯狂的事情,比如将其暴露在互联网上。

为什么选择 Exim 和 Dovecot?

对于邮件服务器,Exim 易于配置。Dovecot 稍微复杂一些,但并非无法克服。两者都有完善的文档。

安装软件包

第一步是安装 Exim、Dovecot 和 Mailx。(Mailx 用于测试。)

 apk add exim dovecot mailx

配置 Exim

下一步是让 Exim 工作,以便将电子邮件传递给系统上的用户。这是一个非常简单的配置,在提供的 exim.conf 文件中只需更改几个参数。

  1. 备份 /etc/exim/exim.conf
  2. 在您喜欢的文本编辑器中打开 /etc/exim/exim.conf
  3. 进行以下陈述的更改并保存。

找到看起来像这样的行

 # 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"