自选组件搭建邮件服务器 CentOS

自选组件搭建邮件服务器 CentOS

环境

CentOS 7

组件

Postfix

Dovecot

MySQL 5.7

OpenDKIM

Nginx

PHP

Roundcube WebMail

Policyd

安装

MySQL

mysql下载离线包

1
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar

解压包

1
tar -zxvf mysql-5.7.xx.rpm-bundle.tar

包的作用

mysql-community-client(客户端程序和工具)
mysql-community-server(
服务器程序和工具)
mysql-community-libs(LIB库)
mysql-community-libs-compat(
LIB共享兼容库)
mysql-community-common(*公共文件)
mysql-community-devel(开发MySQL必备的头文件和库)
mysql-community-embedded(嵌入式库)
mysql-community-embedded-compat(嵌入式共享兼容库)
mysql-community-embedded-dev(嵌入式开发库)
mysql-community-test(测试套件)

安装需要的包

1
yum install mysql-community-{server,client,common,libs}-*

安装生成文件

启动

1
systemctl start mysqld

设置root密码

1
cat /var/log/mysqld.log

SET PASSWORD FOR ‘root‘@’localhost’ = PASSWORD(‘123’);

SHOW VARIABLES LIKE ‘validate_password%’;

validate_password_dictionary_file
插件用于验证密码强度的字典文件路径。

validate_password_length
密码最小长度,参数默认为8,它有最小值的限制,最小值为:validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)

validate_password_mixed_case_count
密码至少要包含的小写字母个数和大写字母个数。

validate_password_number_count
密码至少要包含的数字个数。

validate_password_policy
密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG。有以下取值:
Policy Tests Performed
0 or LOW Length
1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters
2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。

validate_password_special_char_count

密码至少要包含的特殊字符数。

set global validate_password_policy=0;

set global validate_password_mixed_case_count=0;

set global validate_password_number_count=3;

set global validate_password_special_char_count=0;

set global validate_password_length=3;

创建虚拟数据

创建用户

1
CREATE USER 'mail_sys'@'localhost' IDENTIFIED BY 'mail_sys';

创建数据库

1
CREATE DATABASE mail_sys;

授权

1
GRANT SELECT ON mail_sys.* TO 'mail_sys'@'localhost' IDENTIFIED BY 'mail_sys';

刷新权限

1
FLUSH PRIVILEGES;

切换数据库

1
USE mail_sys;

域名表

1
CREATE TABLE `domains` ( `id` int(20) NOT NULL auto_increment, `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

用户表

1
CREATE TABLE `users` ( `id` int(20) NOT NULL auto_increment, `domain_id` int(20) NOT NULL, `password` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

别名表

1
CREATE TABLE `aliases` ( `id` int(20) NOT NULL auto_increment, `domain_id` int(20) NOT NULL, `source` varchar(200) NOT NULL, `destination` varchar(200) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

添加域名

1
2
INSERT INTO `mail_sys`.`domains` (`id` ,`name`) 
VALUES (1, 'example.com');

添加用户

1
2
3
4
5
INSERT INTO `mail_sys`.`users`
(`id`, `domain_id`, `password` , `email`) VALUES
('1', '1', ENCRYPT('123qwe', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'admin@example.com'),
('2', '1', ENCRYPT('123qwe', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user1@example.com'),
('3', '1', ENCRYPT('123qwe', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user2@example.com');

添加别名

1
2
3
4
5
INSERT INTO `mail_sys`.`aliases`
(`id`, `domain_id`, `source`, `destination`) VALUES
('1', '1', 'admin1@example.com', 'admin@example.com'),
('2', '1', 'user11@example.com', 'user1@example.com'),
('3', '1', 'user22@example.com', 'user2@example.com');

检查数据库

1
SELECT * FROM mail_sys.domains;
1
SELECT * FROM mail_sys.users;
1
SELECT * FROM mail_sys.aliases;

邮件系统专用用户

  1. 所有的邮件用户都映射到系统的同一个真实的用户上。
  2. 不建议直接使用系统自带的 mail 账户。

创建专用组

1
groupadd -g 2000 mail_sys

创建专用用户

1
useradd -g mail_sys -u 2000 mail_sys -d /var/spool/mail -s /sbin/nologin

修改邮件目录所有者

1
chown -R mail_sys:mail_sys /var/spool/mail

生成数字签名

私钥

1
2
openssl genrsa -des3 -out privkey.pem 2048

自签证书

1
2
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

Postfix

安装

1
2
yum install postfix

备份原版配置文件

1
2
cp -r /etc/postfix /etc/postfix.bak

修改 main.cf

该文件配置 Postfix 的全局参数。

1
2
cat > /etc/postfix/main.cf << EOF

请按实际情况以及注释提示修改以下内容,完成去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
myhostname = example.com				#本机域名,需要修改
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_tls_cert_file=/etc/pki/tls/certs/cert.pem # example.com 证书文件位置,需要修改
smtpd_tls_key_file=/etc/pki/tls/certs/key.pem # example.com 证书私钥文件位置,需要修改
smtpd_use_tls=yes
smtpd_tls_auth_only = no
smtpd_tls_security_level = may
smtp_tls_security_level = may
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
virtual_mailbox_domains = mysql:/etc/postfix/mysql_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_alias_maps.cf, mysql:/etc/postfix/mysql_email2email.cf
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
message_size_limit = 102400000
EOF

修改 master.cf

该文件配置 Postfix 中各模块的参数。

1
2
cat > /etc/postfix/master.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
smtp      inet  n       -       n       -       -       smtpd
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o smtp_helo_timeout=120 -o smtp_connect_timeout=120
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
EOF

与 MySQL 对接

指定域名数据表

1
2
cat > /etc/postfix/mysql_mailbox_domains.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT 1 FROM domains WHERE name='%s'
EOF

指定用户数据表

1
2
cat > /etc/postfix/mysql_mailbox_maps.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT 1 FROM users WHERE email='%s'
EOF

指定别名数据表

1
2
cat > /etc/postfix/mysql_alias_maps.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT destination FROM aliases WHERE source='%s'
EOF

指定用户收件目标数据表

(这个有点懵,Linode 上面的教程要求添加这个,懂的大神麻烦解释下)

1
2
cat > /etc/postfix/mysql_email2email.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT email FROM users WHERE email='%s'
EOF

测试数据库读取

启动 Postfix 服务

1
2
systemctl start postfix

测试域名数据表的读取

下面的 example.com 请替换为自己设定的域名。

1
2
postmap -q example.com mysql:/etc/postfix/mysql_mailbox_domains.cf

若返回 1 ,则说明设置正确。

测试用户名数据表的读取

下面的 user1@example.com 请替换为自己设定的用户名其中一个。

1
2
postmap -q user1@example.com mysql:/etc/postfix/mysql_mailbox_maps.cf

若返回 1 ,则说明设置正确。

测试别名数据表的读取(可选)

下面的 user11@example.com 请替换为自己设定的别名其中一个。

1
2
postmap -q user11@example.com mysql:/etc/postfix/mysql_alias_maps.cf

若返回别名所对应的真实用户名 ,则说明设置正确。

停止 Postfix 服务

等全部配置完成后再启动。

1
2
systemctl stop postfix

日志

1

Dovecot

安装

卸载 sendmail

1
2
yum remove sendmail

安装 Dovecot

1
2
yum install dovecot

注意:CentOS 6 需要安装 managesieve

1
2
yum install dovecot-pigeonhole

备份原版配置文件

1
2
cp -r /etc/dovecot /etc/dovecot.bak

修改 dovecot.conf

说明
• 该文件配置 Dovecot 的全局参数。

1
2
cat > /etc/dovecot/dovecot.conf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
protocols = imap lmtp
dict {
}
!include conf.d/*.conf
!include_try local.conf
EOF

修改 conf.d/10-mail.conf

说明
• 该文件配置邮箱文件存储的位置和命名空间。

1
2
cat > /etc/dovecot/conf.d/10-mail.conf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
namespace inbox {
inbox = yes
}
first_valid_uid = 1000
mbox_write_locks = fcntl
mail_location = maildir:/var/spool/mail/%d/%n
mail_privileged_group = mail
EOF

修改 conf.d/15-mailboxes.conf

说明
• 该文件配置邮箱内部的目录结构。

1
2
cat > /etc/dovecot/conf.d/15-mailboxes.conf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace inbox {
mailbox Drafts {
auto = create
special_use = \Drafts
}
mailbox Trash {
auto = create
special_use = \Trash
}
mailbox Sent {
auto = create
special_use = \Sent
}
}
EOF

注意

dovecot2.3以下放入空内容就好

1
2
3
4
namespace inbox {
}
EOF

修改 conf.d/10-auth.conf

说明
• 该文件配置用户身份认证流程。

1
2
cat > /etc/dovecot/conf.d/10-auth.conf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
auth_mechanisms = plain login
!include auth-sql.conf.ext
EOF

修改 conf.d/auth-sql.conf.ext

说明
• 该文件配置数据库认证的参数。

1
2
cat > /etc/dovecot/conf.d/auth-sql.conf.ext << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=mail_sys gid=mail_sys home=/var/spool/mail/%d/%n
}
EOF

修改 dovecot-sql.conf.ext

说明
• 该文件配置验证用户名密码所用的数据表以及认证方法。

1
2
cat > /etc/dovecot/dovecot-sql.conf.ext << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
driver = mysql
connect = host=localhost dbname=mail_sys user=mail_sys password=mail_sys
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';
EOF

修改 conf.d/10-ssl.conf

说明
• 该文件配置 SSL 加密参数。

1
2
cat > /etc/dovecot/conf.d/10-ssl.conf << EOF

请按实际情况以及注释提示修改以下内容,完成去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
ssl = required
ssl_cert = </etc/pki/tls/certs/cert.pem # example.com 证书文件位置,需要修改
ssl_key = </etc/pki/tls/certs/key.pem # example.com 证书私钥文件位置,需要修改
ssl_protocols = !SSLv3
ssl_cipher_list = ALL:!LOW:!SSLv3:!EXP:!aNULL
ssl_prefer_server_ciphers = no
EOF

修改 conf.d/10-master.conf

说明
• 该文件配置 Dovecot 中各服务的参数。

1
2
cat > /etc/dovecot/conf.d/10-master.conf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}

service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}

service imap {

}

service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

unix_listener auth-userdb {
mode = 0600
user = mail_sys
}
user = dovecot
}

service auth-worker {
user = mail_sys
}

service dict {
unix_listener dict {
mode = 0660
user = mail
group = mail
}
}
EOF

日志

1
2
/var/log/maillog

配置 OpenDKIM

安装

1
2
yum install opendkim

修改 OpenDKIM 配置文件

1
2
cat > /etc/opendkim.conf << EOF

请按实际情况以及注释提示修改以下内容,完成去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
7
8
9
10
Syslog yes
UMask 002
OversignHeaders From
Socket inet:8891@127.0.0.1
Domain example.com #本机域名,需要修改
KeyFile /etc/opendkim/keys/mail.private
Selector mail
RequireSafeKeys no
EOF

生成私钥

下面的 example.com 请替换成您的域名。

1
2
opendkim-genkey -D /etc/opendkim/keys/ -d example.com -s mail && chown -R opendkim:opendkim /etc/opendkim/keys/

配置 Postfix 的 main.cf

配置发件增加 DKIM 签名。

1
2
cat >> /etc/postfix/main.cf << EOF

以下内容直接粘贴到命令行窗口中按回车即可。

1
2
3
4
5
6
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
EOF

启动所有服务

CentOS 7

1
2
systemctl start postfix dovecot opendkim

CentOS 6

1
2
3
4
service postfix start
service dovecot start
service opendkim start

如需开机启动,请执行以下命令。

CentOS 7

1
2
systemctl enable postfix dovecot opendkim mariadb

CentOS 6

1
2
3
4
5
chkconfig postfix on
chkconfig dovecot on
chkconfig opendkim on
chkconfig mariadb on

配置域名参数

A 记录的设定

在域名控制面板中添加一条记录,主机记录@ ,记录类型A 记录值1.1.1.1 ,其他保持默认,保存即可。

MX 记录的设定

在域名控制面板中添加一条记录,主机记录@ ,记录类型MX ,记录值http://mail.example.com,其他保持默认;
再添加一条记录,主机记录mail ,记录类型A ,记录值1.1.1.1,其他保持默认,保存即可。

SPF 记录的设定

在域名控制面板中添加一条记录,主机记录@ ,记录类型TXT ,记录值v=spf1 mx -all,其他保持默认,保存即可。

DMARC 记录的设定

在域名控制面板中添加一条记录,主机记录_dmarc ,记录类型TXT ,记录值v=DMARC1; p=none,其他保持默认,保存即可。

DKIM 记录的设定

(以我的密钥文件为例)
执行以下命令

1
2
cat /etc/opendkim/keys/mail.txt 

会出现以下结果

1
2
3
mail._domainkey	IN	TXT	( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB" ) ; ----- DKIM key default for example.com

把括号内的值复制出来,去掉所有引号并整理成一行,形如:

1
2
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB

在域名控制面板中添加一条记录,主机记录mail._domainkey ,记录类型TXT ,记录值v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB,其他保持默认,保存即可。

最终效果如图

IP 反向解析的设定

这个……普通家庭宽带用户就别想了,企业宽带和国内云主机用户需要网站通过备案才能设置。如果用国外云主机的话,有些可以支持。为您的域名配置 IP 地址反向解析可以大幅降低外发邮件被拒收的几率。

过滤沟通 Amavisd-new

安装并配置病毒扫描与垃圾邮件过滤

病毒扫描 ClamAV

垃圾邮件过滤 SpamAssassin

Policyd 白名单

官网下载

1
2
wget https://download.policyd.org/v2.0.14/cluebringer-v2.0.14.tar.gz

解压

1
2
tar -zxvf cluebringer-v2.0.14.tar.gz

整合初始化 sql

1
2
cd ./cluebringer-v2.0.14/database

执行shell

1
2
3
4
5
for i in core.tsql access_control.tsql quotas.tsql amavis.tsql checkhelo.tsql checkspf.tsql greylisting.tsql
do
./convert-tsql mysql $i
done > policyd.sql

使用 vim 替换错误 SQL 语法

1
2
%s/TYPE=InnoDB/ENGINE=InnoDB/g

建库

1
2
mysql -u root -p -e 'CREATE DATABASE policyd'

初始化数据库

1
2
mysql -u root -p policyd < policyd.sql

复制文件 cbp/ & awitpt/

1
2
mkdir /usr/local/lib/cbpolicyd-2.0

1
2
3
cp -r cbp /usr/local/lib/cbpolicyd-2.0/
cp -r awitpt/awitpt /usr/local/lib/cbpolicyd-2.0/

复制文件 cbpolicyd 和 cbpadmin

1
2
3
cp cbpadmin /usr/local/bin/
cp cbpolicyd /usr/local/sbin/

设置系统目录

1
2
3
mkdir /var/log/cbpolicyd
mkdir /var/run/cbpolicyd

在 /etc/postfix/main.cf 中配置

1
2
3
# policyd
smtpd_recipient_restrictions = check_policy_service inet:127.0.0.110031,permit_mynetworks,...,...

日志 Awstats

防爆 fail2ban

安装

1
2
yum install 

添加过滤配置 /etc/fail2ban/filter.d/dovecot-pop3imap.conf

1
2
3
[Definition]
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+ authentication attempts).*rip=`<HOST>`

添加配置 /etc/fail2ban/jail.conf

1
2
3
4
5
6
7
8
9
[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp]
logpath = /var/log/maillog
maxretry = 20
findtime = 1200
bantime = 1200

运行服务

启动

1
2
3
4
service fail2ban start

systemctl start fail2ban

自启

1
2
3
4
chkconfig fail2ban on

systemctl enable fail2ban

配置 Web 邮箱

安装 Nginx、PHP

Nginx

1
2
yum install nginx

PHP

检查当前版本

1
2
yum list installed | grep php

确保可以卸载旧版本

1
2
yum remove php*

添加第三方yum源

CentOs 5.x

1
2
rpm -Uvh <http://mirror.webtatic.com/yum/el5/latest.rpm

CentOs 6.x

1
2
rpm -Uvh <http://mirror.webtatic.com/yum/el6/latest.rpm

CentOs 7.X

1
2
3
rpm -Uvh <https://mirror.webtatic.com/yum/el7/epel-release.rpm>
rpm -Uvh <https://mirror.webtatic.com/yum/el7/webtatic-release.rpm>

安装php及其组件

1
2
yum install php56w-mysql php56w-fpm php56w-xml php56w-mbstring

1
2
yum install -y php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64 php70w-fpm.x86_64 php70w-xml.x86_64

下载并安装 Roundcube

下载

1
2
wget https://github.com/roundcube/roundcubemail/releases/download/1.3.0/roundcubemail-1.3.0-complete.tar.gz

解压 & 安装

1
2
tar -xf roundcubemail-1.3.0-complete.tar.gz && mv roundcubemail-1.3.0 /usr/share/roundcube && chown -R apache:apache /usr/share/roundcube

配置 Nginx 、PHP

配置 Nginx

1
2
vim /etc/nginx/conf.d/mail.conf

请按实际情况以及注释提示修改以下内容,在命令行窗口按下 i ,将内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq 按回车。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name mail.example.com; # 本机域名前面加上mail. 需要修改
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name mail.example.com; # 本机域名前面加上mail. 需要修改
ssl_certificate "/etc/pki/tls/certs/cert.pem"; # mail.example.com 证书文件位置,需要修改
ssl_certificate_key "/etc/pki/tls/certs/key.pem"; # mail.example.com 证书私钥文件位置,需要修改
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
location / {
root /usr/share/roundcube;
index index.php;
}
location ~ .php$ {
root /usr/share/roundcube;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}

配置 PHP

设置时区

1
2
echo "date.timezone = Asia/Shanghai" >> /etc/php.ini 

创建会话文件夹

1
2
mkdir /var/lib/php/session && chown apache:apache /var/lib/php/session

配置数据库

进入 MySQL 命令行界面

1
2
3
4
mysql -u root -p

Enter password: #输入密码按回车

创建一个用户用于读写 Roundcube 数据库

1
2
CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'roundcube';

创建 Roundcube 数据库

1
2
CREATE DATABASE roundcube;

为用户授予读写权限

1
2
GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'roundcube';

刷新权限表

1
2
FLUSH PRIVILEGES;

数据库设置完成

启动服务

CentOS 6

1
2
3
service nginx start
service php-fpm start

CentOS 7

1
2
systemctl start nginx php-fpm

如需开机启动,请执行以下命令。

CentOS 6

1
2
3
chkconfig nginx on
chkconfig php-fpm on

CentOS 7

1
2
systemctl enable nginx php-fpm

配置 Roundcube

打开浏览器,输入 https://mail.example.com/installer/?_step=1 ,回车打开。然后按图片提示进行配置。

img

img

img

img

img

img

img

配置完成后,关闭浏览器页面。执行以下命令来使安装程序不可用。

1
2
chmod -R 000 /usr/share/roundcube/installer/

登录测试

打开浏览器,输入 https://mail.example.com ,然后输入您的用户名密码登录,测试收发邮件

日志

1
2
/usr/share/roundcube/logs/*

测试工具

打开浏览器,输入 http://www.mail-tester.com ,回车打开。发一封邮件到它指定的邮箱里。然后过一分钟左右查看下结果,重点检查 SPF 记录、DMARC 记录和 DKIM 签名是不是有效的。

参考

在 CentOS 7 上搭建属于自己的 “完美” 邮件系统


自选组件搭建邮件服务器 CentOS
http://example.com/2019/03/28/自选组件搭建邮件服务器-CentOS/
作者
Holy
发布于
2019年3月28日
许可协议