基于ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)

前言

本教程基于 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=/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 文件:

取消以下行的注释:

配置 dovecot

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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题

    如果需要用php的mail()函数来发送邮件,是需要服务器安装sendmail组件才能支持的,这个在php的手册中mail()函数部分也有介绍到.然后在 在Ubuntu下安装sendmail的命令: 复制代码 代码如下: sudo apt-get install sendmail 安装好之后,启动sendmail服务: 复制代码 代码如下: sudo service sendmail start 有了sendmail的支持,就可以在php中用mail()函数发送邮件了. 一般造成在php用mai

  • Ubuntu下搭建mail邮件服务器的方法教程

    前言 大家在有了自己的网站当然也想弄个自己的邮箱了,虽然不一定用得上,但是搞一个自己域名的邮件系统还是很酷的.(前提是已经购买了域名) 一些复杂的文件配置和指令操作就不细研究了,毕竟现在也用不上,下面就简单搭建一个能够收发邮件的服务器. 安装PostFix postfix就是我们的邮件服务器了,用$sudo apt install postfix 即可安装. 安装好了我们的服务就算是启动了,下面我们就用他来发邮件. (注意,此时的本机的邮箱地址就是当前的"用户名@域名",因此注册自己的

  • 基于ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)

    前言 本教程基于 ubuntu 18.04(其他的 linux 理论上也是可以的,知识安装的软件包不一样).用到的主要软件为:postfix,dovecot,mysql.废话不多说,下面是教程: 前置条件 mysql 数据库.本教程中使用 mysql 存储域名,用户信息等. 域名.需要有域名才能实现向公网发邮件/收邮件.这里以 test.com 为例. ssl 证书.有不少免费的 ssl 证书提供商,或者使用自签证书,百度即可. 安装环境 安装软件 切换到 root 用户下,执行以下命令: ap

  • 使用ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)

    前言 本教程基于 ubuntu 18.04(其他的 linux 理论上也是可以的,知识安装的软件包不一样).用到的主要软件为:postfix,dovecot,mysql.废话不多说,下面是教程: 前置条件 mysql 数据库.本教程中使用 mysql 存储域名,用户信息等. 域名.需要有域名才能实现向公网发邮件/收邮件.这里以 test.com 为例. ssl 证书.有不少免费的 ssl 证书提供商,或者使用自签证书,百度即可. 安装软件 切换到 root 用户下,执行以下命令: apt upd

  • CentOS 7.2部署邮件服务器(Postfix)

    一.Postfix简介 Postfix 是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的.最早在1990年代晚期出现,是一个开放源代码的软件. Postfix 官方网站:http://www.postfix.org/ Postfix 下载地址:http://www.postfix.org/download.html 二.Postfix安装 安装Postf

  • 如何在CentOS8上安装和配置Postfix邮件服务器的方法示例

    Postfix 是一个自由开源的 MTA(邮件传输代理),用于在 Linux 系统上路由或传递电子邮件.在本指南中,你将学习如何在 CentOS 8 上安装和配置 Postfix. 实验室设置: 系统:CentOS 8 服务器 IP 地址:192.168.1.13 主机名:server1.crazytechgeek.info(确保域名指向服务器的 IP) 步骤 1)更新系统 第一步是确保系统软件包是最新的.为此,请按如下所示更新系统: # dnf update 继续之前,还请确保不存在其他 MT

  • Ubuntu 搭建基于Docker的LNMP+Redis的开发环境(图文)

    Ubuntu 搭建基于Docker的LNMP+Redis的开发环境 服务器环境:Ubuntu 14.04 1.安装Docker 1.1 执行update命令,和服务器同步软件包,执行apt-get install * 时可以下载最新的软件. 1.2 安装Docker和创建软链接   1.3 启用Docker服务 2. 获取搭建环境所需镜像 2.1 MySQL镜像 2.2 Redis镜像   2.3 nginx-php-fpm镜像 2.4 查看已下载的镜像 对于Docker初学者来说,可以使用现有

  • 基于node搭建服务器,写接口,调接口,跨域的实例

    刚开始学node,今天做这个也是累死宝宝了,以后可以自己写接口自己用了,再也不用麻烦人家后台人员了,这些年我们欠他们的太多了,说多了都是泪,不多说,往下看吧... 服务端项目目录下: 1.npm init 创建package.json文件: 2.创建一个app.js文件,下面的标注都有了,简单的写了一个接口,下面会用,对跨域访问做了设置 var express=require('express'); var app =express(); //设置跨域访问 app.all('*', functi

  • 基于Javamail实现发送邮件(QQ/网易邮件服务器)

    本文实例为大家分享了Javamail实现发送邮件的具体代码,供大家参考,具体内容如下 一. 使用QQ邮箱作为smtp邮件服务器发送邮件 步骤1.开启QQ邮箱的POP3/SMTP服务: 开启后会得到一个16位授权码, 作为第三方使用邮件服务器的登录凭证.注意: 修改邮箱密码后, 授权码会失效, 需要重新获取. 步骤2: 编写配置文件applicationContext-email.xml(此处使用xml配置方式): <?xml version="1.0" encoding=&quo

  • 详解基于docker搭建lanproxy内网穿透服务

    文档更新说明 2018年04月06日 v1.0 内网穿透相信是后端开发者经常遇到的需求,可是怎么实现呢?其实有现成的服务:花生壳.ngrok等,但是,最近花生壳宣布,免费版的内网穿透将不支持80端口映射了,而免费版的ngrok也不够稳定,于是乎,我就开始需找新的解决方案了 本文使用了docker.nginx,要全部搞懂的话需要一定的后端基础(当然,基本上入个门就可以了),个人认为还是有一定阅读门槛的,但是你如果只是想把服务搭建起来,按照步骤来做是不难的 1.概述 内网穿透其实就是用服务器做一个中

  • 基于docker 搭建Prometheus+Grafana的过程详解

    一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作.Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus.现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控. Prometheus基本原理是通过HTT

随机推荐