centos环境搭建postfix邮件服务

2022-11-21 18:56:21 浏览数 (1)

postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真是一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。

简介

Postfix 是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现,是一个开放源代码的软件。

特点

  1. postfix是免费的: postfix想要作用的范围是广大的Internet用户,试图影响大多数的Internet上的电子邮件系统,因此它是免费的。
  2. 更快: postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。
  3. 兼容性好: postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。
  4. 更健壮: postfix被设计成在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目。当处理的邮件数目增长时,postfix运行的进程不会跟着增加。
  5. 更灵活: postfix是由超过一打的小程序组成的,每个程序完成特定的功能。你可以通过配置文件设置每个程序的运行参数。
  6. 安全性 postfix具有多层防御结构,可以有效地抵御恶意入侵者。如大多数的postfix程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。

结构

postfix由十几个具有不同功能的半驻留进程组成,并且在这些进程中并无特定的进程间父子关系。某一个特定的进程可以为其他进程提供特定的服务。 大多数的postfix进程由一个进程统一进行管理,该进程负责在需要的时候调用其他进程,这个管理进程就是master进程。该进程也是一个后台程序。 这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等。通过灵活的配置特性可以使整个系统的运行成本大大降低。 1.2.1 postfix的邮件队列(mail queues) postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理: 1. maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。 2. incoming:放置正在到达或队列管理进程尚未发现的邮件。 3. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有长度的限制。 4. deferred:放置不能被投递的邮件。 队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限制,这样做的目的是为了避免进程运行内存超过系统的可用内存。 1.2.2 postfix对邮件风暴的处理 当有新的邮件到达时,postfix进行初始化,初始化时postfix同时只接受两个并发的连接请求。当邮件投递成功后,可以同时接受的并发连接的数目就会缓慢地增长至一个可以配置的值。当然,如果这时系统的消耗已到达系统不能承受的负载就会停止增长。还有一种情况时,如果postfix在处理邮件过程中遇到了问题,则该值会开始降低。 当接收到的新邮件的数量超过postfix的投递能力时,postfix会暂时停止投递deferred队列中的邮件而去处理新接收到的邮件。这是因为处理新邮件的延迟要小于处理deferred队列中的邮件。Postfix会在空闲时处理deferred中的邮件。 1.2.3 postfix对无法投递的邮件的处理 当一封邮件第一次不能成功投递时,postfix会给该邮件贴上一个将来的时间邮票。邮件队列管理程序会忽略贴有将来时间邮票的邮件。时间邮票到期时,postfix会尝试再对该邮件进行一次投递,如果这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时[间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推。当然,经过一定次数的尝试之后,postfix会放弃]对该邮件的投递,返回一个错误信息给该邮件的发件人。 1.2.4 postfix对不可到达的目的地邮件的处理 postfix会在内存中保存一个有长度限制的当前不可到达的地址列表。这样就避免了对那些目的地为当前不可到达地址的邮件的投递尝试。从而大大提高了系统的性能。 1.2.5 postfix的安全性 postfix通过一系列的措施来提高系统的安全性,这些措施包括: 1. 动态分配内存,从而防止系统缓冲区溢出; 2. 把大邮件分割成几块进行处理,投递时再重组; 3. Postfix的各种进程不在其他用户进程的控制之下运行,而是运行在驻留主进程master的控制之下,与其他用户进程无父子关系,所以有很好的绝缘性。 4. Postfix的队列文件有其特殊的格式,只能被postfix本身识别;

处理过程

2.1 接收邮件的过程 当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理: 1.对于来自于本地的邮件:local进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。 2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。 3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。 5. 由postfix自己产生的邮件:提示postmaster(也即postfix管理员)postfix运行过程中出现的问题。(如SMTP协议问题,违反UCE规则的记录等等。) 关于cleanup后台程序的说明:cleanup是对新邮件进行处理的最后一道工序,它对新邮件进行以下的处理:添加信头中丢失的Form信息;为将地址重写成标准的user@fully.qualified.domain格式进行排列;从信头中抽出收件人的地址;将邮件投入incoming队列中,并请求邮件队列管理进程处理该邮件;请求trivial-rewrite进程将地址转换成标准的user@fully.qualified.domain格式。 2.2 投递邮件的过程 新邮件一旦到达incoming队列,下一步就是开始投递邮件,postfix投递邮件时的处理过程如图三所示。相关的说明如下: 邮件队列管理进程是整个postfix邮件系统的心脏。它和local、smtp、pipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递请求发送给投递代理。队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中。除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出。邮件队列管理程序还负责将收件人地址在relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址。 如果邮件队列管理进程请求,rewrite后台程序对收件人地址进行解析。但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区别。 如果邮件对你管理进程请求,bounce后台程序可以生成一个邮件不可投递的报告。 本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件。可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的。你可以配置local将邮件投递到用户的宿主目录,也可以配置local将邮件发送给一个外部命令,如流行的本地投递代理procmail。在流行的linux发行版本RedHat中,我们就使用procmail作为最终的本地投递代理。 远程投递代理SMTP进程根据收件人地址查询一个SMTP服务器列表,按照顺序连接每一个SMTP服务器,根据性能对该表进行排序。在系统负载太大时,可以有数个并发的SMTP进程同时运行。 pipe是postfix调用外部命令处理邮件的机制.

延伸程序

EMOS EMOS是一个基于CentOS,集成ExtMail 邮件系统,只需10分钟就可安装配置完毕的小型Linux系统,使安装不再有压力。 ExtMail 邮件系统 ExtMail最初以WebMail软件为主,后逐步完善配套并形成了ExtMail邮件系统,提供完整的SMTP/POP/IMAP/Web和管理支持。目前装机量超过2万台。 iRedMail iRedMail 是一套基于 GPL 发布的 Shell 脚本,目的是全自动安装和配置邮件服务所需要的组件,以减轻系统管理员的负担。它提供了一个基本的命令行下的用户交互界面(使用 dialog 程序实现),用户只需要简单地选择他所希望使用的组件,就可以在几分钟内(少于 3 分钟)部署好一台功能强大的邮件服务器。 Tmail Tmail最初以postfix后台管理软件为主,后逐步完善配套并形成了tmail邮件系统,提供完整的SMTP/POP/IMAP/Web和后台管理和监控支持。目前装机量超过3万台。

版本发布

2012年02月01日,Postfix 2.9.0/2.8.8 发布,SMTP服务器。 2012年02月19日,Postfix2.9.1 发布,SMTP 服务器。 2012年12月14日,Postfix 2.9.5/2.8.13 发布,SMTP 服务器。

环境准备

IP

版本

192.168.1.10

CentOS Linux release 7.6.1810 (Core)

准备域名

实验环境为了方便直接修改hosts文件

代码语言:javascript复制
[root@localhost ~]# vim /etc/hosts
# 添加
192.168.1.10 hello.com

安装postfix devecot

本文档只是搭建一个简单的邮件服务,其他功能还需自己去探索

Postfix、Dovecot 简介

Postfix

Postfix是一个标准的MTA服务器,它负责通过SMTP协议管理发送到本机的邮件以及由本机发向外界的邮件

Dovecot

Dovecot是一个优秀的IMAP/POP服务器,用以接收外界发送到本机的邮件。

安装

代码语言:javascript复制
[root@localhost ~]# yum -y install postfix dovecot

配置Postfix

参考:配置文件文档

修改配置文件时,下面的变量为唯一,如果有重复的则删除,保留一个变量即可
代码语言:javascript复制
[root@localhost ~]# vim /etc/postfix/main.cf 
myhostname = server.hello.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
myorigin = $mydomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/
# 末尾添加
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem

配置smtps

部分邮件客户端依赖于使用 465 端口提供加密连接,所以我们修改配置,允许 Postfix 使用 465 端口发送邮件。

代码语言:javascript复制
[root@localhost ~]# vim /etc/postfix/master.cf 
# 取消注释
smtps     inet  n       -       n       -       -       smtpd
 -o smtpd_tls_wrappermode=yes

(注意: -o 前要保留空格)

启动postfix

代码语言:javascript复制
[root@localhost ~]# systemctl start postfix
[root@localhost ~]# systemctl enable postfix

Postfix 日志

Postfix 系统的日志文件在系统的这个目录下的 /var/log/maillog 文件,此文件记录了 Postfix 服务器的运行状态信息。

配置Dovecot

修改dovecot.conf

代码语言:javascript复制
[root@localhost ~]# vim /etc/dovecot/dovecot.conf
# 末尾添加
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
protocols = imap pop3 lmtp
listen = *
mail_location = Maildir:~/Maildir
disable_plaintext_auth = no

修改10-master.conf

代码语言:javascript复制
[root@localhost ~]# vim /etc/dovecot/conf.d/10-master.conf
# 取消注释
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }

启动Dovecot

代码语言:javascript复制
[root@localhost ~]# systemctl start dovecot
[root@localhost ~]# systemctl enable dovecot

/var/log/maillog文件最后一行如下即成功

代码语言:javascript复制
[root@localhost ~]# tail -f /var/log/maillog
Dec 21 14:41:39 localhost dovecot: master: Dovecot v2.2.36 (1f10bfa63) starting up for imap, pop3, lmtp (core dumps disabled)

创建账户

该配置下邮箱账户依赖于系统用户,所以通过添加系统用户的方式创建邮箱账户。

添加发送用户

代码语言:javascript复制
[root@localhost ~]# useradd test
[root@localhost ~]# passwd test

添加接收用户

使用root用户不能接收邮件,因为发送要在root的家目录下创建目录,没有权限,所以需要创建普通用户

代码语言:javascript复制
[root@localhost ~]# useradd hello

测试

切换为test用户发送邮件

代码语言:javascript复制
[root@localhost new]# su test
[test@localhost ~]$ echo "postfix test" | mail -s "hello" hello@hello.com

查看hello用户的家目录下

代码语言:javascript复制
[root@localhost new]# cd /home/hello/Maildir/new
[root@localhost new]# cat 1608533152.Vfd00I6505fM551126.localhost.localdomain 
Return-Path: <test@localhost.localdomain>
X-Original-To: hello@hello.com
Delivered-To: hello@hello.com
Received: from localhost.localdomain (localhost [127.0.0.1])
	by server.hello.com (Postfix) with ESMTP id 74E5D10488A9
	for <hello@hello.com>; Mon, 21 Dec 2020 14:45:52  0800 (CST)
Received: (from test@localhost)
	by localhost.localdomain (8.14.7/8.14.7/Submit) id 0BL6jqCp011327
	for hello@hello.com; Mon, 21 Dec 2020 14:45:52  0800
From: test@localhost.localdomain
Message-Id: <202012210645.0BL6jqCp011327@localhost.localdomain>
Date: Mon, 21 Dec 2020 14:45:52  0800
To: hello@hello.com
Subject: hello
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

postfix test

0 人点赞