当前位置:首页 > 运维 > 正文内容

在 CentOS 7 上搭建属于自己的邮件系统

MuWind2年前 (2022-10-23)运维144

跟朋友整了一堆活,总得要留下邮箱收集民意~由于项目的敏感性,我们需要一个属于自己的email服务器,于是便开始搭建了。

image.png

所需工具:域名,可以PTR的公网IP机器,二级域名证书


原理:

先安装环境:

yum -y install epel-release
yum update
yum -y install dovecot dovecot-mysql opendkim postfix pypolicyd-spf wget

mysql的话自行安装,如果已经配置好宝塔之类的可以忽略的

进入mysql命令行界面:

mysql -u root -p

然后创建数据库,添加用户,给予用户操作权限

CREATE USER 'mail_sys'@'localhost' IDENTIFIED BY 'mail_sys';
CREATE DATABASE mail_sys;
GRANT SELECT ON mail_sys.* TO 'mail_sys'@'localhost' IDENTIFIED BY 'mail_sys';
FLUSH PRIVILEGES;
USE mail_sys;
CREATE TABLE `domains` ( `id` int(20) NOT NULL auto_increment, `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
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=utf8;
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=utf8;

添加域名:

INSERT INTO `mail_sys`.`domains` (`id` ,`name`) 
VALUES ('<域名索引号>', '<域名>');

添加用户:

INSERT INTO `mail_sys`.`users`
(`id`, `domain_id`, `password` , `email`) VALUES
('<用户索引号>', '<域名索引号>', ENCRYPT('<密码>', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '<邮箱地址>');

设置邮件专用用户:

groupadd -g 2000 mail_sys
useradd -g mail_sys -u 2000 mail_sys -d /var/spool/mail -s /sbin/nologin
chown -R mail_sys:mail_sys /var/spool/mail

接下来配置postfix,首先先配置main.cf

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

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

mydomain = example.com # 您的域名,需要修改
myhostname = mail.example.com # 您的域名前面加上 mail. 需要修改
mydestination = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_protocols = all
inet_interfaces = all
smtp_address_preference = ipv4
smtpd_banner = ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no
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
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_mailbox_maps.cf, mysql:/etc/postfix/mysql_alias_maps.cf
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain, reject_sender_login_mismatch
smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
message_size_limit = 102400000
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_cert_file=/etc/pki/tls/certs/cert.pem # mail.example.com 证书文件位置,需要修改
smtpd_tls_key_file=/etc/pki/tls/private/key.pem # mail.example.com 证书私钥文件位置,需要修改
smtpd_tls_session_cache_database = btree:\${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:\${data_directory}/smtp_scache
smtpd_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtpd_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
tls_preempt_cipherlist = yes
smtpd_tls_received_header = yes
policyd-spf_time_limit = 3600
EOF

修改master.cf,执行以下命令:

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

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

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
       -o smtpd_tls_security_level=encrypt
smtps     inet  n       -       n       -       -       smtpd
       -o smtpd_tls_wrappermode=yes
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
policyd-spf    unix  -       n       n       -       0       spawn
       user=mail_sys argv=/usr/libexec/postfix/policyd-spf
EOF

开始对接mysql,执行下面的命令:

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

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

user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT 1 FROM domains WHERE name='%s'
EOF

执行以下命令:

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

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

user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT email FROM users WHERE email='%s'
EOF

执行下面的命令:

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

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

user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT destination FROM aliases WHERE source='%s'
EOF

接下来配置dovecot

执行以下命令:

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

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

protocols = imap lmtp
dict {
}
!include conf.d/*.conf
!include_try local.conf
EOF

执行以下命令:

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

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

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

执行以下命令:

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

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

namespace inbox {
  mailbox Drafts {
    auto = create
    special_use = \Drafts
  }
  mailbox Trash {
    auto = create
    special_use = \Trash
  }
  mailbox Sent {
    auto = create
    special_use = \Sent
  }
}
EOF

执行以下命令:

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

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

auth_mechanisms = plain login
!include auth-sql.conf.ext
EOF

执行以下命令:

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

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

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

执行以下命令:

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

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

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

执行以下命令:

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

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

ssl = required
ssl_cert = </etc/pki/tls/certs/cert.pem # mail.example.com 证书文件位置,需要修改
ssl_key = </etc/pki/tls/private/key.pem # mail.example.com 证书私钥文件位置,需要修改
ssl_protocols = TLSv1.2 TLSv1.1 !TLSv1 !SSLv2 !SSLv3
ssl_cipher_list = ALL:!MD5:!DES:!ADH:!RC4:!PSD:!SRP:!3DES:!eNULL:!aNULL
EOF

执行以下命令:

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

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

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

执行以下命令:

cat > /etc/dovecot/conf.d/15-lda.conf << EOF

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

postmaster_address = postmaster@%d

protocol lda {
}
EOF

配置opendkim:

执行以下命令:

postmaster_address = postmaster@%d

protocol lda {
}
EOF

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

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 请替换成您的域名。

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

配置发件增加dkim签名,

执行以下命令:

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

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

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
EOF

最后启动所有服务,并开启开机自启:

systemctl start postfix dovecot opendkim
systemctl enabled postfix dovecot opendkim

开始配置解析:

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

MX记录:在域名控制面板中添加一条记录,主机记录填 @ ,记录类型选 MX ,记录值填 mail.example.com,其他保持默认;

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

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

DKIM记录:

执行以下命令:

cat /etc/opendkim/keys/mail.txt

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

在域名控制面板中添加一条记录主机记录填 mail._domainkey ,记录类型选 TXT ,记录值填刚刚复制的一行

去outlook或者foxmail里测试即可

如果被拒信大概率是因为IP的PTR记录不对

标签: email服务器

“在 CentOS 7 上搭建属于自己的邮件系统” 的相关文章

Zerotier配合Nginx实现内网穿透

Zerotier配合Nginx实现内网穿透

之前博客网站一直用的家里机器配合香港Azure做frp内网穿透,用CF CDN进行数据分发,不提frp的虚拟局域网模式在跨国数据传输时面临的数据审查和路由方向会给速度及稳定性造成非常大的影响,其可能有的内存溢出和服务重启时的持续掉线问题也是很抓狂的,在这里,使用zerotier为两机打洞连接p2p,...

离线下载Aria2搭建

2024.02.03更新:不如比特彗星,ipv6支持一坨狗屎,比特彗星也有远程下载,这就是个垃圾安装还是很方便的,直接一个yum就行了yum install -y aria2然后创建一个配置文件:cd /etc/  sudo mkdir&...

CentOS Python后台运行

nohup python /data/python/server.py > python.log3 2>&1 &说明:1、1是标准输出(STDOUT)的文件描述符,2是标准错误(STDERR)的文件描述符 &nb...

CentOS设置开机启动

AIO出现了硬盘问题,重启后发现离线下载服务没有开机自启,快速给开一下:先写一个开机自启的脚本:#!/bin/sh #chkconfig: 2345 80 90 #description:aria2开机自启 aria2c --conf-path=/e...

node-saas问题

node-saas问题

构建vue项目的时候报错:很简单,nodejs版本太新了,直接换到dart-sassyarn remove node-sass yarn add sass...

雨云CDN清除指定文件的缓存

雨云CDN清除指定文件的缓存

雨云的CDN并没有给用户清除缓存的选项,想清除缓存的话其实挺麻烦的。通过浏览器对网站的请求头我们可以看到,CDN的服务器是apache apisix通过查阅apisix有关缓存的文档,我们可以发现清除缓存的方法:https://apisix.apache.org/zh/docs/apisix/2.1...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。