手工搭建邮局:Postfix+Dovecot+Opendkim

Rodent-Nick | 2026年08月21日

前言

最近一直在了解邮件的工作原理,正好手上有一个服务器和域名,决定研究一下如何配置自己的邮箱。

前置条件

测试25端口!

在开始任何部署前,一定要测试25端口是否开放。大多数云服务商默认屏蔽25端口,即便是 本地安全组已经配好,仍然无法在该端口通信。

因此在开始前,应该做端口连通性测试。

具体测试步骤

以下为端口连通性测试的步骤。

  1. 首先,在云服务商的控制台上开放25端口的TCP入站方向。

  2. 然后,在服务器上安装netcat。具体命令如下:

    # Ubuntu/Debian(后文将主要以Ubuntu的aptitude包管理器为主)
    sudo apt install netcat-openbsd
    # CentOS/RHEL
    sudo yum install netcat
  3. 继续在服务器上输入sudo nc -l 25命令操作netcat使其监听25端口。

  4. 紧接着,在本机上安装telnet客户端。以Windows操作系统为例,在”运行“界面中键入 optionalFeatures打开“启用或关闭Windows功能”窗口,在其中向下滚动直到找到 Telnet Client后勾选此项,点击确定进行安装。

  5. 最后,在命令提示符窗口中键入telnet <domain-name> 25,其中<domain-name>是你的服务器 的域名。

如果你在操作后看到了类似“Connected to XYZ”或者一个空白屏幕,这说明25端口是开放的。之所以 看不到任何正常的输出,是因为我们只是使用netcat在服务器端进行简单地监听,不应该有任何输出。

反之,如果看到类似“Connection refused”或者“Connection timeout”等输出,这说明厂商封锁了25 端口。

注意,如果你搭建的邮局只需要发信功能而不需要收信功能,那么不需要开放25端口;反之,请联系厂商 客服请求开放该端口。

更新aptitude索引并安装所需软件

老生常谈了,贴命令:

sudo apt update
sudo apt upgrade

至此,应该能够把所有的软件更新到最新版本了。

下载速度过慢

如果你发现下载过慢,大概率是没有设置镜像源的缘故。请参考清华大学开源软件镜像站的 这篇文章。

然后,我们要安装配置时所需要的软件。主要是Postfix、Dovecot和OpenDKIM。

sudo apt install postfix dovecot-core dovecot-imapd telnet   

在安装Postfix的时候,会要求选择配置。需要选择Internet Site选项,并按照要求填写 FQDN。

同时,还要加装certbot,为邮箱签发SSL/TLS证书。首先先卸载系统中可能有的certbot:

sudo apt remove certbot   

然后,再安装snapd,并从snap里安装certbot:

sudo apt install snapd
sudo snap install --classic certbot

至此,所有所需的软件都安装好了。

配置Postfix

Postfix在这里主要是管发信的,使用的是SMTP协议。

Postfix的绝大多数配置都是在/etc/postfix/main.cf和/etc/postfix/master.cf中调整。 导航至该文件夹后,先备份一下配置文件,然后再用文本编辑器打开。

cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
cp /etc/postfix/master.cf /etc/postfix/master.cf.bak

然后可以用你熟悉的编辑器打开这些文件,我们先打开main.cf。取决于你的操作系统版本,你的配置文件 可能与这里的配置文件不一样。但是只要正确地进行设置,都应该可以运行。

以下是你需要设置的配置项:

配置项名称 设置值 描述
myhostname mail.example.com 你的邮件服务器的二级域名,别忘了要改成你自己的域名!
mydomain example.com 你的邮件服务器的一级域名,别忘了要改成你自己的域名!
myorigin $mydomain 使用Postfix发信的时候@符号后面的域名,一般设置为mydomain
inet_interfaces all 设置为all以监听互联网发来的邮件。
inet_protocols ipv4或ipv6 根据你的服务器支持IPv4或IPv6来决定。
mydestination $myhostname, localhost.$mydomain, localhost, $mydoian 这个选项告诉Postfix收信地址为哪些的信需要存在本地。
home_mailbox Maildir/ 设置Postfix存储邮件的格式为Maildir。

配置好并保存配置文件后,重启Postfix服务以验证配置。

sudo service postfix restart
sudo service postfix status

如果能看到这个输出:

● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; preset: enabled)
Active: active (exited) since Tue 2026-08-25 13:16:39 CST; 2 days ago
Docs: man:postfix(1)
Process: 15352 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 15352 (code=exited, status=0/SUCCESS)
CPU: 994us

说明配置至少是合法的,先进行下一步。如果看到错误提示,可以使用sudo journalctl -xeu postfix 来查看具体报错信息。

现在,打开master.cf文件。这里我们要配置587端口。587端口客户端向邮件服务器提交待发邮件的端口, 而25端口是邮件服务器之间通信的端口。

为什么SMTP协议需要两个端口?

简单地说,是为了给客户端一个登录邮件服务器的接口的同时,又不影响邮件服务器之间的向后兼容。

在SMTP协议设计当初,25端口本来是负责两项工作的:除了允许用户提交待发送的邮件以外,还 承担服务器之间交换邮件的功能。25端口是没有身份验证的,因此任何用户可以随意登录任何一个SMTP服务器, 假装服务器主人发出邮件,这给大量垃圾邮件和邮件诈骗以可乘之机。

后来,为了防止虚假用户向不属于自己的SMTP服务器提交邮件,现在的SMTP协议已经将这两个 功能区分开来:25端口仍然承担服务器之间的邮件交换工作(也就是mail relay,邮件中继);但是如果想 使用客户端(例如你本地电脑上的Thunderbird或者Outlook软件)提交一封待发送的邮件,则需要使用587 端口。这个端口强制要求所有连接的用户提供身份验证信息,同时可以将一开始未加密的连接通过STARTTLS 命令提升为TLS加密连接。

这种设置更加有效地避免了邮件服务器成为互联网安全威胁。

以上仅仅介绍了服务器之间的收发信和客户端发信的配置,在结束了Postfix的配置后,我们会使用Dovecot 来允许客户端时从服务器中收信。

打开master.cf,然后找到如下行:

# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n - y - - smtpd
#submission inet n - y - - smtpd

将下面的一行取消注释,以接受来自互联网上其他邮件服务器的邮件。然后,在该行下面插入以下几行参数:

  -o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_auth_type=dovecot
-o smtpd_tls_auth_only=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

这些参数中有给Postfix的设置,一些会和之后Dovecot设置联动,主要是设置了SASL登录。

到目前为止,Postfix相关的设置结束了。输入 sudo service postfix restart 来重新启动Postfix 使其加载最新的配置,然后使用telnet从本地连接Postfix服务器,测试发信。依次输入以下命令:

telnet localhost 25
HELO example.com
MAIL FROM: test@example.com
RCPT TO: alice@example.com
DATA
Subject: Local Test
Hello. Local Email Test.
.
QUIT

注意:

  1. 不要忘记把example.com替换为你自己的域名!
  2. test用户可以是一个不存在的用户,但是alice必须是一个已经存在的,且有自己的主文件夹的用户。
  3. 第7行的句号点不可省略,该行必须只有一个点。

输入之后,使用su命令切换到刚刚TO行的用户的主文件夹下。正常情况下,这个文件夹下应该已经有了一个 叫做Maildir的文件夹。输入命令mutt -f Maildir查看是否收到刚刚主题为"Local Test"的邮件。

如果收到了,说明上面的配置一切正常,我们进行下一步操作。

配置Dovecot

本段大量参考这一篇文章的这一部分,但是根据个人的安装经验修改了部分 不合理的地方。

首先,你需要指定Dovecot接受那种协议。这些协议主要是用来让你的本地邮件客户端从邮 件服务器上收取信件的。刚刚我们安装了IMAP和POP3,可以在配置文件中直接开启。

打开/etc/dovecot/dovecot.conf文件,并找到protocol = 这一行,改为:

protocol = imap pop3   

除此之外,我们还要指定Dovecot从什么地方找信件。打开/etc/dovecot/conf.d/10-mail.conf文件 并找到

【未完待续】

封面图片是Postfix软件的logo,图片来源:

By The original uploader was Ghen at English Wikipedia.

Transferred from en.wikipedia to Commons by Cody_Cooper., vectorised with Inkscape, EPL-2.0, Link