Total Pageviews

Sunday, 5 November 2017

在Ubuntu/debian服务器上,安装开源邮件服务器套件-iRedMail

iRedMail是一个Linux下的全栈邮件服务器套件,包括了Postfix、Dovecot、Amavisd、Policyd (iRedAPD)、网页服务器、数据库后端等开源程序。你也可以把它理解为邮件服务器的LNMP.org。它不仅简化了安装程序(无需手动编辑配置文件,只需要回答几个简单的问题即可),还提供了一些简便的工具来管理邮件服务器,比如iRedAdmin面板。更多关于这个邮件服务器套件的介绍可以看一下百度百科官网(官网在大陆需要使用正确姿势才能访问)。
这篇文章讲述了如何在一台已经安装了网页服务器(Nginx/Apache)和MySQL(或MariaDB)数据库的服务器上安装、配置iRedMail,包括DKIM/SPF等(这个以后慢慢更新)。
11月5日更新:增加步骤四-安装Roundcube Webmail
官方的文档要求安装在一个干净的系统内,就是说系统不应该安装有Postfix、Dovecot、Amavisd、Policyd (iRedAPD)、网页服务器、数据库后端等程序。但是我的系统(相信很多人也是一样)因为是生产服务器已经安装有网页服务器和数据库服务器,另外找一个服务器来弄不仅麻烦而且也浪费资源,所以写这么一篇教程讲如何在一个不干净的Ubuntu系统内安装这个套件。注意一下,我这里的不干净仅指安装过数据库和网页服务器,剩余程序我的服务器也是没有安装过的(你可以使用apt purge清理)。
下面的教程中有用到http://www.iredmail.org的地方,如果你服务器在国内,请替换为http://173.254.22.21。这个是官方的镜像,至于为什么要这么弄大家都懂。
我服务器的配置:
  • OS: Ubuntu Xenial 16.04.3 LTS
  • 网页服务器: LNMP.org – Nginx + Apache + 另行安装的MariaDB集群 + PHP 7.1(PHP在iRedMail用不上因为面板是python写的)
  • 我用的是LANMP,本教程应该也适用于LAMP因为不需要碰Nginx。
  • Apache默认没带mod_wsgi,这个插件是iRedAdmin面板所必须的,过后我会讲解如何编译安装。
  • 官方建议流量不大的服务器也应至少有2G内存,并且UID 2000,2001和2002没有被占用。

步骤一:使用官方脚本完成基本安装

  • 在MySQL数据库内创建一个具有所有权限的用户,即与root权限相等的用户。在下面的步骤中,这个用户的名字会用DB_USERNAME、密码会用DB_PASSWORD代替。创建完成后请使用mysql -u DB_USERNAME -p测试是否能正常连接。
  • 执行下面代码。请注意,你需要在管理员权限(通常为root权限)下执行这些代码
01
02
03
04
05
06
07
08
09
10
11
wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.7.tar.bz2
tar xvf iRedMail-0.9.7.tar.bz2
cd iRedMail-0.9.7
USE_EXISTING_MYSQL='YES' \
    MYSQL_SERVER_ADDRESS='127.0.0.1' \
    MYSQL_SERVER_PORT='3306' \
    MYSQL_ROOT_USER='DB_USERNAME' \
    MYSQL_ROOT_PASSWD='DB_PASSWORD' \
    MYSQL_GRANT_HOST='%' \
    IREDMAIL_MIRROR='http://www.iredmail.org' #如果你是国内的服务器请替换这一行,看上面的说明 \
    bash iRedMail.sh
  • 接下来会显示一个窗口,第一个欢迎信息选Yes就行。第二个问题询问邮件储存位置,如果没什么特殊需求保留缺省(/var/vmail)即可。第三个问题问是用什么网页服务器,选择No Web Server,因为我们已经安装了网页服务器。第四个问题问什么后端,如果你是MySQL就选MySQL,MariaDB就选MariaDB。接下来第五个问题问邮件域名,比如如果你想为ixnet.work搭建一个邮件服务器,用abc@ixnet.work这样的地址接收/发送邮件的话,直接填ixnet.work即可。第六个问题,你需要设置一个管理员密码,这个很重要因为管理面板也需要这个密码登录。然后可选部件保留默认(安装iRedAdmin和fail2ban)。确认一下信息输入y回车就可以开始安装。
  • 等待脚本跑完,脚本执行完毕之后就已经初步安装/配置好了该套件,但是还有一些别的东西需要手动弄。
  • 把上面第(1)点创建的那个MySQL账户删掉,因为已经用不上了。每个会用到数据库的套件都有各自独立的账户和密码,脚本自动帮你创建了。

步骤二:启动iRedAPD

1
2
service iredapd start
systemctl enable /opt/iredapd/rc_scripts/iredapd.service
你可以使用lsof -i:7777检查iredapd是否已经启动,如果已经启动python进程会监听7777端口。

步骤三:配置网页服务器使其加载iRedAdmin

  • 创建一个vhost,假定我这里设置的域名为iredadmin.example.com(下面的自行替换),选择默认的根目录位置(/home/wwwroot/iredadmin.example.com)。
1
lnmp vhost add
  • 创建一个软链接。
1
2
rm -r /home/wwwroot/iredadmin.example.com
ln -s /opt/www/iredadmin /home/wwwroot/iredadmin.example.com
  • 检查Apache是否安装了mod_wsgi,如果提示文件不存在请编译安装一个。
1
2
# 检查是否安装了mod_wsgi
ls /usr/local/apache/modules/mod_wsgi.so
1
2
3
4
5
6
7
# 编译安装mod_wsgi
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.19.tar.gz
tar xvzf 4.5.19.tar.gz
cd mod_wsgi-4.5.19
./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=$(which python)
make
make install
  • 编辑/usr/local/apache/conf/vhost/iredadmin.example.com.conf,LANMP参考下面的配置,LAMP应该也是类似的修改(注意中文的注释)。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 在VirtualHost之前增加下面的两行
LoadModule wsgi_module modules/mod_wsgi.so
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:88>
ServerAdmin howard@ixnet.work
php_admin_value open_basedir "/home/wwwroot/iredadmin.example.com:/tmp/:/var/tmp/:/proc/"
DocumentRoot "/home/wwwroot/iredadmin.example.com"
ServerName iredadmin.example.com
ErrorLog "/home/wwwlogs/iredadmin.example.com-error_log"
CustomLog "/home/wwwlogs/iredadmin.example.com-access_log" combined
# 在VirtualHost里面增加下面的四行
WSGIDaemonProcess iredadmin user=iredadmin threads=15
WSGIProcessGroup iredadmin
WSGIScriptAlias / /home/wwwroot/iredadmin.example.com/iredadmin.py/
AddType text/html .py
<Directory "/home/wwwroot/iredadmin.example.com">
    SetOutputFilter DEFLATE
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all'
# 注释掉这一行
#    DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
  • 重启Apache,修改域名的DNS记录(iredadmin.example.com)使其指向服务器。当你访问访问这个域名,你应该可以看到iRedAdmin的登录界面。
1
lnmp httpd restart

步骤四:安装RoundCube Webmail

  • 编辑/etc/postfix/master.cf,检查submission开头那一行是否有注释,如果有,去掉,然后重启postfix服务。
  • 编辑/etc/dovecot/conf.d/10-master.conf,检查service auth代码块内是否有没注释的unix_listener /var/spool/postfix/private/dovecot-auth代码块,如果没有,按照下面的示范加上,然后重启dovecot服务。
1
2
3
4
5
6
7
service auth {
...
  unix_listener /var/spool/postfix/private/dovecot-auth {
    mode = 0666
  }
...
}
  • 检查并确认以下服务正在运行:clamav-daemonamavisdovecotpostfix
  • 创建一个新的vhost,我用lnmp创建指令为lnmp vhost add。假设你的域名为roundcubemail.example.com
  • Roundcube Webmail的Github发布页面下载最新版本(Complete版本的tar包)。以下代码为示范。
1
2
3
4
5
6
cd /home/wwwroot
wget https://github.com/roundcube/roundcubemail/releases/download/1.3.2/roundcubemail-1.3.2-complete.tar.gz
tar xvzf roundcubemail-1.3.2-complete.tar.gz
rm -rf roundcubemail.example.com
mv roundcubemail-1.3.2-complete.tar.gz roundcubemail.example.com
chown www:www -R roundcubemail.example.com
  • 按照这个文件的指示,创建数据库(与对应受限用户)并导入SQL。
  • 打开http://roundcubemail.example.com/installer,按照指示进行配置。插件随意,选几个喜欢的就好。
  • 保存配置,进入下一步,自行测试一下安装是否成功。除了Test filetype detection那一块不是必须要装filetype插件以外,别的都应该是OK
  • 清理安装目录
1
2
3
cd /home/wwwroot/roundcubemail.example.com
rm -rf installer
vim config/config.inc.php #在任意地方加上 $config['enable_installer'] = false;
接下来的步骤包括配置SPF/DKIM/SMTP/IMAP等以后有空继续更新。
--------------------------------------------






iRedMail设置:邮箱别名、默认接收邮箱等

默认的免费版admin工具不支持一些额外的设置功能,比如别名等。但是这些都可以通过手动修改数据库等方式完成。

邮箱别名及邮件列表

使用如下SQL语句来设置邮箱列表:





1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
     VALUES ('original@example.com', \
             'user1@example.com,user2@example.com,user1@test.com', \
             'example.com', \
             1);
这样发送给original@example.com的邮件将会被goto字段所指定的几个邮箱收到。
如果仅是创建一个别名,则goto字段只需要写一个邮件地址(即已存在的原邮件地址),且islist字段设置为0。如:





1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
     VALUES ('alias@example.com', \
             'user@example.com', \
             'example.com', \
             0);
更多的设置(权限等)参考以下网址:
http://www.iredmail.org/docs/sql.create.mail.alias.html

默认邮箱

默认邮箱指的是当接收到的邮件收件人不存在时,用来接收的邮箱账号。同样用上述方式进行设置,其中address填写邮件域名(无收件人账号),goto填写用于接收邮件的默认邮箱地址(此账户需存在)。如:





1
2
3
4
5
6
sql> USE vmail;
sql> INSERT INTO alias (address, goto, domain, islist) \
     VALUES ('example.com', \
             'user@example.com', \
             'example.com', \
             0);
这样,当收到xxx@example.com的邮件,而xxx账号不存在时,此邮件将会被发送到 user@example.com。

防止邮件地址伪造

为了避免用户在Roundcube中修改自己的发件地址(伪装成其他人),需要修改默认的配置(位于 roundcube目录的config/defaults.inc.php):
1
$config['identities_level'] = 3;
------------------

iRedMail设置:不丢弃垃圾邮件

最近发现在注册某些网站的时候总是会收不到注册邮件,登录到服务器可以看到log中有收到垃圾邮件并丢弃的记录,也就是垃圾邮件会被丢弃,而不是放到Spam(Junk)邮箱中。
照例Google了一下,解决这个问题很简单,只要在 /etc/amavis/conf.d/21-ubuntu_defaults 文件中修改一个配置即可,即将




1
$final_spam_destiny = D_DISCARD;
改为




1
$final_spam_destiny = D_PASS;
然后重启amavis服务即可:
1
sudo service amavis restart

 -------------





搭建基于iRedMail的邮件服务器

虽说现在企业邮箱解决方案很多,但是作为一个技术死宅,怎么能不自己搭一套玩玩呢。
经过若干小时的研究,发现基于开源软件的邮件解决方案主要有以下三种:
  • Mail-in-a-Box
  • Modoboa
  • iRedMail
其中iRedMail感觉最为完善和成熟。作为企业应用,决定先拿它试验。
其实所有的安装配置过程都可在官网( http://iredmail.org/ )找到,这里汇总一下以便于再次操作。

环境

初始的Ubuntu 14.04 x64环境(已执行apt-get update && apt-get upgrade,但未安装任何服务软件)。
开始安装前需要设置hosts,将服务器完整域名(FQDN)添加至 /etc/hosts 中(FQDN需要在最前面),如(假设我们的服务器域名是 mail.xx.com,邮箱域名是 xx.com):




1
127.0.0.1 mail.xx.com mail

安装

首先下载最新的稳定版本:
http://www.iredmail.org/download.html
解压缩并运行安装脚本:




1
2
3
tar xjf iRedMail-xxx.tar.bz2
cd iRedMail-xxx
sudo bash iRedMail.sh
安装脚本会先更新及安装必须的系统软件,然后显示一个蓝色的界面以询问若干问题。在这里我选择了MySQL作为用户数据库,Nginx作为前端Web Server。
在完成问题之后,脚本会给出一个信息汇总,然后提示继续安装。在继续安装的过程中,还会提示是否启用iRedMail提供的防火墙,同样选择Yes。
安装过程共持续几分钟(取决于网络速度),完成后重启一次系统,即可通过浏览器访问邮箱和管理界面了(地址分别是 https://mail.xx.com/mail https://mail.xx.com/iredadmin)。初始管理账号是 postmaster@xx.com ,密码在安装过程中设置。

配置修改

SSL证书

如果你有购买域名的SSL证书,可在/etc/nginx/conf.d/default.conf中配置以启用。iRedMail默认会生成自签名的证书,使用浏览器打开时会有警告信息。

附件尺寸

默认情况下,附件尺寸不能超过10MB,既然是自己搭的服务,怎么能有此种限制呢!果断改之:
http://www.iredmail.org/docs/change.mail.attachment.size.html
参考以上网址,基本分为三步(假设我们改为100MB)。

1、修改postfix配置





1
2
3
4
sudo postconf -e message_size_limit='104857600'
sudo postconf -e mailbox_size_limit='104857600'

sudo /etc/init.d/postfix restart

2、修改Roundcube限制

先修改php设置(/etc/php5/fpm/php.ini):




1
2
3
memory_limit = 200M;
upload_max_filesize = 100M;
post_max_size = 100M;
然后修改 /opt/www/roundcubemail/.htaccess




1
2
3
php_value    memory_limit   200M
php_value    upload_max_filesize    100M
php_value    post_max_size  100M
重启服务




1
sudo service php5-fpm restart

3、修改Nginx配置

修改 /etc/nginx/nginx.conf 中的 client_max_body_size




1
client_max_body_size 100m;
重启服务




1
sudo service nginx restart

DNS设置

做完上面这些步骤之后,你的mail server已经可以正常访问和管理了,但是还无法收发邮件。所以这最后一步就是设置DNS。参考地址:
http://www.iredmail.org/docs/setup.dns.html

MX记录

这是邮件服务专用的DNS记录。将其指向你的邮件服务器即可。比如:




1
2
3
NAME            PRIORITY    TYPE    DATA

xx.com.         10          mx      mail.xx.com

SPF记录

SPF用于防止别人盗用你的域名发垃圾邮件。一般可用TXT类型的DNS记录来设置:




1
xx.com.   3600    IN  TXT "v=spf1 mx mx:xx.com -all"

DKIM记录

也和垃圾邮件有关,详情看网站说明吧,懒得翻译了 哈哈
首先,需要获取签名信息




1
sudo amavisd-new showkeys
会得到一串类似下面的文本




1
2
3
4
5
6
dkim._domainkey.xx.com.   3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaK"
  "txFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBok"
  "FcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5"
  "EV711qseo/omquskkwIDAQAB")
将子域名 dkim._domainkey 设置为TXT记录,内容为括号中的每一行内容去掉双引号连接起来的字符串。
设置完成后可使用以下命令测试是否正确:




1
sudo amavisd-new testkeys

PTR记录

反向域名解析,即将服务器的IP地址映射到域名。此步骤可选,可降低被认定为垃圾邮件的概率,但是需要联系服务器接入ISP进行设置。

测试

恭喜你,邮件服务器配置完成啦!
你可以先在邮箱界面给自己发个邮件测试一下,如果没有问题的话,再尝试向其他邮箱发信或者收信吧。
如果无法收发邮件,可查看 /var/log/mail.log 看看是否有可用的错误信息.
------------

自建邮件服务器-开源集成方案iRedMail


环境

系统 CentOS 7
域名 example.com

安装

  1. 设置 hostname
    RHEL/CentOS 6,/etc/sysconfig/network
    1
    HOSTNAME=mail
    CentOS 7
    1
    hostnamectl set-hostname mail
    例如完整域名是 mail.example.com,应该设置 mail
验证主机名


1
hostname -f

  1. 设置 host
    1
    127.0.0.1   mail.example.com mail localhost localhost.localdomain
    FQDN 主机名列在第一个,短主机名列在第二个
  2. 设置 SELinux
    查看现状态
    iRedMail 不支持 SELinux,所以需要在 /etc/selinux/config 文件里禁用它
    1
    SELINUX=disabled
    如果不希望禁用 SELinux,可以设置为让它打印警告信息但不强制限制
    1
    SELINUX=permissive
  3. 上传最新版 iRedMail 安装包
  4. 解压 iRedMail
    安装解压工具
    1
    yum install  bzip2
    解压
    1
    cd /program
    1
    tar xjf iRedMail-x.y.z.tar.bz2
  5. 运行安装程序
    1
    2
    cd /root/iRedMail-x.y.z/
    bash iRedMail.sh
  6. 安装过程
  7. 安装完成后你必须知道的几个重要事项
    • 邮件服务器最薄弱的环节是用户的弱密码,所以请一定强制你的用户使用强度高的密码。
    • 阅读 /root/iRedMail-x.y.z/iRedMail.tips 文件,它包含了:
      • 各个 web 程序的访问地址(URL),用户名和密码。
      • 各个组件的配置文件路径。除此之外还应该阅读文档:Locations of configuration and log files of major components.
      • 以及其它一些重要和敏感信息
    • 设置 DNS 记录
    • 如何配置邮件客户端程序
    • 强烈建议获取 SSL 证书以避免每次访问 web 程序时烦人的自签名 SSL 证书警告, Let’s Encrypt 提供免费的 SSL 证书。可根据该文档 配置获取的证书:use a SSL certificate.
    • 如果需要批量添加邮件账号,可以参考以下针对不同数据库的批量建账号的文档: OpenLDAP, MySQL/MariaDB/PostgreSQL。
    • 如果这是一台繁忙的服务器,这里有一些提升性能的建议。
    访问 webmail 和其它 web 程序
    安装完成后,可以通过以下 URL 访问相关程序。注意:请将 替换为实际的 服务器地址。
  8. SPF
    SPF 记录是一种域名服务 (DNS) 记录,可确定允许哪些邮件服务器代表您的域来发送电子邮件
    这里说几个常用的:
    1. a:所有该域名的A记录都为通过,a不指定的情况下为当前域名
    2. ip4:指定通过的IP
    3. mx:mx记录域名的A记录IP可以发邮件
    4. all:结束标志,“-”表示只允许设置的记录为通过,“~”表示失败,通常用于测试,“+”表示忽略SPF
    DKIM
    centos6
    1
    amavisd showkeys
    centos7
    1
    amavisd -c /etc/amavisd/amavisd.conf showkeys
    复制结果,添加到DNS,主机记录为dkim._domainkeyTXT类别
    DMARC
    DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。
    • p:用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none为不作任何处理;quarantine为将邮件标记为垃圾邮件;reject为拒绝该邮件。初期建议设置为none。
    • rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。
    • ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。
    例如我设置的是v=DMARC1;p=reject;rua=xx@lxx.com,意思是拒绝伪造邮件,并且将一段时间的汇总报告发送给我。
    添加到DNS
    添加TXT记录,主机名:_dmarc,记录值:v=DMARC1;p=reject;rua=xx@lxx.com
    PTR
    将 mail.xx.com 设置PTR
    添加好了以后可以通过以下命令查看
    1
    dig -x  IP
    如果看到了PTR记录为你的域名那就说明成功了。
    测试工具
    iRedmail 主要组件
    • Apache
    • Nginx
    • PHP
    • MySQL
    • OpenLDAP
    • Postfix
    • Dovecot
    • Amavisd
    • ClamAV
    • SpamAssassin
    • Policyd
    • Pysieved
    • Roundcube
    • Awstats 6.9

    参考

------------------

在CentOS7上,自选组件搭建邮件服务器 

环境

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
openssl genrsa -des3 -out privkey.pem 2048
自签证书
1
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

Postfix

安装

1
yum install postfix

备份原版配置文件

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

修改 main.cf

该文件配置 Postfix 的全局参数。
1
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
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
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
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
cat > /etc/postfix/mysql_mailbox_domains.cf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT 1 FROM domains WHERE name='%s'
EOF
指定用户数据表
1
cat > /etc/postfix/mysql_mailbox_maps.cf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT 1 FROM users WHERE email='%s'
EOF
指定别名数据表
1
cat > /etc/postfix/mysql_alias_maps.cf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT destination FROM aliases WHERE source='%s'
EOF
指定用户收件目标数据表
(这个有点懵,Linode 上面的教程要求添加这个,懂的大神麻烦解释下)
1
cat > /etc/postfix/mysql_email2email.cf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
user = mail_sys
password = mail_sys
hosts = localhost
dbname = mail_sys
query = SELECT email FROM users WHERE email='%s'
EOF

测试数据库读取

启动 Postfix 服务
1
systemctl start postfix
测试域名数据表的读取
下面的 example.com 请替换为自己设定的域名。
1
postmap -q example.com mysql:/etc/postfix/mysql_mailbox_domains.cf
若返回 1 ,则说明设置正确。
测试用户名数据表的读取
下面的 user1@example.com 请替换为自己设定的用户名其中一个。
1
postmap -q user1@example.com mysql:/etc/postfix/mysql_mailbox_maps.cf
若返回 1 ,则说明设置正确。
测试别名数据表的读取(可选)
下面的 user11@example.com 请替换为自己设定的别名其中一个。
1
postmap -q user11@example.com mysql:/etc/postfix/mysql_alias_maps.cf
若返回别名所对应的真实用户名 ,则说明设置正确。
停止 Postfix 服务
等全部配置完成后再启动。
1
systemctl stop postfix

日志

1
2

Dovecot

安装

卸载 sendmail
1
yum remove sendmail
安装 Dovecot
1
yum install dovecot
注意:CentOS 6 需要安装 managesieve
1
yum install dovecot-pigeonhole

备份原版配置文件

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

修改 dovecot.conf

说明
• 该文件配置 Dovecot 的全局参数。
1
cat > /etc/dovecot/dovecot.conf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
protocols = imap lmtp
dict {
}
!include conf.d/*.conf
!include_try local.conf
EOF

修改 conf.d/10-mail.conf

说明
• 该文件配置邮箱文件存储的位置和命名空间。
1
cat > /etc/dovecot/conf.d/10-mail.conf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
7
8
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
cat > /etc/dovecot/conf.d/15-mailboxes.conf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
namespace inbox {
}
EOF

修改 conf.d/10-auth.conf

说明
• 该文件配置用户身份认证流程。
1
cat > /etc/dovecot/conf.d/10-auth.conf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
auth_mechanisms = plain login
!include auth-sql.conf.ext
EOF

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

说明
• 该文件配置数据库认证的参数。
1
cat > /etc/dovecot/conf.d/auth-sql.conf.ext << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
7
8
9
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
cat > /etc/dovecot/dovecot-sql.conf.ext << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
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
cat > /etc/dovecot/conf.d/10-ssl.conf << EOF
请按实际情况以及注释提示修改以下内容,完成去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
7
ssl = required
ssl_cert = 
# example.com 证书文件位置,需要修改
ssl_key = # 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
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
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
/var/log/maillog

配置 OpenDKIM

安装
1
yum install opendkim

修改 OpenDKIM 配置文件

1
cat > /etc/opendkim.conf << EOF
请按实际情况以及注释提示修改以下内容,完成去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。
1
2
3
4
5
6
7
8
9
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
opendkim-genkey -D /etc/opendkim/keys/ -d example.com -s mail && chown -R opendkim:opendkim /etc/opendkim/keys/

配置 Postfix 的 main.cf

配置发件增加 DKIM 签名。
1
cat >> /etc/postfix/main.cf << EOF
以下内容直接粘贴到命令行窗口中按回车即可。
1
2
3
4
5
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
EOF

启动所有服务

CentOS 7
1
systemctl start postfix dovecot opendkim
CentOS 6
1
2
3
service postfix start
service dovecot start
service opendkim start
如需开机启动,请执行以下命令。
CentOS 7
1
systemctl enable postfix dovecot opendkim mariadb
CentOS 6
1
2
3
4
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
cat /etc/opendkim/keys/mail.txt
会出现以下结果
1
2
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
   "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU5nkxbS36hOa2FCJqotvahTbxb83CvLt5XqV4WAPzJQmfaA1eHyvOz9XiZgE8vWRgP2jJFlL+J4yEroB3YV/8EBjAM8lFTi31DVgRsoHMwH6f3GuLAfcuVofymDfRxHxPzIlm7rgzfWwrGcPrIzt64NLuZG4yusTWp8MTfWZxvQIDAQAB" )  ; ----- DKIM key default for example.com
把括号内的值复制出来,去掉所有引号并整理成一行,形如:
1
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
wget https://download.policyd.org/v2.0.14/cluebringer-v2.0.14.tar.gz
解压
1
tar -zxvf cluebringer-v2.0.14.tar.gz
整合初始化 sql
1
cd ./cluebringer-v2.0.14/database
执行shell
1
2
3
4
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
%s/TYPE=InnoDB/ENGINE=InnoDB/g
建库
1
mysql -u root -p -e 'CREATE DATABASE policyd'
初始化数据库
1
mysql -u root -p policyd < policyd.sql

复制文件 cbp/ & awitpt/

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

复制文件 cbpolicyd 和 cbpadmin

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

设置系统目录

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

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

1
2
# policyd
smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:10031,permit_mynetworks,...,...

日志 Awstats

防爆 fail2ban

安装


1
yum install

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

1
2
[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=``

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

1
2
3
4
5
6
7
8
[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
service fail2ban start

systemctl start fail2ban

自启

1
2
3
chkconfig fail2ban on

systemctl enable fail2ban

配置 Web 邮箱

安装 Nginx、PHP

Nginx

1
yum install nginx

PHP
检查当前版本

1
yum list installed | grep php

确保可以卸载旧版本

1
yum remove php*

添加第三方yum源
CentOs 5.x

1
rpm -Uvh 

CentOs 6.x

1
rpm -Uvh 

CentOs 7.X

1
2
rpm -Uvh 
rpm -Uvh 

安装php及其组件

1
yum install php56w-mysql php56w-fpm php56w-xml php56w-mbstring
1
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
wget https://github.com/roundcube/roundcubemail/releases/download/1.3.0/roundcubemail-1.3.0-complete.tar.gz

解压 & 安装

1
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
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
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
echo "date.timezone = Asia/Shanghai" >> /etc/php.ini

创建会话文件夹

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

配置数据库

进入 MySQL 命令行界面

1
2
3
mysql -u root -p

Enter password: #输入密码按回车

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

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

创建 Roundcube 数据库

1
CREATE DATABASE roundcube;

为用户授予读写权限

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

刷新权限表

1
FLUSH PRIVILEGES;

数据库设置完成

启动服务

CentOS 6

1
2
service nginx start
service php-fpm start

CentOS 7

1
systemctl start nginx php-fpm

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

1
2
chkconfig nginx on
chkconfig php-fpm on

CentOS 7

1
systemctl enable nginx php-fpm

配置 Roundcube

打开浏览器,输入 https://mail.example.com/installer/?_step=1 ,回车打开。然后按图片提示进行配置。
img
img
img
img
img
img
img
配置完成后,关闭浏览器页面。执行以下命令来使安装程序不可用。

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

登录测试

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

日志


1
/usr/share/roundcube/logs/*

测试工具

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

参考

-----------------------------------------------

自建邮件伺服器指南基础篇(Postfix+Dovecot+Roundcube Webmail)


一。前情提要

FAQ 一:为啥要自建,gmail不香嘛?

答: gmail是挺好用,但是第一,gmail被墙了,

FAQ 二:自建邮件伺服器好难啊。

答:总体而言,如果你想从头理解每一个步骤并正确配置邮件伺服器,确实是挺不容易的,所以你现在还可以选择放弃。

FAQ 三:自建需要什么前提条件 ?

答:如果你看到了这里还打算继续看下去,那么表示你还有一定兴趣/需求。以下为前提条件:

  1. 不建议无Linux、基础网络知识及NGINX TLS 经验者建立服务器(如果你对具体步骤不感兴趣的话无所谓)。

  2. 一台有

    PS:

  3. 伺服器/VPS必须拥有大于等于

  4. 一个非免费域名(推荐

  5. 你的伺服器或VPS厂商必须支援

  6. 你的伺服器或者VPS的ip必须不在各种邮件黑名单里面(否则你发的所有邮件都会被列为spam)。

请确定你仔细阅读并且满足了以上前提条件后再往下阅读,否则出问题了我可不负责啊!!!

二。准备工作

在开始搭建之前,还有许多准备工作需要完成。

  1. 首先,我们需要给我们的域名添加A以及MX解析。

    PS: 为了记忆以及输入方便,请使用根域名,比如johnrosen.xyz ✅

    A解析直接使用根域名即可,ipv4 address填伺服器/VPS的公网ip, MX解析只需要cname到你的根域名(Target Hostname填你的根域名,比如johnrosen.xyz ✅

  2. 添加rDNS(PTR)解析

    前往伺服器/VPS控制面板,找到rDNS选项(如没有建议自行发工单询问),填入你的域名,完成解析。

  3. 等待A解析生效,请自行ping你的域名来确认解析生效(Namesilo最多需要15min生效)。

三。开始搭建

如果你看到了这里且完成了所有前提条件以及准备工作,那么恭喜你,你已经成功了一半了。

接下来为简单的部分,搭建无需手动完成,脚本即可。

1
apt-get update && apt-get install sudo curl -y && curl -Ss https://raw.githubusercontent.com/johnrosen1/vpstoolbox/master/vps.sh | sudo bash
  1. 选择安装,勾选Mail Service

  2. 输入你的域名,密码等信息,mail user为user@yourdomain中的user单元。

  3. 选择证书申请方式,namesilo的api不好用(cloudflare的最好用),推荐直接HTTP申请。

  4. 若无错误出现,则请等待安装完成。

  5. 安装完成后,访问生成的页面,往下拉,找到Mail Service一栏。

  6. 进入Roundcube Webmail,测试登录是否正常,如正常,进行下一步。

  7. 将生成的SPF以及DKIM record填入你的DNS解析中 DKIM: HOSTNAME填 SPF:HOSTNAME留空,VALUE直接填生成的即可。default._domainkey""


等待解析生效后,测试邮件收发是否正常.

相关文档;

  1. Build Your Own Email Server on Ubuntu: Basic Postfix Setup系列文章

  2. Postfix文档

  3. Dovecot文档

  4. OpenDKIM文档

  5. OpenDMARC文档

主要实现思路等;

  1. 本项目主要是为私人向,因此并没有采用MariaDB/postfixadmin等多用户解决方案,而是直接使用Linux user。

  2. Postfix作为SMTP以及SMTPD伺服器用于收发邮件,收到邮件后先使用Postfix内建的mail filter 处理并标记垃圾邮件,再通过LMTP传送给Dovecot,Dovecot使用sieve插件区分垃圾邮件,将垃圾邮件扔进专门的spam folder,其他邮件则正常进入收件箱。

  3. Roundcube Webmail作为用户收发邮件的GUI。

后记

随着时代的发展,许多人认为隐私权已经无关紧要了,但是,他们错了,没有隐私权,则意味着你的一举一动都在各路资本家,政治家,集权者而不是我们自己的手中,因此我们发展科技不应该是为了他们的利益,而应该是为了我们自己的利益,we are the people,we have our own rights !!!

-------------------------------------------------

Debian10上,使用Postfix+Dovecot+Roundcube搭建邮件服务器

Postfix负责SMTP服务,Dovecot负责IMAP服务,Roundcube是一个WEBMail客户端,如果不需要这个可以不装。

这应该是Postfix+Dovecot的最简配置,没有配置虚拟用户,没有任何防病毒/SPAM配置,512MB内存的小鸡都可以运行的。

我个人的需求是自用,所以用不到虚拟用户,防病毒这个也用不到。SPAM还是有必要的,后续打算用Rspamd,等配置好了再水一篇文章。。

开始之前你需要先准备一个域名,添加一下解析记录。

A记录到你的服务器IP:

MX记录:

再设置2个CNAME记录(可选)SMTP别名:

IMAP别名:

以下步骤仅在Debian10上测试通过,且务必保证你的系统是“干净”的,没有安装其他乱七八糟的软件。

首先安装一些基本工具以及Nginx/Mariadb/PHP(如果不需要Roundcube可以不装这些):

apt -y update
apt -y install wget curl gnupg
apt -y install nginx python-certbot-nginx mariadb-server
apt -y install php7.3-common php7.3-fpm php7.3-imap php7.3-mysql php7.3-mbstring php7.3-xml php7.3-intl php7.3-zip php7.3-gd php7.3-ldap

安装Postfix/Dovecot,Debian10官方存储库内的Dovecot版本太旧,这里添加官方的源安装新版:

curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import
gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg
echo "deb https://repo.dovecot.org/ce-2.3-latest/debian/buster buster main" > /etc/apt/sources.list.d/dovecot.list
apt -y update
apt -y install postfix dovecot-core dovecot-imapd

安装Postfix的时候会提示让你选择什么用途,选择如下图所示的选项:

然后填上你的域名,域名直接填写根域名,不要带什么http/www这些:

修改Postfix的配置,这里用postconf这个工具执行下面的命令就行:

postconf -e "home_mailbox = Maildir/"
postconf -e "smtpd_sasl_auth_enable = yes"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_sasl_security_options = noanonymous"
postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
postconf -n

重启postfix:

systemctl restart postfix

接下来编辑Dovecot的验证配置文件:

nano /etc/dovecot/conf.d/10-auth.conf

修改下面两项配置:

disable_plaintext_auth = no
auth_mechanisms = plain login

修改Dovecot存储邮件的路径:

nano /etc/dovecot/conf.d/10-mail.conf

替换成下面的配置即可:

mail_location = maildir:~/Maildir

接着建立Dovecot与Postfix的验证方式:

nano /etc/dovecot/conf.d/10-master.conf

修改为如下配置:

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

重启Dovecot:

systemctl restart dovecot

设置Postfix/Dovecot/Nginx/Mariadb/PHP-FPM开机自启:

systemctl enable postfix dovecot nginx mariadb php7.3-fpm

创建邮箱账号并修改密码,因为是用于登录邮箱的账户,不要给它登录SSH的权限:

useradd -m -s /sbin/nologin imlala
passwd imlala

至此一个SMTP和IMAP服务就搭建好了,你可以使用其他客户端连接上你的服务器收发邮件啦,为方便使用这里再安装一个Roundcube。

初始化Mariadb/登录到Mariadb内:

mysql_secure_installation
mysql -u root -p

创建数据库/用户/授权:

CREATE DATABASE roundcube CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcube.* TO roundcube@localhost IDENTIFIED BY '设置你的数据库用户密码';
FLUSH PRIVILEGES;

下载Roundcube源码/解压/给予正确的权限:

cd /var/www
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.3/roundcubemail-1.4.3-complete.tar.gz
tar -xzvf roundcubemail-1.4.3-complete.tar.gz
rm -rf roundcubemail-1.4.3-complete.tar.gz
mv roundcubemail-1.4.3 roundcubemail
chown -R www-data:www-data roundcubemail/

导入Roundcube的初始数据:

mysql roundcube < roundcubemail/SQL/mysql.initial.sql

新建一个Nginx配置文件:

nano /etc/nginx/conf.d/roundcube.conf

写入如下配置:

server {
    listen       80;
    server_name  mail.233.fi; # 换成你的域名
    index        index.html index.php;
    root         /var/www/roundcubemail;
    client_max_body_size 128G;

    error_log /var/log/nginx/roundcube.error.log;
    access_log /var/log/nginx/roundcube.access.log;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ ^/(README|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
        deny all;
    }

    location ~ ^/(bin|SQL)/ {
        deny all;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/run/php/php7.3-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

测试Nginx配置:

nginx -t

没问题的话使用CertBot签发一个SSL证书:

certbot --nginx --agree-tos --no-eff-email --email xxxxx@qq.com

打开你的域名开始安装:https://mail.233.fi/installer/

这里就是填写一些MySQL的数据库连接信息,然后SMTP/IMAP连接信息,其他的根据自己的需要看要不要装一些插件什么的,自己看着配置就行了。

安装完成之后你将看到Roundcube的登录界面:

使用你之前用useradd命令创建的账号登录即可,账号不需要加@登录,直接用你创建的用户名登录就行。

登录进去之后你可能需要更改一下发件人的邮件地址,这里可能默认显示imlala@localhost,你要把它改成自己的域名:

最后测试一下能否正常使用,先发个信看看:

看看能收不:

from  http://web.archive.org/web/20210411050643/https://lala.im/6838.html

特别感谢以下文章对本项目提供的支援

  1. Build Your Own Email Server on Ubuntu: Basic Postfix Setup系列文章
  2. Postfix文档
  3. Dovecot文档
  4. OpenDKIM文档
  5. OpenDMARC文档