最近作了一个应用,须要用邮件发通知,可是免费的邮箱天天发信数量是有限制的,因此呢就想着搭建一个本身的邮件服务器,可以实现邮件的发送和接收便可,其中大概花了一个星期找资料,测试,终于成功了,写个教程分享给你们。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 证书可参考这一篇www.jianshu.com/p/b47d862bc….为 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。
本博客原创发布于:www.tapme.top/blog/detail…
扫码关注微信公众号:FleyX 学习笔记,获取更多干货