您的位置:首页 > 数据库 > MySQL

如何利用Postfix、Dovecot、MySQL与SpamAssassin配置一套邮件服务器

2017-05-10 09:32 671 查看
提供:ZStack云计算

内容介绍

在本教程中,我们将利用Postfix、Dovecot、MySQL与SpamAssassin在Ubuntu 12.04上配置一套邮件服务器。

遵循本教程的内容,大家将能够添加虚拟域、用户及别名。另外,大家的虚拟服务器还将拥有抵御垃圾邮件来源的能力。

先决条件

在开始设置邮件服务器之前,大家的VPS必须满足以下要求:

域名指向您的服务器(设置域名)

MySQL安装并配置完成(设置mysql)

用户拥有root权限(setup新用户-中的第五步)

*配置并指定你的FQDN (设置FQDN)

可选: SSL证书(设置免费的签名SSL证书)

可选(以root用户登录)

首先作为root用户安装软件包,这能为大家提供全部必要权限。

sudo -i


下面输入用户密码。成功之后,大家将看到¥号变更为#号。

第一步:安装软件包

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql


这时Postfix配置会弹出提示,要求选定互联网站点:

Postfix配置要求分配System邮件名称——大家可以直接使用FDQN或者主域名。

第二步:创建一套MySQL数据库、虚拟域、用户与别名

在安装工作结束后,我们需要创建一套MySQL数据库来配置三套不同表:其一面向域、其一面向用户,最后则面向别名。

我们将该数据库命名为servermail,但大家也可以选择其它名称。

创建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


第三步:配置Postfix

我们需要配置Postfix来处理SMTP连接,同时为引入MySQL数据库内的每个用户发送消息。

首先,我们需要创建一套默认文件副本,以备后期默认配置恢复需要。

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig


打开main.cf文件并进行修改:

nano /etc/postfix/main.cf


首先,我们需要注释TLS参数及其它附加参数。在本示例中,我们将使用免费SSL证书以及(此链接)中推荐的路径,当然大家也可以根据实际配置进行修改。

# 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


确认将myhostname参数设置为我们的FQDN。

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'


重启Postfix:

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)。

第四步:配置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


在Devecot中编辑配置文件。

nano /etc/dovecot/dovecot.conf


确保此选项已被取消注释。

!include conf.d/*.conf


下面我们在!include_try /usr/share/dovecot/protocols.d/*.protocol行下启用各协议(如果需要,亦可添加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


创建一个vmail用户与id为5000的组:

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


取消driver参数注释并将其设定为mysql:

driver = mysql


取消以下connect行注释并引入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

将devecot文件夹拥有者与群变更为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

最后,我们对Devecot中的SSL证书文件进行修改(如果大家打算使用默认配置,则可跳过此步):

# nano /etc/dovecot/conf.d/10-ssl.conf


将ssl参数变更为required:

ssl = required


而后变更ssl_cert与ssl_key的路径:

ssl_cert = </etc/ssl/certs/dovecot.pem

ssl_key = </etc/ssl/private/dovecot.pem


重启Dovecot

service dovecot restart


检查后,现在端口993应该已经开启并开始运作(如果启用pop3,则应当检查端口995)。

telnet example.com 993


祝贺大家!现在我们已经成功配置了自己的邮件服务器,并可使用邮件客户端测评我们的账户:

- Username: email1@example.com
- Password: email1's password
- IMAP: example.com
- SMTP: example.com


注意:使用端口993以实现安全IMAP,SMTP则使用端口587或者25。

第五步:配置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会保存每一封邮件,如果邮件在spam检查中的得分高于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 filter:

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实现垃圾邮件过滤。大功告成!

本文来源自DigitalOcean Community。英文原文:How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin

翻译:diradw
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息