手工搭建邮局:Postfix+Dovecot+Opendkim
Rodent-Nick | 2026年08月21日
前言
最近一直在了解邮件的工作原理,正好手上有一个服务器和域名,决定研究一下如何配置自己的邮箱。
前置条件
- 一台有静态IP的服务器:我用的是一台2C4G的云服务器,运行 Ubuntu 24.04 LTS
- 一个一级域名:例如
example.com
测试25端口!
在开始任何部署前,一定要测试25端口是否开放。大多数云服务商默认屏蔽25端口,即便是 本地安全组已经配好,仍然无法在该端口通信。
因此在开始前,应该做端口连通性测试。
具体测试步骤
以下为端口连通性测试的步骤。
-
首先,在云服务商的控制台上开放25端口的TCP入站方向。
-
然后,在服务器上安装netcat。具体命令如下:
# Ubuntu/Debian(后文将主要以Ubuntu的aptitude包管理器为主)
sudo apt install netcat-openbsd
# CentOS/RHEL
sudo yum install netcat -
继续在服务器上输入
sudo nc -l 25命令操作netcat使其监听25端口。 -
紧接着,在本机上安装telnet客户端。以Windows操作系统为例,在”运行“界面中键入
optionalFeatures打开“启用或关闭Windows功能”窗口,在其中向下滚动直到找到Telnet Client后勾选此项,点击确定进行安装。 -
最后,在命令提示符窗口中键入
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
注意:
- 不要忘记把
example.com替换为你自己的域名! test用户可以是一个不存在的用户,但是alice必须是一个已经存在的,且有自己的主文件夹的用户。- 第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