说明
这一篇文章是基础篇,可以先让你的邮件系统能进行收发邮件。进阶操作如验证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记录
type | name | record |
MX | @ | your IP |
A | your IP | |
AAAA | IPv6如果有 |
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 ESMTPmail_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
将他安装好后,使用后台添加域名和邮箱就可以了