介绍
在 Ubuntu 20.04,您可以使用类似于 Postfix, Dovecot, MySQL 和 SpamAssassin 的工具来配置邮件服务器。对于第一次尝试的人来说,这个过程可能会令人困惑。本教程旨在通过详细的步骤为您简化邮件服务器的配置过程。在本教程结束时,您将了解如何添加虚拟域、用户和别名。最终,您将使您的虚拟服务器更安全,免受垃圾邮件集散地的侵害。
前提条件
在开始配置邮件服务器之前,需要处理一些前提条件。首先,确保您的虚拟专用服务器有一个指向您服务器的域名。您还需要安装并配置 MySQL。此外,您需要拥有一个被授予 root 权限的用户 并 安装 SSL 证书。最后,确保您的 FQDN 已配置并识别。
如果您以 root 用户身份安装软件包,您将拥有所有权限。这就是我们推荐它的原因:
|
1 |
sudo -i |
输入您的用户密码。此时,您将看到 $ 符号变为 #。接下来,让我们逐一探索配置的不同方面。
步骤 1:安装软件包
我们将首先学习如何安装软件包:
|
1 |
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql |
当弹出 Postfix 配置时,选择 Internet Site:

系统会询问您关于 System mail 名称。在这里,您可以使用 FQDN 或主域名:

步骤 2:创建 MySQL 数据库、虚拟域、用户和别名
接下来,一旦安装了所有软件包,我们将继续进行配置。我们的目标是配置三个表。一个用于域,一个用于用户,一个用于别名。这些将保存在我们将要创建的 MySQL 数据库中。
假设我们想将数据库命名为 servermail。您可以自由选择您喜欢的名称。以下是我们的创建方法:
|
1 |
mysqladmin -p create servermail |
您必须以 MySQL root 用户身份登录:
|
1 |
mysql -u root -p |
然后,输入您的密码。成功后将显示如下结果:
|
1 |
mysql > |
接下来,我们将专门为邮件认证创建一个新用户。像这样赋予 SELECT 权限:
|
1 |
mysql > GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword'; |
之后,重新加载您的 MySQL 权限以成功应用这些权限:
|
1 |
mysql > FLUSH PRIVILEGES; |
接下来,我们将使用我们的数据库来创建表并输入数据:
|
1 |
mysql> USE servermail; |
我们将为被识别为授权域的特定域创建单独的表:
|
1 2 3 4 5 |
CREATE TABLE `virtual_domains` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
目标是将用户引入表中。因此,我们将添加相关的电子邮件地址和密码。请记住,您必须将每个用户与一个域相关联:
|
1 2 3 4 5 6 7 8 9 |
CREATE TABLE `virtual_users` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT NOT NULL, `password` VARCHAR(106) NOT NULL, `email` VARCHAR(120) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
接下来,我们将为所有虚拟别名创建一个表,以指定我们将转发到另一个电子邮件的所有电子邮件:
|
1 2 3 4 5 6 7 8 |
CREATE TABLE `virtual_aliases` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
在此过程结束时,您将成功创建三个表。接下来,我们必须导入数据。
-
虚拟域名
在本节中,我们将学习如何在
中导入域名virtual_domains 表中。具体来说,我们将重点介绍如何导入主域名(example.com)和 FQDN (hostname.example.com):
|
1 2 3 4 5 |
INSERT INTO `servermail`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'example.com'), ('2', 'hostname.example.com'); |
-
虚拟电子邮件
接下来,输入每个域名的电子邮件地址和相关密码。确保将所有信息更改为您自己的特定信息:
|
1 2 3 4 5 |
INSERT INTO `servermail`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'), ('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com'); |
-
虚拟别名
现在您可以导入要将另一个电子邮件地址转发到的电子邮件地址。前者是源,而后者是目的地址:
|
1 2 3 4 |
INSERT INTO `servermail`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'alias@example.com', 'email1@example.com'); |
然后,您可以退出 MySQL:
|
1 |
mysql > exit |
Step 3: Configuring Postfix
配置 Postfix 非常重要,以便它可以管理 SMTP 连接。它还必须能够为 MySQL 数据库中输入的所有用户发送邮件。让我们首先备份默认文件。这样,您就可以在需要时轻松恢复到默认配置:
|
1 |
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig |
现在打开 main.cf 文件以进行修改:
|
1 |
nano /etc/postfix/main.cf |
首先注释掉 TLS 参数,然后追加任何其他参数。在我们的示例中,我们使用的是免费 SSL 证书。当然,您可以根据自己的要求更改配置:
|
1 2 3 4 5 6 7 8 9 10 11 |
# TLS parameters #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key #smtpd_use_tls=yes #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem smtpd_tls_key_file=/etc/ssl/private/dovecot.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes |
接下来,您将在 TLS 设置下方追加这些参数:
|
1 2 3 4 5 6 7 |
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination |
之后,我们必须注释掉 mydestination默认设置。然后,我们将用 替换它localhost。进行此更改后,VPS 将能够使用 MySQL 表中的虚拟域:
|
1 2 |
#mydestination = example.com, hostname.example.com, localhost.example.com, localhost mydestination = localhost |
现在使用此命令来验证 myhostname 参数已在您的 FQDN 中设置:
|
1 |
myhostname = hostname.example.com |
此外,追加此行以激活对表中列出的所有虚拟域的本地邮件投递:
|
1 |
virtual_transport = lmtp:unix:private/dovecot-lmtp |
最后,我们将添加以下参数,以指示 Postfix 配置虚拟域、用户和别名:
|
1 2 3 |
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf |
为确保没有错误,请将这些更改与以下文件进行对比:
https://www.dropbox.com/s/x9fpm9v1dr86gkw/etc-postfix-main.cf.txt
检查完所有这些后,您将创建三个文件以追加到 main.cf 文件中。这里的目的是向 Postfix 提供如何连接 MySQL 的指令。为此,我们将首先创建 mysql-virtual-mailbox-domains.cf 文件。当然,在您的文件中,您将根据您的个人配置进行更改:
|
1 |
nano /etc/postfix/mysql-virtual-mailbox-domains.cf |
|
1 2 3 4 5 |
user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_domains WHERE name='%s' |
接下来,重启 Postfix:
|
1 |
service postfix restart |
您必须确保 Postfix 能够找到您的域名。要对此进行测试,请使用此命令:
|
1 |
postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf |
如果成功,该命令将返回 1。在这种情况下,您可以通过创建 mysql-virtual-mailbox-maps.cf 文件来进行处理:
|
1 |
nano /etc/postfix/mysql-virtual-mailbox-maps.cf |
|
1 2 3 4 5 |
user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_users WHERE email='%s' |
再次重启 Postfix:
|
1 |
service postfix restart |
同样,我们将确保 Postfix 能够找到第一个电子邮件地址。要对此进行测试,请使用以下命令:
|
1 |
postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf |
如果成功,您将获得返回值 1。因此,我们将继续创建最后一个文件:
|
1 |
nano /etc/postfix/mysql-virtual-alias-maps.cf |
|
1 2 3 4 5 |
user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT destination FROM virtual_aliases WHERE source='%s' |
这就完成了 Postfix 和 MySQL 之间的配置。重启 Postfix 以应用:
|
1 |
service postfix restart |
要确认 Postfix 确实找到了您的别名,请使用此命令:
|
1 |
postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf |
理想情况下,您应该会收到转发到该别名的邮件作为输出。您也可以像这样修改 /etc/postfix/master.cf 文件,如果您想连接端口 587 以便与邮件客户端安全连接:
|
1 |
nano /etc/postfix/master.cf |
以下是如何取消注释某些行并追加参数:
|
1 2 3 4 5 |
submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject |
有时,您可能需要重启 Postfix 以确认端口已打开:
|
1 |
service postfix restart |
此工具 也可以用来扫描域名端口。您可以使用它来验证端口 25 和 587 是否已打开。
步骤 4:配置 Dovecot
现在是配置 Dovecot 的时候了。在这一部分中,我们将必须复制您要修改的 7 个文件。这是为了确保您在需要时可以恢复。逐个输入以下命令:
|
1 2 3 4 5 6 |
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig |
您必须编辑 Dovecot 的配置文件:
|
1 |
nano /etc/dovecot/dovecot.conf |
确保该选项已取消注释:
|
1 |
!include conf.d/*.conf |
接下来,我们将启用以下行下方的协议:
!include_try /usr/share/dovecot/protocols.d/*.protocol 行。如果需要,您还可以添加 pop3:
|
1 2 |
!include_try /usr/share/dovecot/protocols.d/*.protocol protocols = imap lmtp |
为确保没有错误,请将其与此文件进行比较:
https://www.dropbox.com/s/wmbe3bwy0vcficj/etc-dovecot-dovecot.conf.txt
接下来,编辑邮件配置文件:
|
1 |
nano /etc/dovecot/conf.d/10-mail.conf |
找到 mail_location 行。您需要取消注释它并添加此参数:
|
1 |
mail_location = maildir:/var/mail/vhosts/%d/%n |
之后,找到 mail_privileged_group 行。同样,取消注释它并添加 mail 参数:
|
1 |
mail_privileged_group = mail |
为了消除任何出错的可能性,请将其与此文件进行比较:
https://www.dropbox.com/s/hnfeieuy77m5b0a/etc.dovecot.conf.d-10-mail.conf.txt
-
验证权限
要验证权限,请使用此命令:
|
1 |
ls -ld /var/mail |
确保您的权限显示如下:
|
1 |
drwxrwsr-x 3 root vmail 4096 Jan 24 21:23 /var/mail |
您可以为每个域名创建一个文件夹。所有这些文件夹都将注册在 MySQL 表中:
|
1 |
mkdir -p /var/mail/vhosts/example.com |
使用 ID 创建 vmail 用户和组:5000:
|
1 2 |
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/mail |
接下来,您必须更改以下目录的所有者: /var/mail 文件夹的所有者为 vmail 用户:
|
1 |
chown -R vmail:vmail /var/mail |
现在编辑 /etc/dovecot/conf.d/10-auth.conf 文件:
|
1 |
nano /etc/dovecot/conf.d/10-auth.conf |
取消注释纯文本身份验证后,添加以下行:
|
1 |
disable_plaintext_auth = yes |
使用此项来修改 auth_mechanisms 参数:
|
1 |
auth_mechanisms = plain login |
现在注释掉这一行:
|
1 |
#!include auth-system.conf.ext |
要启用 MySQL 授权,您必须取消注释以下行:
|
1 |
!include auth-sql.conf.ext |
要检测和修改错误,请使用以下文件:
https://www.dropbox.com/s/4h472nqrj700pqk/etc.dovecot.conf.d.10-auth.conf.txt
使用您的信息创建一个 /etc/dovecot/dovecot-sql.conf.ext 文件将允许您进行身份验证:
|
1 |
nano /etc/dovecot/conf.d/auth-sql.conf.ext |
在文件中输入以下代码:
|
1 2 3 4 5 6 7 8 9 |
passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n } |
我们将使用自定义的 MySQL 信息来修改 /etc/dovecot/dovecot-sql.conf.ext 文件:
|
1 |
nano /etc/dovecot/dovecot-sql.conf.ext |
取消注释 driver 参数后,将 MySQL 设置为该参数,如下所示:
|
1 |
driver = mysql |
您可以通过取消注释 connect 行来引入您的 MySQL 特定信息:
|
1 |
connect = host=127.0.0.1 dbname=servermail user=usermail password=mailpassword |
现在您必须取消注释 default_pass_scheme 行并将其更改为 SHA-512:
|
1 |
default_pass_scheme = SHA512-CRYPT |
取消注释 password_query:
|
1 |
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'; |
要检测错误,请使用此文件进行对比:
https://www.dropbox.com/s/48a5r0mtgdz25cz/etc.dovecot.dovecot-sql.conf.ext.txt
接下来,您可以将 dovecot 文件夹的所有者和群组更改为 vmail 用户:
|
1 2 |
chown -R vmail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot |
下一步是修改 /etc/dovecot/conf.d/10-master.conf 文件。您在这里需要格外小心,因为将更改不同的参数:
|
1 |
nano /etc/dovecot/conf.d/10-master.conf |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
##取消注释 inet_listener_imap 并修改为端口 0 service imap-login { inet_listener imap { port = 0 } #创建 LMTP 套接字和此配置 service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } #inet_listener lmtp { # 避免让整个互联网都能访问 LMTP #address = #port = #} } |
使用以下代码将 unix_listener 参数更改为 service_auth:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail #group = } #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} user = dovecot } |
接下来,您必须编辑 service auth-worker 如下所示:
|
1 2 3 4 5 6 |
service auth-worker { # 默认情况下,认证工作进程以 root 身份运行,以便它可以访问 # /etc/shadow。如果不需要这样,应将用户更改为 # $default_internal_user。 user = vmail } |
通过与此文件进行对比来检测错误:
https://www.dropbox.com/s/g0vnt233obh6v2h/etc.dovecot.conf.d.10-master.conf.txt
下一步是修改 Dovecot 的 SSL 配置文件。如果您打算使用默认配置,可以跳过此步骤,直接进入下一节:
|
1 |
# nano /etc/dovecot/conf.d/10-ssl.conf |
接下来,将 ssl 参数更改为 required,如下所示:
|
1 |
ssl = required |
我们还将修改以下两者的路径: ssl_cert 和 ssl_key:
|
1 2 |
ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem |
重启 Dovecot:
|
1 |
service dovecot restart |
请务必检查端口 993 是否已打开。如果您已启用 pop3,那么还要检查端口 995:
|
1 |
telnet example.com 993 |
如果您已经完成了到目前为止的所有步骤,恭喜您!您已成功配置了邮件服务器。为了确保您正确执行了所有步骤,您可以使用如下所示的电子邮件客户端来测试您的帐户:
|
1 2 3 4 |
- 用户名: email1@example.com - 密码: email1'的 密码 - IMAP: example.com - SMTP: example.com |
端口 993 用于安全 IMAP,而端口 587/端口 25 用于 SMTP。
第 5 步:配置 SpamAssassin
我们终于来到了本教程的最后一个部分,在这里我们将配置 SpamAssassin。我们首先安装 SpamAssassin:
|
1 |
apt-get install spamassassin spamc |
像这样为 SpamAssassin 创建一个用户:
|
1 |
adduser spamd --disabled-login |
您必须打开并修改配置设置才能配置 SpamAssassin:
|
1 |
nano /etc/default/spamassassin |
现在您已到达此处,必须更改 ENABLED 参数以启用 SpamAssassin 守护进程:
|
1 |
ENABLED=1 |
使用此代码修改 home 和 options 参数:
|
1 2 |
SPAMD_HOME="/home/spamd/" OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log" |
使用此行来指定 PID_File 参数:
|
1 |
PIDFILE="${SPAMD_HOME}spamd.pid" |
接下来,使用此命令指示 SpamAssassin 的规则将自动更新:
|
1 |
CRON=1 |
通过与以下文档进行对比来检查错误:
https://www.dropbox.com/s/ndvpgc2jipdd4bk/etc.default.spamassassin.txt
如果您想设置反垃圾邮件规则,则必须再次打开 /etc/spamassassin/local.cf 文件:
|
1 |
nano /etc/spamassassin/local.cf |
SpamAssassin 的工作原理是对用户收到的每封邮件进行评分。它会评估邮件的分数,如果其垃圾邮件检查得分大于 5.0,该邮件就会被标记为垃圾邮件。以下是可用于配置这些反垃圾邮件规则的参数:
|
1 2 3 4 5 6 7 8 9 10 |
rewrite_header Subject ***** SPAM _SCORE_ ***** report_safe 0 required_score 5.0 use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 skip_rbl_checks 0 use_razor2 0 use_dcc 0 use_pyzor 0 |
反垃圾邮件规则设置完成后,您需要告诉 Postfix 每一封电子邮件都要使用 SpamAssassin 进行检查。为此,我们需要修改 /etc/postfix/master.cf 文件:
|
1 |
nano /etc/postfix/master.cf |
找到以下行并添加 spamassassin 过滤器:
|
1 2 |
smtp inet n - - - - smtpd -o content_filter=spamassassin |
现在您可以追加这些参数:
|
1 2 3 |
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} |
最后,启动 SpamAssassin 并重启 Postfix 以应用更改。重新启动后,Postfix 将开始验证电子邮件中的垃圾邮件:
|
1 2 |
service spamassassin start service postfix restart |
就是这样!您已成功使用 Postfix 和 Dovecot 配置了您的邮件服务器。您还执行了 MySQL 身份验证,并使用 SpamAssassin 设置了垃圾邮件过滤。
结论
本教程概述了使用上述工具配置邮件服务器所需遵循的步骤。它可以作为您独立设置邮件服务器的全面指南。如果您有兴趣利用 Google 的 SMTP 服务器功能,请跟随本教程进行操作.
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。