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

提供:ZStack云计算

内容介绍

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

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

先决条件

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

可选: 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))), '[email protected]'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');

虚拟别名

我们需要引入各邮箱地址(来源),指向这些邮箱的邮件都将被转发到其它邮箱(目的地)。

INSERT INTO `servermail`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', '[email protected]', '[email protected]');

退出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 [email protected] 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 [email protected] 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: [email protected]
- 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

猜你喜欢

转载自blog.csdn.net/zstack_org/article/details/71514332