如何使用Postfix、Dovecot、MySQL和SpamAssassin配置邮件服务器
介绍
在本教程中,我们将在 Ubuntu 12.04 上使用 Postfix、Dovecot、MySQL 和 SpamAssassin 配置邮件服务器。
按照本教程,您将能够添加虚拟域、用户和别名。 此外,您的虚拟服务器将不受垃圾邮件中心的影响。
先决条件
在设置您的邮件服务器之前,您的 VPS 必须具备以下条件:
- 域正在转发到您的服务器 (setup domain)
- MySQL 安装和配置 (setup mysql)
* 用户root 权限(设置新用户 - 省略步骤 5)*配置和识别您的 FQDN(设置 FQDN)
可选:SSL证书(设置免费签名ssl证书)
可选(以root用户登录)
以 root 用户身份安装软件包很有用,因为您拥有所有权限。
sudo -i
介绍您的用户密码。 一旦'成功,您将看到$
符号变为#
。
第 1 步:安装软件包
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
当提示 Postfix 配置时,选择 Internet 站点:
后缀配置将询问系统邮件名称——您可以使用您的 FDQN 或主域。
第 2 步:创建 MySQL 数据库、虚拟域、用户和别名
安装完成后,我们将创建一个 MySQL 数据库来配置三个不同的表:一个用于域,一个用于用户,最后一个用于别名。
我们将数据库命名为 servermail
,但您可以使用任何您想要的名称。
创建服务器邮件数据库:
mysqladmin -p create servermail
以 MySQL root 用户身份登录
mysql -u root -p
输入你的 MySQL root 密码; 如果成功,您将看到:
mysql >
首先,我们需要创建一个新用户,专门用于邮件身份验证,我们将授予 SELECT 权限。
mysql > GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';
之后,我们需要重新加载 MySQL 权限以确保它成功应用这些权限:
mysql > FLUSH PRIVILEGES;
最后我们需要使用数据库创建表并引入我们的数据:
mysql> USE servermail;
我们将为识别为授权域的特定域创建一个表。
CREATE TABLE `virtual_domains` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们将创建一个表来介绍用户。 在这里,您将添加电子邮件地址和密码。 有必要将每个用户与域相关联。
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;
最后,我们将创建一个虚拟别名表来指定您要转发到另一封电子邮件的所有电子邮件。
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)。
INSERT INTO `servermail`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'example.com'), ('2', 'hostname.example.com');
虚拟电子邮件
我们将介绍为每个域关联的电子邮件地址和密码。 确保使用您的特定信息更改所有信息。
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');
虚拟别名
我们将介绍我们要转发到另一个电子邮件地址(目标)的电子邮件地址(源)。
INSERT INTO `servermail`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'alias@example.com', 'email1@example.com');
退出 MySQL
mysql > exit
第 3 步:配置 Postfix
我们将配置 Postfix 来处理 SMTP 连接并为 MySQL 数据库中引入的每个用户发送消息。
首先,我们需要创建默认文件的副本,以防您想恢复到默认配置。
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
打开 main.cf 文件进行修改:
nano /etc/postfix/main.cf
首先,我们需要注释 TLS 参数并附加其他参数。 在本教程中,我们使用免费 SSL 证书和教程中建议的路径(link),但您可以根据个人配置进行修改。
# 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 设置下方附加以下参数:
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 表中的虚拟域。
#mydestination = example.com, hostname.example.com, localhost.example.com, localhost mydestination = localhost
验证是否使用您的 FQDN 设置了 myhostname 参数。
myhostname = hostname.example.com
附加以下行以将本地邮件传递到 MySQL 表中列出的所有虚拟域。
virtual_transport = lmtp:unix:private/dovecot-lmtp
最后,我们需要添加这三个参数来告诉 Postfix 配置虚拟域、用户和别名。
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
文件。 有必要根据您的个人配置更改这些值。
nano /etc/postfix/mysql-virtual-mailbox-domains.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_domains WHERE name='%s'
然后我们需要重启 Postfix。
service postfix restart
我们需要确保 Postfix 找到您的域,因此我们需要使用以下命令对其进行测试。 如果成功,它应该返回 1:
postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
然后我们需要创建 mysql-virtual-mailbox-maps.cf 文件。
nano /etc/postfix/mysql-virtual-mailbox-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_users WHERE email='%s'
我们需要重新启动 Postfix。
service postfix restart
此时,我们将确保 Postfix 使用以下命令找到您的第一个电子邮件地址。 如果成功,它应该返回 1:
postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
最后,我们将创建最后一个文件来配置 Postfix 和 MySQL 之间的连接。
nano /etc/postfix/mysql-virtual-alias-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT destination FROM virtual_aliases WHERE source='%s'
重启后缀
service postfix restart
我们需要验证 Postfix 是否可以找到您的别名。 输入以下命令,它应该返回转发到别名的邮件:
postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
如果要启用 587 端口与电子邮件客户端安全连接,则需要修改 /etc/postfix/master.cf 文件
nano /etc/postfix/master.cf
我们需要取消注释这些行并附加其他参数:
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 以确保端口 587 是开放的。
service postfix restart
注意:您可以使用此工具扫描您的域端口并验证端口 25 和 587 是否打开(http://mxtoolbox.com/SuperTool.aspx)
第 4 步:配置 Dovecot
我们将复制我们要修改的 7 个文件,以便您可以在需要时将其恢复为默认值。 一一输入以下命令:
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 编辑配置文件。
nano /etc/dovecot/dovecot.conf
验证此选项未注释。
!include conf.d/*.conf
我们将在 !include_try /usr/share/dovecot/protocols.d/*.protocol line
下方启用协议(如果需要,添加 pop3)。
!include_try /usr/share/dovecot/protocols.d/*.protocol protocols = imap lmtp
注意:将这些更改与此文件进行比较以检测错误或错误:
https://www.dropbox.com/s/wmbe3bwy0vcficj/etc-dovecot-dovecot.conf.txt
然后我们要编辑邮件配置文件:
nano /etc/dovecot/conf.d/10-mail.conf
找到 mail_location
行,取消注释,并输入以下参数:
mail_location = maildir:/var/mail/vhosts/%d/%n
找到 mail_privileged_group
行,取消注释,然后添加 mail 参数,如下所示:
mail_privileged_group = mail
注意:将这些更改与此文件进行比较以检测错误或错误:
https://www.dropbox.com/s/hnfeieuy77m5b0a/etc.dovecot.conf.d-10-mail.conf.txt
验证权限
输入此命令:
ls -ld /var/mail
确保权限是这样的:
drwxrwsr-x 3 root vmail 4096 Jan 24 21:23 /var/mail
我们将为我们在 MySQL 表中注册的每个域创建一个文件夹:
mkdir -p /var/mail/vhosts/example.com
创建一个 id 为 5000 的 vmail 用户和组
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/mail
我们需要将 /var/mail
文件夹的所有者更改为 vmail 用户。
chown -R vmail:vmail /var/mail
然后我们需要编辑/etc/dovecot/conf.d/10-auth.conf
文件:
nano /etc/dovecot/conf.d/10-auth.conf
取消注释纯文本身份验证并添加以下行:
disable_plaintext_auth = yes
修改auth_mechanisms
参数:
auth_mechanisms = plain login
评论这一行:
#!include auth-system.conf.ext
通过取消注释此行来启用 MySQL 授权:
!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 文件:
nano /etc/dovecot/conf.d/auth-sql.conf.ext
在文件中输入以下代码:
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
文件:
nano /etc/dovecot/dovecot-sql.conf.ext
取消注释驱动参数并将mysql设置为参数:
driver = mysql
取消注释连接行并介绍您的 MySQL 特定信息:
connect = host=127.0.0.1 dbname=servermail user=usermail password=mailpassword
取消注释 default_pass_scheme
行并将其更改为 SHA-512
。
default_pass_scheme = SHA512-CRYPT
取消注释 password_query
行并添加以下信息:
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 用户:
chown -R vmail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot
打开并修改/etc/dovecot/conf.d/10-master.conf
文件(注意参数会不同)。
nano /etc/dovecot/conf.d/10-master.conf ##Uncomment inet_listener_imap and modify to port 0 service imap-login { inet_listener imap { port = 0 } #Create LMTP socket and this configurations service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} }
将 unix_listener
参数修改为 service_auth
如下:
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
:
service auth-worker { # Auth worker process is run as root by default, so that it can access # /etc/shadow. If this isn't necessary, the user should be changed to # $default_internal_user. user = vmail }
注意:将这些更改与此文件进行比较以检测错误或错误:
https://www.dropbox.com/s/g0vnt233obh6v2h/etc.dovecot.conf.d.10-master.conf.txt
最后,我们将从 Dovecot 修改 SSL 配置文件(如果您要使用默认配置,请跳过此步骤)。
# nano /etc/dovecot/conf.d/10-ssl.conf
将 ssl 参数更改为必需:
ssl = required
并修改 ssl_cert
和 ssl_key
的路径:
ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem
重启鸽舍
service dovecot restart
您应该检查端口 993 是否打开并且工作(如果您启用 pop3;您还应该检查端口 995)。
telnet example.com 993
恭喜。您已经成功配置了您的邮件服务器,您可以使用电子邮件客户端测试您的帐户:
- Username: email1@example.com - Password: email1's password - IMAP: example.com - SMTP: example.com
注意:安全 IMAP 使用端口 993,SMTP 使用端口 587 或 25。
第 5 步:配置 SpamAssassin
首先我们需要安装 SpamAssassin。
apt-get install spamassassin spamc
然后我们需要为 SpamAssassin 创建一个用户。
adduser spamd --disabled-login
要成功配置 SpamAssassin,需要打开并修改配置设置。
nano /etc/default/spamassassin
我们需要更改 ENABLED
参数以启用 SpamAssassin 守护程序。
ENABLED=1
我们需要配置 home 和 options 参数。
SPAMD_HOME="/home/spamd/" OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"
然后我们需要像这样指定 PID_File
参数:
PIDFILE="${SPAMD_HOME}spamd.pid"
最后,我们需要指定 SpamAssassin 的规则将自动更新。
CRON=1
注意:将这些更改与此文件进行比较以检测错误或错误:
https://www.dropbox.com/s/ndvpgc2jipdd4bk/etc.default.spamassassin.txt
我们需要打开/etc/spamassassin/local.cf
来设置反垃圾邮件规则。
nano /etc/spamassassin/local.cf
SpamAssassin 将对每封邮件进行评分,如果它在垃圾邮件检查中确定该邮件大于 5.0,则自动将其视为垃圾邮件。 您可以使用以下参数来配置反垃圾邮件规则:
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 /etc/postfix/master.cf
文件,告诉它每封电子邮件都将使用 SpamAssassin 进行检查。
nano /etc/postfix/master.cf
然后我们需要找到以下行并添加 spamassassin 过滤器:
smtp inet n - - - - smtpd -o content_filter=spamassassin
最后,我们需要附加以下参数:
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
有必要启动 SpamAssassin 并重新启动 Postfix 以开始验证来自电子邮件的垃圾邮件。
service spamassassin start service postfix restart
恭喜! 您已成功设置您的邮件服务器,使用 Postfix 和 Dovecot,使用 MySQL 身份验证和 SpamAssassin 过滤垃圾邮件!