如何配置邮件服务器使用Stapling,Dovecot,MySQL和SpamAssassin

在本教程中,我们将使用配置Postfix的,Dovecot,MySQL和SpamAssassin的在Ubuntu 12.04邮件服务器。

介绍

在本教程中,我们将在Ubuntu 12.04上使用Postfix,Dovecot,MySQL和SpamAssassin配置邮件服务器。 按照本教程,您将能够添加虚拟域,用户和别名。此外,您的虚拟服务器将安全从垃圾邮件中心。

先决条件

在设置邮件服务器之前,您的VPS必须具有以下功能: *域名被转发到你的服务器( 安装域 ) * MySQL的安装和配置( 安装的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站点:


Stapling配置将询问系统邮件名称 - 您可以使用您的FDQN或主域。


第2步:创建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

第3步:配置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'
重新启动Stapling
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
我们要实现以下协议(如果要添加POP3) !include_try /usr/share/dovecot/protocols.d/*.protocol line

!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_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文件夹中的语音邮件的用户。
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
} 
我们需要修改/etc/dovecot/dovecot-sql.conf.ext文件,我们自定义的MySQL的信息:
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_certssl_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,端口587或25用于SMTP。

第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
我们需要更改Stapling/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的!