如何在 Linux 中使用虚拟域用户配置 Postfix 和 Dovecot - 第 2 部分
在本系列的前一篇文章中,我们解释了如何使用 phpMyAdmin 安全地设置和管理邮件服务器数据库。
要求:
现在是时候配置使发送和接收电子邮件成为现实的内部程序了:Postfix和Dovecot(分别处理发送和接收电子邮件)。
配置 Postfix 邮件服务器
在开始配置Postfix之前,最好先查看一下此处的手册页,并特别强调“ Postfix 新用户信息”部分。如果您这样做,您会发现遵循本教程会更容易。
简而言之,您应该知道Postfix有两个配置文件:
- /etc/postfix/main.cf(Postfix配置参数,更多详细信息请参考man 5 postconf )。
- /etc/postfix/master.cf(Postfix主守护进程配置,有关更多详细信息,请参阅man 5 master)。
在 中/etc/postfix/main.cf
,找到(或添加,如果需要)以下行并确保它们与下面指示的值匹配:
append_dot_mydomain = no biff = no config_directory = /etc/postfix dovecot_destination_recipient_limit = 1 message_size_limit = 4194304 readme_directory = no smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_banner = $myhostname ESMTP $mail_name (CentOS) smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtpd_use_tls = yes virtual_transport = dovecot smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
接下来的三个设置特别重要。在黄色标示的文件中,我们将配置 Postfix 对 Domains_tbl 、 Users_tbl和Alias_tbl表的访问:
virtual_mailbox_domains = mysql:/etc/postfix/mariadb-vdomains.cf virtual_mailbox_maps = mysql:/etc/postfix/mariadb-vusers.cf virtual_alias_maps = mysql:/etc/postfix/mariadb-valias.cf
请注意,您可以在上面选择不同的文件名,只要您确保创建它们并在其中插入以下内容即可。在每种情况下,将YourPassword替换为您在第 1 部分中为dba用户选择的密码,或者您也可以在下面使用MariaDB根凭据作为用户和密码。
此外,请确保使用与第 1 部分中创建的电子邮件服务器数据库和表完全相同的名称。
在/etc/postfix/mariadb-vdomains.cf
:
user = dba password = YourPassword hosts = 127.0.0.1 dbname = EmailServer_db query = SELECT 1 FROM Domains_tbl WHERE DomainName='%s'
在/etc/postfix/mariadb-vusers.cf
:
user = dba password = YourPassword hosts = 127.0.0.1 dbname = EmailServer_db query = SELECT 1 FROM Users_tbl WHERE Email='%s'
在/etc/postfix/mariadb-valias.cf
:
user = dba password = YourPassword hosts = 127.0.0.1 dbname = EmailServer_db query = SELECT Destination FROM Alias_tbl WHERE Source='%s'
最后,不要忘记将这些文件的权限更改为640:
# chmod 640 /etc/postfix/mariadb-vdomains.cf # chmod 640 /etc/postfix/mariadb-vusers.cf # chmod 640 /etc/postfix/mariadb-valias.cf
并将所有权归属于用户root和组postfix:
# chown root:postfix /etc/postfix/mariadb-vdomains.cf # chown root:postfix /etc/postfix/mariadb-vusers.cf # chown root:postfix /etc/postfix/mariadb-valias.cf
接下来,为了启用安全连接,我们需要确保取消注释以下设置(或在必要时添加)/etc/postfix/master.cf
:
submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - n n - - local #virtual unix - n n - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache
注意:以选项开头的行中的缩进-o
至关重要;否则后缀检查将返回错误:
保存更改之前,请在文件底部添加以下行:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
此时,必须检查 Postfix 是否有权访问数据库表以及我们在第 1 部分中创建的域、帐户和别名。
为此,我们将使用postmap命令,这是一个用于测试与 Postfix 在操作期间查找的表的通信的实用程序,但首先我们需要重新启动 postfix:
# systemctl postfix restart # postmap -q linuxnewz.com mysql:/etc/postfix/mariadb-vdomains.cf # postmap -q someotherdomain.com mysql:/etc/postfix/mariadb-vdomains.cf # postmap -q example@linuxnewz.com mysql:/etc/postfix/mariadb-vusers.cf # postmap -q linuxsay@linuxnewz.com mysql:/etc/postfix/mariadb-vusers.cf # postmap -q gacanepa@linuxnewz.com mysql:/etc/postfix/mariadb-vusers.cf # postmap -q info@linuxnewz.com mysql:/etc/postfix/mariadb-valias.cf
在下图中,我们可以看到,对于数据库中的现有记录,返回1。否则,屏幕上不会显示任何内容。在别名检查的情况下,请注意返回别名映射到的实际电子邮件帐户:
请注意,我们不会针对每个电子邮件帐户设置的凭据进行身份验证,我们仅测试 Postfix 检测数据库中的这些记录的能力。
因此,如果您得到与上面不同的输出,请确保您在mariadb-vdomains.cf,mariadb-vusers.cf和mariadb-valias.cf(或您选择调用这些文件的任何名称)中使用有效的用户/密码对。
配置 Dovecot
作为IMAP / POP3服务器,Dovecot 为用户提供了一种通过邮件用户代理(MUA,或也称为客户端)(例如Thunderbird或Outlook)访问其邮件的方式。
首先,让我们创建一个用户和一个组来处理电子邮件(我们需要这个,因为我们的电子邮件帐户不与系统用户关联)。您可以使用其他UID和GID (除了我们下面使用的5000以外),只要它未被使用并且数字较大即可:
# groupadd -g 5000 vmail # useradd -g vmail -u 5000 vmail -d /home/vmail -m
Dovecot 的设置分布在几个配置文件中(确保以下行被取消注释和/或编辑它们以匹配下面指示的设置)。
在/etc/dovecot/dovecot.conf
:
!include_try /usr/share/dovecot/protocols.d/*.protocol protocols = imap pop3 lmtp !include conf.d/*.conf !include_try local.conf
在/etc/dovecot/conf.d/10-auth.conf
(仅通过 SQL 启用身份验证并将其他身份验证方法注释掉)中:
disable_plaintext_auth = yes auth_mechanisms = plain login !include auth-sql.conf.ext
在(请注意,我们将把电子邮件存储在/home/vmail内名为yourdomain.com/etc/dovecot/conf.d/auth-sql.conf.ext
的目录中,如果该目录不存在,则需要创建该目录。在我们的例子中,我们执行了mkdir /home/vmail/linuxnewz.com来管理该域的电子邮件):
passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir }
当首次收到用户帐户的电子邮件时,将创建该帐户的单独收件箱。
在/etc/dovecot/conf.d/10-mail.conf
:
mail_location = maildir:/home/vmail/%d/%n/Maildir namespace inbox { inbox = yes } mail_privileged_group = mail mbox_write_locks = fcntl
在/etc/dovecot/conf.d/10-master.conf
:
service imap-login { inet_listener imap { port = 143 } inet_listener imaps { } } service pop3-login { inet_listener pop3 { port = 110 } inet_listener pop3s { } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail } user = dovecot } service auth-worker { user = vmail } service dict { unix_listener dict { } }
在/etc/dovecot/conf.d/10-ssl.conf
(如果您打算使用 CA 签名的证书,请替换证书和密钥路径):
ssl = required ssl_cert = </etc/pki/dovecot/certs/dovecot.pem ssl_key = </etc/pki/dovecot/private/dovecot.pem
输入您的数据库信息和在第 1 部分/etc/dovecot/dovecot-sql.conf.ext
中创建的管理用户的凭据。
重要提示:如果您的密码包含星号(#)
,则需要按照以下示例所示将连接字符串括起来:
driver = mysql connect = "host=127.0.0.1 dbname=EmailServer_db user=dba password=PassWith#Here" default_pass_scheme = SHA512-CRYPT password_query = SELECT Email as User, password FROM Users_tbl WHERE Email='%u';
此外,您可以将 Dovecot 的日志记录配置为与 Postfix 分开/etc/dovecot/conf.d/10-logging.conf
:
log_path = /var/log/dovecot.log
最后,确保用户dovecot可以访问 Dovecot 日志:
# chown vmail:dovecot /var/log/dovecot.log # chmod 660 /var/log/dovecot.log
验证并修复 Postifix 配置并在防火墙中启用 SMTP、POP3 和 IMAP
如果您在配置 Postfix 和/或 Dovecot 时遇到任何问题,您可以用以下命令获取配置摘要(仅限未注释的行),而不必提交所有配置文件来寻求帮助:
# postconf –n # Summary for /etc/postfix/main.cf # postconf –M # Summary for /etc/postfix/master.cf # doveconf –n # Summary of all configuration files for Dovecot
此外,请确保电子邮件收件箱仅可由vmail读取:
# chown –R vmail:vmail /home/vmail
配置文件也应该可以被vmail和dovecot用户读取:
# chown -R vmail:dovecot /etc/dovecot # chmod -R o-rwx /etc/dovecot
最后,确保通过防火墙启用SMTP、POP3和IMAP :
# firewall-cmd --add-port=143/tcp # firewall-cmd --add-port=143/tcp --permanent # firewall-cmd --add-port=110/tcp # firewall-cmd --add-port=110/tcp --permanent # firewall-cmd --add-port=587/tcp # firewall-cmd --add-port=587/tcp --permanent
将 Thunderbird 配置为 Postfix 的电子邮件客户端
通过防火墙保护电子邮件通信所用端口的访问权限后,就可以配置电子邮件客户端了。使用example@linuxnewz.com及其对应的密码,以及mail.linuxnewz.com作为 IMAP(或 POP3)和 SMTP 服务器,我们就可以开始向该帐户发送和接收电子邮件了:
您可以放心地忽略显示的警告消息,因为您使用的证书不是由受信任的第三方 CA 签名的:
让我们撰写一封简短的测试电子邮件并单击“发送”:
当提示接受传出服务器的自签名证书时,请像之前一样确认:
最后,转到目标电子邮件,查看是否收到了刚刚发送的电子邮件。如果是,请回复它,看看它是否被送回源电子邮件收件箱(否则,请参阅/var/log/maillog上的 Postfix 日志或/var/log/dovecot.log上的 Dovecot 日志以获取故障排除信息):
您现在拥有一个可正常运行的 Postfix 和 Dovecot 电子邮件服务器,可以开始发送和接收电子邮件。
概括
在本文中,我们解释了如何配置 Postfix 和 Dovecot 来处理 Linux 服务器中的电子邮件流量。如果某些操作无法按照本文所述进行,请务必花时间查看 Postfix和Dovecot文档。
请注意,虽然设置 Postfix 邮件服务器不是一件容易的事,但对于每个系统管理员来说,这都是一次有益的经历。
如果在阅读完文档之后,您仍然发现自己在使用Postfix和/或Dovecot时遇到困难,请随时通过下面的评论表给我们留言,我们将很乐意为您提供帮助(请不要忘记将 Postfix 和 Dovecot 配置上传到在线存储服务,如本文所述,使用postconf和doveconf检索到)。