如何使用Postfix、Dovecot、MySQL和SpamAssassin配置邮件服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

按照本教程,您将能够添加虚拟域、用户和别名。 此外,您的虚拟服务器将不受垃圾邮件中心的影响。

先决条件

在设置您的邮件服务器之前,您的 VPS 必须具备以下条件:

* 用户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_certssl_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 过滤垃圾邮件!