Mailu自建邮件服务器指南

Mailu自建邮件服务器指南

Mailu是一款免费开源且性能强大、功能丰富的域名邮箱系统。它基于Docker, 集成了postfix、dovecot、rspmad等等,具有部署简单,可移植性高,备份方便等多种优势。
其包含的功能:

  • 实现了SMTP IMAP
  • 可设置域别名、自定义路由
  • 支持自定义转发、自定义回复
  • 安全 强制启用TLS
  • 集成了Rspmad反垃圾策略

安装步骤:
我这里使用的是2.0版本:

网站地址按实际情况设置:

在Step3中,一定要把ipv4 listen address 写成0.0.0.0

我在第一次设置时,没有更改默认的127.0.0.1,导致我在外部完全访问不到项目,花了相当多的时间才明白原来是开始的时候就配置的有问题。

在完成Setup后,mailu会为你生成配置文件(下图是从CSDN博客摘下来的,仅用作示例):

按这样的步骤就可以启动mailu 的docker项目了,如果有以下为状态,即为运行成功:

打开你配置的Url地址,就可以看到Mailu的web页面,成功!

Mailu组成:

虽然mailu的安装过程相对傻瓜式,但想要使用的比较熟练,开发自定义功能,是需要对其原理有着一定的理解的。现在让我们分析一下mailu的主要组成:

mailu的绝对核心,postfix,其 是一个开源的邮件传输代理(MTA),通常用于 Unix 和类 Unix 系统,如 Linux。它的设计目标是易于管理、安全和快速。Postfix 负责处理、路由和传递电子邮件消息。也就是说,mailu的核心功能就是由postfix来实现的。

除了postfix,dovecot也提供了重要的服务,其是一个开源的IMAP和POP3邮件服务器,能够全面满足RFC标准,提供了较为强大的安全机制。最后,rspamd提供了反垃圾邮件策略,该策略也是能够被用户自定义的。

通过分析我们可以发现,如果我们需要对邮件服务器默认的配置进行更改,大概率还是需要在postfix进行更改的,毕竟它掌管着邮件发送的核心任务!在使用docker exec 命令进入容器内部后,进入/etc/postfix,会发现有一个文件叫做main.cf,这就是其配置文件,下面给出其部分内容:

# General
###############

# Main domain and hostname
mydomain = email-marketing-hub.com
myhostname = mail.email-marketing-hub.com
myorigin = $mydomain
maillog_file = /dev/stdout

# Queue location
queue_directory = /queue

# Message size limit
message_size_limit = 50000000

# Relayed networks
mynetworks = 127.0.0.1/32 192.168.203.0/24

# Empty alias list to override the configuration variable and disable NIS
alias_maps =

# Podop configuration
podop = socketmap:unix:/tmp/podop.socket:

postscreen_upstream_proxy_protocol = haproxy
compatibility_level=3.6
smtpd_forbid_bare_newline=yes

# Only accept virtual emails
mydestination =

# Relayhost if any is configured
relayhost =
inet_interfaces = all
local_transport = error:local delivery is disabled
# Recipient delimiter for extended addresses
recipient_delimiter = +
defalut_transport = smtp
relay_transport = smtp
###############
# TLS
###############

下面对以上配置文件中比较重要的一些参数进行含义说明:

mydestination:用于指定邮件系统可以直接投递到本地的域名。换句话说,当Postfix接收到一个邮件时,如果邮件的收件人地址的域名与mydestination中的任何一个域名匹配,那么Postfix就会将这封邮件视为本地邮件,并将其投递到本地邮箱。在我的配置中我是把这个参数只设置为我们拥有的域名email-marketing-hub.com,希望的效果是如果是本地创建的域名就本地邮箱处理,否则转发到外部SMTP服务器去处理。

relayhost:指定了Postfix将邮件转发到的中继邮件服务器。当Postfix接收到一封需要转发的邮件时,它会将邮件发送到relayhost指定的服务器。

transport_maps:用于指定特殊的传输映射规则,通过这些规则,你可以定义特定域或地址的邮件应该如何传递。它允许更灵活的邮件路由控制。

transport_maps这个参数特别特别重要!这个参数和其他参数混在一起,一开始很难看出来这个参数的重要性,为什么这么说呢?因为后来我们的系统遇到了一个重大bug,邮件发送不到特定的邮箱,例如gmail,会得到退信,显示错误代码550 User doesn’t exist!这是非常令人费解的,根据邮件传递的规则,这个指令一般表明邮件已经成功到达收件方的邮件服务器了,但是没有找到对应的用户才会显示这个错误,否则会是其他错误,如 错误代码550 5.7.1 表明该IP进入了黑名单,无法进入目标服务器。

这个问题困扰了我将近一周的时间,我一度以为是我的域名配置有问题,如SPF/DKIM甚rDNS记录都进行了验证,结果没有发现任何问题。于是不得不去postfix的日志去查看邮件的具体投递情况,开始也一无所获,直到我开始特别关注到一个地方:

relay显示为imap[192.168.203.7],显然,这是一个私有IP,但该邮件我是发向qq的!如果真的到达了qq的邮件服务器,为什么会是由这个私有IP处理的?这下我又去检查了一下本地域名,终于发现了问题所在:

怎么本地域名里面有一个qq.com?这下问题就很明白了,我自以为设置了mydestination参数就可以了,实际上如果我在发送邮件时如果本地域名有同名的,就会导致优先发送到本地,而不是转发到真正的qq邮件服务器!为了解决这个冲突,我不得不设置特殊的映射规则。在经过了一番尝试后,我才终于发现下面这个参数:

transport_maps = lmdb:/etc/postfix/transport.map

在这个transport.map文件中,你需要设置一个对应关系:

.         smtp:[]

完成后,再生成transport.map.lmdb文件,这样配置文件才能够正确识别。这样,其会将所有邮件都进行外部转发而非本地处理!经过该修改,终于可以成功向gmail发送邮件了!

到这里,关于mailu自建邮件服务器基本就完成了。

API说明

 

留下回复