最近作了一个应用,须要用邮件发通知,可是免费的邮箱天天发信数量是有限制的,因此呢就想着搭建一个本身的邮件服务器,可以实现邮件的发送和接收便可,其中大概花了一个星期找资料,测试,终于成功了,写个教程分享给你们。mysql
本教程基于 ubuntu 18.04(其余的 linux 理论上也是能够的,只是安装的软件包不同)。用到的主要软件为:postfix,dovecot,mysql.废话很少说,下面是教程:linux
切换到 root 用户下,执行如下命令:算法
apt update apt install postfix postfix-mysql dovecot-core dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-mysql
安装过程当中 postfix 会弹出提示:sql
这里咱们选择第二项:Internet Site。
接着会有以下提示:shell
这里填入:test.com
数据库
在域名提供商增长如下解析:ubuntu
test.com
指向 服务器IP
pop3.test.com
指向 服务器IP
smtp.test.com
指向 服务器IP
新建一个数据库 mailserver,管理帐号为:admin/123456vim
建立虚拟域表,做为认证域。该表是邮件服务器用以接收邮件的域名:安全
-- 创建表 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')
建立用户表,用于用户身份认证。bash
-- 建立用户表 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 证书可参考这一篇https://www.jianshu.com/p/b47d862bceeb.为 test.com 生成 ssl 证书,假设证书存放地址为:
首选备份 postfix 的默认配置文件,而后编辑main.cf
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak vim /etc/postfix/main.cf
注释下面的配置:
而后加入以下的配置:
# 使用本身的ssl证书 smtpd_tls_cert_file=/etc/letsencrypt/live/test.com/fullchain.pem smtpd_tls_key_file=/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
接下来建立上面最后加入的三项参数对应的文件。
建立/etc/postfix/mysql-virtual-mailbox-domains.cf
,内容以下:
user = admin password = 123456 port = 3306 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
接着重启 postfix,并测试 postfix 可否找到域,若是成功返回 1:
service postfix restart postmap -q test.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
建立/etc/postfix/mysql-virtual-mailbox-maps.cf
,内容以下:
user = admin password = 123456 port = 3306 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
接着重启 postfix,并测试其可否找到邮箱地址,成功返回 1:
service postfix restart postmap -q first@test.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
最后建立/etc/postfix/mysql-virtual-alias-maps.cf
,内容以下:
user = admin password = 123456 port = 3306 hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
一样重启 postfix,验证可否正确找到别名,并返回:
service postfix restart postmap -q first@test.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
若是响应使用 587 端口来进行俺的 smtp 通讯,需修改/etc/postfix/master.cf 文件:
取消如下行的注释:
postfix 配置完毕,如今来配置 dovecot,首先编辑主配置文件/etc/dovecot/dovecot.conf
:
首先确保下面一行是启用的:
!include conf.d/*.conf
而后在配置文件的最后加入以下配置,启用各协议:
protocols = imap lmtp pop3
修改/etc/dovecot/conf.d/10-mail.conf
,确保存在如下两个配置:
mail_location = maildir:/var/mail/vhosts/%d/%n mail_privileged_group = mail
上面的配置将邮件存放目录设置在/var/mail 中,所以将该文件夹的所属人改成 vmail/vmail.命令以下:
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/mail chown -R vmail:vmail /var/mail
修改/etc/dovecot/conf.d/10-auth.conf
。首先确保以下两个配置存在且值正确:
disable_plaintext_auth = yes auth_mechanisms = plain login
而后修改配置以禁用系统用户登录,并开启 mysql 支持,以下图所示:
修改/etc/dovecot/dovecot-sql.conf.ext
文件,将内容改为下面的内容:
passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
修改/etc/dovecot/dovecot-sql.conf.ext
:
首选取消 driver 参数注释并设置为 mysql
driver = mysql
而后取消 connect 行注释并设置为以下内容:
connect = host=127.0.0.1 port=3306 dbname=mailserver user=admin password=123456
接着取消 default_pass_scheme 行的注释并改成 MD5
default_pass_scheme = MD5
接着取消 password_query 行的注释并设置为如下信息:
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
最后将/etc/dovecot
的拥有者改成 vmail:dovecot
chown -R vmail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot
修改/etc/dovecot/conf.d/10-master.conf
:
首先将 imap-login , pop3-login 下第一个的 port 设置为 0,以禁用非 ssl 加密的 imap 和 pop3 协议,以下图所示:
而后找到service lmtp
将其修改成以下:
service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} }
而后找到service auth
将其内容修改成以下:
service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail #group = } user = dovecot }
最后找到service auth-worker
改成以下内容:
service auth-worker { # Auth worker process is run as root by default, so that it can access # /etc/shadow. If this isn't necessary, the user should be changed to # $default_internal_user. user = vmail }
最后要改的就是/etc/dovecot/conf.d/10-ssl.conf
,以开启 ssl 认证.
首先将 ssl 参数改成 required:
ssl = required
而后设置 ssl 证书路径就 ok 了,仍是用以前的 ssl 证书:
ssl_cert = </etc/letsencrypt/live/test.com/fullchain.pem ssl_key = </etc/letsencrypt/live/test.com/privkey.pem
到这里全部的配置都 OK,重启 postfix,dovecot 后就能够用邮箱客户端(好比 foxmail)链接了。
service postfix restart service dovecot restart
配合一个邮件客户端看似很简单,实际上仍是有不少坑的,看看上面那么多的配置项就知道了,必定要耐心。
若是没法登录,能够看看 postfix 和 dovecot 的日志报错状况,再去修改。日志位置在/var/log
注意:
被这个问题困扰了好几天,未找到解决办法,最后放弃.
目前不少主机厂商都不支持和其余服务器的 25 端口通讯,已知的有(谷歌云,阿里云),这样就致使在这些机器上搭建的 postfix 邮件服务器,没法向其余的外网邮箱发送邮件,由于没法和其余 smtp 服务器的 25 端口创建链接。貌似是为了不有人恶意搭建邮件服务器向其余的邮件服务器发送大量的垃圾邮件,从而致使此服务器 IP 被反垃圾邮件组织列入 SML。