Postfix 邮件传输代理(MTA)是一种高性能的开源电子邮件服务器系统。本指南将帮助你在CentOS 6 Linode上运行 Postfix,使用 Dovecot 运行 IMAP / POP3 服务,使用 MySQL 存储有关虚拟域名和用户的信息。
在使用本指南之前,请确保你已按照入门指引进行操作并设置主机名。
注意 本指南中的步骤需要 root 权限。请务必执行
root
命令,或使用su - root
以 root 用户身份登录。以下某些命令无法执行sudo
,必须以 root 身份运行。
1.安装任何未完成的包更新:
yum update
2.CentOS 主存储库中包含的 Postfix 版本不包括对 MySQL 的支持; 因此,你需要从 CentOS Plus 存储库安装 Postfix。在此之前,为 Postfix 包添加排除到 [base]
和 [updates]
存储库中以防它从没有支持 MySQL 的更新中被改写:
/etc/yum.repos.d/CentOS-Base.repo1 2 3 4 5 6 7 8
[base] name=CentOS-$releasever - Base exclude=postfix # released updates [updates] name=CentOS-$releasever - Updates exclude=postfix
3.安装所需的包:
yum --enablerepo=centosplus install postfix yum install dovecot mysql-server dovecot-mysql
上述命令会安装 Postfix 邮件服务器,MySQL 数据库服务器,Dovecot IMAP 和 POP 守护程序,以及几个提供与身份验证相关服务的支持包。
接下来,设置 MySQL 数据库来处理虚拟域名和用户。
1.配置 MySQL 在开机时启动,然后启动 MySQL:
chkconfig mysqld on service mysqld start
2.执行命令 mysql_secure_installation
。你将有机会更改 MySQL root 密码,删除匿名用户帐户,禁用 localhost 之外的 root 登录,删除测试数据库以及重载权限表。建议你对这些选项回答 “yes”:
mysql_secure_installation
3.启动 MySQL shell:
mysql -u root -p
4.为邮件服务器创建一个数据库并切换到该数据库:
CREATE DATABASE mail; USE mail;
5.创建一个名为 mail_admin
邮件管理用户,并授予其对 mail
数据库的权限。请务必将mail_admin_password
使用强密码替换:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
6.创建虚拟域表:
CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
7.创建一个表来处理邮件转发:
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
8.创建 users表:
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
9.创建 transport 表:
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
10.退出MySQL shell:
quit
11.编辑 /etc/my.cnf
将 MySQL 绑定到 localhost(127.0.0.1),并将以下内容添加到文件中的[mysqld]
部分:
# /etc/my.cnf
bind-address=127.0.0.1
这是 Postfix 能够与数据库服务器通信所必需的。如果你将 MySQL 设置为侦听另一个IP地址(例如内部IP),则需要在 Postfix 配置步骤中替换 IP 地址 127.0.0.1
。不建议在可公开访问的 IP 地址上运行MySQL。
12.重启数据库服务器:
service mysqld restart
接下来,执行其他 Postfix 配置以设置与数据库的通信。
注意 对于接下来的四个步骤,请将
mail_admin_password
替换为之前输入的mail_admin
密码。
1.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_domains.cf
的虚拟域配置文件:
# /etc/postfix/mysql-virtual\_domains.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
2.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_forwardings.cf
的虚拟转发文件:
# /etc/postfix/mysql-virtual\_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
3.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_mailboxes.cf
的虚拟邮箱配置文件:
# /etc/postfix/mysql-virtual\_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,<'@'>,-1),'/',SUBSTRING_INDEX(email,<'@'>,1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
4.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_email2email.cf
的虚拟电子邮件映射文件:
# /etc/postfix/mysql-virtual\_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
5.为这些配置文件设置合适的权限和所有权:
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf
6.为邮件处理任务创建用户和组。所有虚拟邮箱都将存储在此用户的主目录下:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
7.完成 Postfix 配置所需的剩余步骤。请确保将 server.example.com
替换为 Linode 的完全合规的域名。如果你计划使用自己的 SSL 证书和密钥,请使用相应的路径替换/etc/pki/dovecot/private/dovecot.pem
:
postconf -e 'myhostname = server.example.com'
postconf -e 'mydestination = $myhostname, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'inet_interfaces = all'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = </etc/pki/dovecot/certs/dovecot.pem'
postconf -e 'smtpd_tls_key_file = </etc/pki/dovecot/private/dovecot.pem'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
postconf -e 'virtual_transport = dovecot'
postconf -e 'dovecot_destination_recipient_limit = 1'
8.编辑文件 /etc/postfix/master.cf
并将 Dovecot 服务添加到文件的底部:
# /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
9.配置 Postfix 在开机时启动,并首次启动服务:
chkconfig postfix on service postfix start
这样就完成了 Postfix 的配置。
1.将 /etc/dovecot/dovecot.conf
移至备份文件中:
mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup
2.将以下内容复制到新建的空文件 dovecot.conf
,在第37行中把 example.com
替换成系统的域名:
# /etc/dovecot/dovecot.conf
protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
namespace {
type = private
separator = .
prefix = INBOX.
inbox = yes
}
service auth {
unix_listener auth-master {
mode = 0600
user = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
user = root
}
service auth-worker {
user = root
}
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
3.MySQL 将用于存储密码信息,因此必须创建 /etc/dovecot/dovecot-sql.conf.ext
。将以下内容插入文件,确保将 mail_admin_password
替换为你的邮件密码:
# /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';
4.限制文件访问, 通过更改权限以允许 dovecot
组中的用户访问该文件,同时拒绝其他用户访问:
chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
chmod o= /etc/dovecot/dovecot-sql.conf.ext
5.配置 Dovecot 在开机时启动,并首次启动 Dovecot:
chkconfig dovecot on service dovecot start
6.检查日志 /var/log/maillog
以确保 Dovecot 的启动没有错误。你的日志中应该具有类似于以下内容的文本:
Mar 18 15:21:59 sothoryos postfix/postfix-script[3069]: starting the Postfix mail system
Mar 18 15:22:00 sothoryos postfix/master[3070]: daemon started -- version 2.6.6, configuration /etc/postfix
Mar 18 15:32:03 sothoryos dovecot: master: Dovecot v2.0.9 starting up (core dumps disabled)
7.测试你的 POP3 服务器以确保它正常运行:
yum install telnet telnet localhost pop3
8.终端应该会输出类似下方的结果:
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Dovecot ready.
9.输入命令 quit
返回 shell。这样就完成了 Dovecot 的配置。接下来,确保别名(aliases)得到正确配置。
1.编辑 /etc/aliases
确保 postmaster
和 postmaster
指令已为你的组织正确设置。
postmaster: root
root: postmaster@example.com
2.更新别名并重启 Postfix
newaliases
service postfix restart
到此完成别名配置。下一步请测试 Postfix 以确保它正常运转。
1.为 SMTP-AUTH 和 TLS 测试 Postfix:
telnet localhost 25
2.如果尚处于连接状态, 请发出以下命令:
ehlo localhost
3.你将看到类似下方的输出:
250-hostname.example.com
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
4.发送 quit
命令以终止远程登录连接。
下一步,在 MySQL 数据库中添加域名和邮件用户。
注意 在进行下面的步骤之前,通过添加指向邮件服务器的完全限定域名的 MX 记录,修改你希望处理的电子邮件的任何域名的DNS记录。如果你希望处理的电子邮件域名已存在 MX 记录,请删除它们或将它们设置为比邮件服务器更高的优先级。较小的优先级数字表示邮件传递的优先级较高,“0”是最高优先级。
在下方示例中,MySQL shell 用于添加对域名为 “example.com” 的支持,该域名将会有名为 “sales” 的电子邮件帐户。
1.登录 MySQL shell
mysql -u root -p
2.切换到 mail
数据库,添加对你域名的支持,并创建一个电子邮件帐户。请务必将 example.com
替换为你的域名,将 sales@example.com
替换为你所选择的电子邮箱,并用强密码替换 password
:
USE mail;
INSERT INTO domains (domain) VALUES ('example.com');
INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));
quit
3.在访问任何新创建的电子邮件帐户之前,需要发送测试邮件以创建该用户的邮箱:
yum install mailx
mailx sales@example.com
按下 Ctrl+D
键结束消息。你可以安全地让Cc:
字段留白。这样就完成了新域名和电子邮件用户的配置。
注意 考虑到在单个邮件系统上虚拟托管大量域名的可能性,电子邮件地址的用户名部分(即在
@
符号之前的部分)不足以进行认证。当电子邮件用户向服务器进行身份验证时,他们必须提供上面创建的完整电子邮件地址作为用户名。
测试邮件发送之后, 检查邮件日志以确保邮件已传送。
1.检查位于/var/log/maillog
的邮件日志。你将会看到类似下方的内容:
Mar 18 15:39:07 server postfix/cleanup[3252]: 444E34055: message-id=<20150318153907.444E34055@server.example.com>
Mar 18 15:39:07 server postfix/qmgr[3218]: 444E34055: from=<root@server.example.com>, size=489, nrcpt=1 (queue active)
Mar 18 15:39:07 server postfix/pipe[3258]: 444E34055: to=<sales@example.com>, relay=dovecot, delay=0.09, delays=0.04/0.01/0/0.05, dsn=2.0.0, sta$
Mar 18 15:39:07 server postfix/qmgr[3218]: 444E34055: removed
2.检查位于/home/vmail/dovecot-deliver.log
的 Dovecot 传送日志。你将会看到类似下方的内容:
deliver(<sales@example.com>): 2011-01-21 20:03:19 Info: msgid=\<<20110121200319.E1D148908@hostname.example.com>>: saved mail to INBOX
现在你可以测试看你的电子邮件服务器用户会通过他们的邮件客户端看到什么。
1.要测试名为 sales@example.com
的邮箱,请导航到邮箱目录/home/vmail/example.com/sales/Maildir
并发出以下命令:
cd /home/vmail/example.com/sales/Maildir find
2.你应该会看到类似下方内容的输出:
.
./dovecot-uidlist
./cur
./new
./new/1285609582.P6115Q0M368794.li172-137
./dovecot.index
./dovecot.index.log
./tmp
3.使用邮件客户端测试邮箱。对于此测试,建议使用mutt。如果默认情况下未安装,请键入 yum install mutt
命令安装,然后运行命令:
mutt -f .
系统可能会提示你创建根邮箱。这并不是必需的。
4.如果收件箱中有电子邮件,则已成功配置 Postfix、Dovecot 和 MySQL!退出 mutt 请按q
。
有关本主题的更多信息, 请参考以下资源。我们希望所提供的这些资料是有用的,但请注意,我们无法保证外部托管材料的准确性或及时性。