纪实: 在Debian12上搭建邮局系统(Postfix+Dovecot+OpenDKIM)
本文最后更新于 276 天前,其中的信息可能已经有所发展或是发生改变。 原创文章保留所有权利,允许提前告知征得同意并在明显位置保留原文链接的转载,任何无视版权的行为将受到搜索引擎的 DMCA 投诉。

说明

这一篇文章是基础篇,可以先让你的邮件系统能进行收发邮件。进阶操作如验证SPF记录以避免垃圾邮件等操作在这篇文章中讲述。

准备

域名

通常来说,域名在邮件能否成功送达上发挥重要作用。gLTD域的邮件更容易进入收件箱。其次,你需要为域名添加MX记录和TXT记录,确保你有域名的管理权。

IP

在购买VPS之前,你需要确认

  • 服务商没有封锁25,465,587,143,993这些常用邮件端口
  • IP 地址不在任何电子邮件黑名单中(Microsoft Outlook IP 黑名单或 SpamRats 黑名单)
  • 提供PTR 记录(可以提高电子邮件的送达率)

使用如下语句检查出站端口是否打开

telnet gmail-smtp-in.l.google.com 25
# 如果返回类似下面,则不能向外发送邮件
telnet gmail-smtp-in.l.google.com 25
Trying 64.233.187.26...

Connection failed: Connection timed out
Trying 2404:6800:4008:c05::1b...
telnet: Unable to connect to remote host: Network is unreachable
# 如果类似这样,则可以发送邮件
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP - gsmtp
#输入quit再回车以关闭连接

添加DNS记录

typenamerecord
MX@your IP
Amailyour IP
AAAAmailIPv6如果有

PTR记录需要寻求VPS提供商添加。将IP对应的域名设置为mail.your-domain.com

安装服务软件

Postfix

apt update
apt install postfix postfix-mysql libsasl2-modules -y

在安装过程中你将被问及选项,请选择Internet Site。

  • No configuration表示安装过程不会配置/etc/postfix/main.cf文件中的任何参数。
  • Internet Site是指使用 Postfix 向其他 MTA 发送电子邮件以及从其他 MTA 接收电子邮件。
  • Internet with smarthost意味着使用 postfix 接收来自其他 MTA 的电子邮件,但使用另一个智能主机将电子邮件转发给收件人。
  • Satellite system意味着使用智能主机发送和接收电子邮件。
  • Local only意味着电子邮件仅在本地用户帐户之间传输。

这里填入的域名是你的邮箱@

之后可以使用postconf查看配置

postconf mail_version
mail_version = 3.7.6

我的postfix版本是3.7.6。日后软件可能有所变化,请按照实际情况进行配置。

Dovecot

apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

OpenDKIM

apt install opendkim opendkim-tools

MySQL和PHP

这里你可以使用一键安装脚本或者按照其他教程来

#apt install php-fpm php-mysql php-mbstring

配置服务

Posifix

你可以一股脑把配置文件贴进去,或者根据步骤理解一下

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no 
readme_directory = no 
compatibility_level = 3.6
  • smtpd_banner: 设置邮件服务器的欢迎信息。
  • biff: 禁用弹出式邮件通知。
  • append_dot_mydomain: 控制是否在本地邮件地址中添加 “.<mydomain>”。
  • readme_directory: 指定邮件服务器不使用 “readme” 目录。
  • compatibility_level: 设置 Postfix 的兼容性级别。
milter_default_action = accept 
milter_protocol = 6 
smtpd_milters = local:opendkim/opendkim.sock 
non_smtpd_milters = $smtpd_milters
  • Milter 配置:用于邮件过滤和处理的设置。
policyd-spf_time_limit = 3600 
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf
  • SPF 策略设置:指定 SPF 策略的处理和限制。
smtpd_tls_cert_file=/path to pubkey
smtpd_tls_key_file=/path to prikey
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  • TLS 设置:配置服务器端的 TLS(传输层安全)设置,包括证书、安全级别等。
smtp_tls_security_level = may 
smtp_tls_loglevel = 1 
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_CApath=/etc/ssl/certs
  • 客户端 SMTP 的 TLS 设置。
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
  • 配置 TLS 协议的使用。
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
message_size_limit = 104857600
  • 不同的邮件中继限制、别名映射、邮件源、目标、网络设置、邮件大小限制等配置。
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no
  • 配置虚拟域、邮箱映射、别名映射等虚拟邮件服务相关设置。
virtual_mailbox_base = /var/vmail
  • 虚拟邮箱的基础目录、最小 UID、UID 映射、GID 映射等配置。

这个配置文件是用来设置 Postfix 邮件服务器的各种参数和功能,以满足邮件服务的需求。

我们需要创建sql目录。mkdir /etc/postfix/sql/

创建mysql_virtual_domains_maps.cf文件。sudo nano /etc/postfix/sql/mysql_virtual_domains_maps.cf

user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
#query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100

创建mysql_virtual_mailbox_maps.cf文件。sudo nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100

创建mysql_virtual_alias_domain_mailbox_maps.cf文件。sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

创建mysql_virtual_alias_maps.cf文件。sudo nano /etc/postfix/sql/mysql_virtual_alias_maps.cf

user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100

创建mysql_virtual_alias_domain_maps.cf文件。sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

创建mysql_virtual_alias_domain_catchall_maps文件。sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

# handles catch-all settings of target-domain
user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Dovecot

我们还需要配置 Dovecot IMAP 服务器以从数据库查询用户信息。首先,运行以下命令以为 Dovecot 添加 MySQL 支持。

sudo apt install dovecot-mysql

然后编辑 10-mail.conf 文件。

sudo nano /etc/dovecot/conf.d/10-mail.conf

由于我们现在正在使用虚拟邮箱域,我们需要通过在文件中添加以下行来为虚拟用户启用 mail_home,因为虚拟用户默认情况下没有主目录。

mail_home = /var/vmail/%d/%n/

保存并关闭文件。然后编辑 10-auth.conf 文件。

sudo nano /etc/dovecot/conf.d/10-auth.conf

现在我们正在使用虚拟邮箱域,这意味着每个电子邮件地址的用户名都包括域名部分,所以我们需要将 auth_username_format 更改为以下内容。%u 不会去掉域名。这允许用户使用完整的电子邮件地址登录。

auth_username_format = %u
#auth_default_realm =

将其更改为

auth_default_realm = example.com

这是为了确保没有在用户名字段中输入 @example.com 部分的用户仍然可以登录。如果用户没有提供,Dovecot 将附加 @example.com 部分。

接下来,在此文件末尾取消注释以下行,以便 Dovecot 可以从 MySQL/MariaDB 数据库查询用户信息。

!include auth-sql.conf.ext

现在您可能不希望本地 Unix 用户在没有在 PostfixAdmin 中注册电子邮件地址的情况下发送电子邮件,然后通过在开头添加 # 字符来注释掉以下行,这样 Dovecot 就不会查询本地的 /etc/passwd 或 /etc/shadow 文件。

#include auth-system.conf.ext

为了调试登录问题,可以在此文件中添加以下两行可能会有帮助。登录错误将被记录在 /var/log/mail.log 文件中。(一旦用户能够无问题地登录,您可以注释掉以下两行。)

auth_debug = yes
auth_debug_passwords = yes

编辑 dovecot-sql.conf.ext 文件。

nano /etc/dovecot/dovecot-sql.conf.ext
以下是此文件中应该有的内容。默认情况下,此文件中的所有行都被注释掉了,因此您只需将它们复制并粘贴到底部。将 postfixadmin_password 替换为您在步骤 2 中设置的 postfixadmin 密码。

driver = mysql

connect = host=localhost dbname=postfixadmin user=postfixadmin password=postfixadmin_password

default_pass_scheme = ARGON2I

password_query = SELECT username AS user, password FROM mailbox WHERE username = '%u' AND active='1'

user_query = SELECT maildir, 2000 AS uid, 2000 AS gid FROM mailbox WHERE username = '%u' AND active='1'

iterate_query = SELECT username AS user FROM mailbox


重新启动 Dovecot。

sudo systemctl restart dovecot

当用户尝试登录时,Dovecot 将使用 Argon2 算法从用户输入的密码生成密码哈希,然后将其与数据库中存储的密码哈希进行比较。如果匹配,用户就可以成功登录。

postfixadmin

将他安装好后,使用后台添加域名和邮箱就可以了

半亩方塘 , 版权所有丨如未注明 , 均为原创丨本网站采用CC BY-NC-SA 3.0 CN协议进行授权
转载请注明原文链接:纪实: 在Debian12上搭建邮局系统(Postfix+Dovecot+OpenDKIM)
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇