配置 Postfix 处理入站邮件
- 版本:免费版、专业版、旗舰版
- 产品:GitLab 自管版
本文档将引导您完成在 Ubuntu 上设置一个带有 IMAP 认证的基础 Postfix 邮件服务器的步骤,以便与入站邮件功能配合使用。
本指南假设您使用的邮箱地址是 incoming@gitlab.example.com,也就是在主机 gitlab.example.com 上的用户名 incoming。在执行示例代码片段时,请务必将其更改为您的实际主机名。
配置服务器防火墙
- 在您的服务器上开放 25 端口,以便他人可以通过 SMTP 向服务器发送邮件。
- 如果邮件服务器与运行 GitLab 的服务器不同,请在您的服务器上开放 143 端口,以便 GitLab 可以通过 IMAP 从该服务器读取邮件。
安装软件包
-
如果尚未安装
postfix软件包,请先安装它:sudo apt-get install postfix当询问环境类型时,请选择 ‘Internet Site’。当要求确认主机名时,请确保它与
gitlab.example.com匹配。 -
安装
mailutils软件包。sudo apt-get install mailutils
创建用户
-
为接收邮件创建一个用户。
sudo useradd -m -s /bin/bash incoming -
为此用户设置一个密码。
sudo passwd incoming请务必记住此密码,稍后会用到。
测试开箱即用的设置
-
连接到本地 SMTP 服务器:
telnet localhost 25您应该会看到如下提示符:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 gitlab.example.com ESMTP Postfix (Ubuntu)如果您收到
Connection refused错误,请检查postfix是否正在运行:sudo postfix status如果没有运行,请启动它:
sudo postfix start -
通过在 SMTP 提示符中输入以下内容,向新的
incoming用户发送一封测试邮件:ehlo localhost mail from: root@localhost rcpt to: incoming@localhost data Subject: Re: Some issue Sounds good! . quit.是一个单独一行的句点。如果在输入
rcpt to: incoming@localhost后收到错误,则说明您的 Postfixmy_network配置不正确。错误信息会显示 ‘Temporary lookup failure’。请参阅配置 Postfix 从互联网接收邮件部分。 -
检查
incoming用户是否收到了邮件:su - incoming mail您应该会看到如下输出:
"/var/mail/incoming": 1 message 1 unread >U 1 root@localhost 59/2842 Re: Some issue退出邮件应用:
q -
登出
incoming账户,切换回root用户:logout
配置 Postfix 使用 Maildir 格式的邮箱
我们稍后安装的 Courier 需要 Maildir 格式的邮箱,而不是 mbox 格式。
-
配置 Postfix 使用 Maildir 格式的邮箱:
sudo postconf -e "home_mailbox = Maildir/" -
重启 Postfix:
sudo /etc/init.d/postfix restart -
测试新设置:
- 按照 测试开箱即用的设置 中的步骤 1 和 2 进行操作。
- 检查
incoming用户是否收到了邮件:
su - incoming MAIL=/home/incoming/Maildir mail您应该会看到如下输出:
"/home/incoming/Maildir": 1 message 1 unread >U 1 root@localhost 59/2842 Re: Some issue退出邮件应用:
q如果
mail命令返回Maildir: Is a directory错误,说明您的mail版本不支持 Maildir 格式的邮箱。请运行sudo apt-get install heirloom-mailx来安装heirloom-mailx。然后,在之前的步骤中,用heirloom-mailx命令替换mail命令,再试一次。 -
登出
incoming账户,切换回root用户:logout
安装 Courier IMAP 服务器
-
安装
courier-imap软件包:sudo apt-get install courier-imap并启动
imapd:imapd start -
courier-authdaemon在安装后不会自动启动。没有它,IMAP 认证将会失败:sudo service courier-authdaemon start您也可以配置
courier-authdaemon开机自启:sudo systemctl enable courier-authdaemon
配置 Postfix 从互联网接收邮件
-
告知 Postfix 应视为本地的域名:
sudo postconf -e "mydestination = gitlab.example.com, localhost.localdomain, localhost" -
告知 Postfix 应视为局域网一部分的 IP:
假设
192.168.1.0/24是您的本地局域网。如果您在同一本地网络中没有其他机器,可以安全地跳过此步骤。sudo postconf -e "mynetworks = 127.0.0.0/8, 192.168.1.0/24" -
配置 Postfix 在所有接口(包括互联网)上接收邮件:
sudo postconf -e "inet_interfaces = all" -
配置 Postfix 使用
+作为子地址寻址的分隔符:sudo postconf -e "recipient_delimiter = +" -
重启 Postfix:
sudo service postfix restart
测试最终设置
-
在新设置下测试 SMTP:
- 连接到 SMTP 服务器:
telnet gitlab.example.com 25您应该会看到如下提示符:
Trying 123.123.123.123... Connected to gitlab.example.com. Escape character is '^]'. 220 gitlab.example.com ESMTP Postfix (Ubuntu)如果您收到
Connection refused错误,请确保您的防火墙已设置为允许 25 端口的入站流量。- 通过在 SMTP 提示符中输入以下内容,向
incoming用户发送一封测试邮件:
ehlo gitlab.example.com mail from: root@gitlab.example.com rcpt to: incoming@gitlab.example.com data Subject: Re: Some issue Sounds good! . quit.是一个单独一行的句点。- 检查
incoming用户是否收到了邮件:
su - incoming MAIL=/home/incoming/Maildir mail您应该会看到如下输出:
"/home/incoming/Maildir": 1 message 1 unread >U 1 root@gitlab.example.com 59/2842 Re: Some issue退出邮件应用:
q- 登出
incoming账户,切换回root用户:
logout -
在新设置下测试 IMAP:
- 连接到 IMAP 服务器:
telnet gitlab.example.com 143您应该会看到如下提示符:
Trying 123.123.123.123... Connected to mail.gitlab.example.com. Escape character is '^]'. - OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information.- 通过在 IMAP 提示符中输入以下内容,以
incoming用户身份登录以测试 IMAP:
a login incoming PASSWORD将 PASSWORD 替换为您之前为
incoming用户设置的密码。您应该会看到如下输出:
a OK LOGIN Ok.- 断开与 IMAP 服务器的连接:
a logout
完成
如果所有测试都成功通过,说明 Postfix 已完全配置好,可以接收邮件了!请继续阅读入站邮件指南以配置 GitLab。
本文档改编自 https://help.ubuntu.com/community/PostfixBasicSetupHowto,由 Ubuntu 文档 wiki 的贡献者完成。