最近做了一个应用,需要用邮件发通知,但是免费的邮箱每天发信数量是有限制的,所以呢就想着搭建一个自己的邮件服务器,能够实现邮件的发送和接收即可,其中大概花了一个星期找资料,测试,终于成功了,写个教程分享给大家。
本教程基于 ubuntu 18.04(其他的 linux 理论上也是可以的,只是安装的软件包不一样)。用到的主要软件为:postfix,dovecot,mysql.废话不多说,下面是教程:
前置条件mysql 数据库。本教程中使用 mysql 存储域名,用户信息等。
域名。需要有域名才能实现向公网发邮件/收邮件。这里以 test.com 为例。
ssl 证书。有不少免费的 ssl 证书提供商,或者使用自签证书,百度即可。
安装环境 安装软件切换到 root 用户下,执行以下命令:
apt update apt install postfix postfix-mysql dovecot-core dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-mysql安装过程中 postfix 会弹出提示:
这里我们选择第二项:Internet Site。
接着会有如下提示:
这里填入:test.com
配置 mx 解析在域名提供商增加以下解析:
MX 记录:test.com 指向 服务器IP
A 记录:pop3.test.com 指向 服务器IP
A 记录:smtp.test.com 指向 服务器IP
创建 mysql 数据库新建一个数据库 mailserver,管理账号为:admin/123456
创建虚拟域表,作为认证域。该表是邮件服务器用以接收邮件的域名:
-- 建立表 CREATE TABLE `virtual_domains` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 插入一条记录 insert into virtual_domains values(1,'test.com')创建用户表,用于用户身份认证。
-- 创建用户表 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; -- 插入两个用户,以md5加密密码,实际应用中应该选择强度更高的算法,md5目前以及不安全了 insert into virtual_users values(1,1,md5('123456'),'first@test.com'); insert into virtual_users values(2,1,md5('123456'),'second@test.com');创建别名表.该表作用相当于当 source 收到邮件时,该邮件会自动转发到 destination 上。
-- 创建表 CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) 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; -- 插入数据,所有发给first的邮件都会自动转发给second insert into virtual_aliases values(1,1,'first@test.com','second@test.com') 生成 ssl 证书生成 ssl 证书可参考这一篇https://www.jianshu.com/p/b47d862bceeb.为 test.com 生成 ssl 证书,假设证书存放地址为:
公钥 /etc/letsencrypt/live/test.com/fullchain.pem;
私钥 /etc/letsencrypt/live/test.com/privkey.pem;
配置 postfix首选备份 postfix 的默认配置文件,然后编辑main.cf
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak vim /etc/postfix/main.cf 注释下面的配置:
然后加入如下的配置:
# 使用自己的ssl证书 smtpd_tls_cert_file=http://www.likecs.com/etc/letsencrypt/live/test.com/fullchain.pem smtpd_tls_key_file=http://www.likecs.com/etc/letsencrypt/live/test.com/privkey.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes # 使用dovecot来做身份认证 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修改 myhostname,myorigin 为如下的值:
myhostname = test.com myorigin = $myhostname修改 mydestination 值为 localhost,以启动 mysql 中的虚拟域。:
mydestination = localhost在配置文件的最后加入以下行,确保将邮件投递给 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接下来创建上面最后加入的三项参数对应的文件。