文档章节

postfix架构简介

g
 goodjin
发布于 08/03 22:29
字数 2125
阅读 4
收藏 0

postfix怎样接收邮件

当一封邮件进入postfix系统时,它的第一站是一个叫incoming的队列。下图展示了新邮件处理的主要流程,带数字的表示命令或程序,不带数字的表示队列.

  trivial-
rewrite(8)
Network -> smtpd(8)  
^
|
|
v
  \
Network -> qmqpd(8) -> cleanup(8) -> incoming
  /
  pickup(8) <- maildrop
  ^
|
Local -> sendmail(1) -> postdrop(1)
  • 网络上的邮件通过smtpd或qmqpd服务进入postfix,这两个服务会移除掉邮件的smtp或qmqp协议的封装信息,对邮件进行健全检查来保护postfix,然后将发件人,收件人和邮件内容提交给cleanup服务。可以通过配置smtpd来阻止那些不想要的邮件。
  • 通过sendmail命令可以从本地提交邮件给postfix,邮件通过postdrop命令进入maildrop队列,这个过程在postfix没有运行时也可以进行。本地服务pickup会对本地提交的邮件进行健全检查,然后将发件人,收件人和邮件内容提交给cleanup服务。
  • 从内部来源的邮件会直接传给cleanup(8)服务,这些来源在上表中并没有展示出来,比如由local(8)转发的邮件,delivery agent,由bounce(8)退回给sender的邮件,server,postmaster的通知邮件。
  • cleanup(8)实现了邮件进入队列前的最最后处理阶段。它会补上缺失的From:和其他头部信息,并将地址转换为规范格式。此外,它还可以配置成对邮件内容进行轻量检查和正则检查。cleanup(8)将处理好的邮件变成一个文件交给incoming队列,并能知队列管理器有新邮件到达。
  • trivial-rewrite(8)将邮件地址重写成标准格式。当前,postfix并没有实现一种重写语言,但是通过lookup表可以实现很多重写,此外还可以通过正则表达式来实现。

postfix怎么投递邮件

一旦一封邮件进入了incoming队列就开始了投递流程,下表展示了postfix投递邮个的整个过程:

trivial-
rewrite(8)
  smtp(8) -> Network
/
 
^
|
|
v
- lmtp(8) -> Network
/
incoming -> active -> qmgr(8) --- local(8) -> File, command
 
^
|
|
v
  \
- virtual(8) -> File
  deferred   \
  pipe(8) -> Command
  • 队列管理器qmgr(8)是postfix进行邮件投递的心脏,它连接smtp(8),lmtp(8),local(8),virtual(8),pipe(8),discard(8),error(8)投递代理,然后发送投递请求投递给多个收件人。discard和error代理比较特殊,它们会丢弃和回弹所有邮件,在上表中并没有展示这两个服务。队列管理维护着一个小的active队列,队列里的邮件是将要进行投递的邮件。active队列对于有可能会很大的incoming和deferred队列来说就像一个有限大小的窗口,这个窗口限制可以使得postfix不会因为队列过大而将内存用完。队列管理器维护着一个 deferred队列保存那些不能投递的邮件,这样即使有大量的邮件积压也不会影响正常队列的访问。
  • trival-rewrite(8)将每一个收件人地址按本地和远程进行分类。附加的路由信息可以通过transport(5)表指定。trival-rewrite不定期地查询relocated(5)表来判断哪些收件人地址已经改变,发给这些收件人的邮件将返回给发件人并加上说明。
  • smtp(8)邮件发送客户端会查询一系列mx服务器作为目标地址交将按优先级排序,逐个尝试这些服务器直到其中一个有响应为止,然后按照协议组装好收件人,发件人和邮件内容,包括了将8-bit MIME转换为7-bit编码。
  • lmtp(8)客户端使用类smtp协议,是一种为了投递邮件而优化过的协议。这种做法的好处是一个postfix可以对接多个邮件服务器,当然一台邮件服务器也可以对接同一个postfix。
  • local(8)代理能识别unix风格,兼容qmail邮箱目录文件,sendmail风格的邮件等等。
  • virtual(8)代理是一个最简单的代理,只能投递unix风格和qmail格式的邮件。不过,它可以为多个域名进行投递,所以特别适合在一台机器上作为多个小域名的host。
  • pipe(8)邮寄者是一个与外部邮件处理系统对接的外发接口,兼容unix。

Postfix behind the scenes

  • master(8)是postfix邮件系统的监控者,在postfix start命令时启动,并伴随着系统的整个运行过程。它负责启动postfix的进程来接收和投递邮件,并在服务意外终止时重启服务,根据master.cf中的配置项来限制服务进程的数量。
  • anvil(8)服务为smtpd服务实现了客户端连接和请求频率限制:
  • bounce(8),defer(8),trace(8)每个服务都维护了一个自己的队列目录树,每封邮件对应一个文件,postfix利用这些信息来发送“失败“,”延迟“或”成功“这些投递状态通知给发件人。
  • cleanup(8) -> qmgr(8)
    Postfix
    queue
    -> Delivery
    agents
    ^
    |
      |
    v
      |
    v
    (Non-)
    delivery
    notice
    <- bounce(8)
    defer(8)
    trace(8)
    <- Queue id,
    recipient,
    status
     
    ^
    |
    |
    v
      Per- 
    message
    logfiles
  • flush(8)服务为每个目标维护日志。将延迟队列中的邮件转移到incoming队列进行投递。
  •   incoming 

    deferred
      ^
    |
    smtpd(8)
    sendmail(1)
    postqueue(1)
    - Destination
    to flush
    -> flush(8) <- Deferred
    destination,
    queue id
    - Delivery
    agents,
    qmgr(8)
     
    ^
    |
    |
    v
      Per-dest-
    ination
    logs
  • proxymap(8)为postfix进程提供了只读和只写的表查询服务,这种方式避免了chroot的限制,查询表可以在多个进程共享,因此减少了表的打开数量,并实现了单个进程来更新表。
  • scache(8)服务为smtp进程维护连接缓存,可以针对指定目标开启连接缓存,为了安全起见,postfix会对连接重用的次数进行限制。
  • showq(8)服务可以列出posfix队列状态,供mailq和postqueue命令使用。
  • spawn(8)服务运行非postfix指令。
  • tlsmgr(8)服务在postfix为smtp和smtpd开启了TLS时运行,它有两个职责:
    • 维护一个伪随机数生成器生成种子供TLS引擎使用,生成器的状态定期保存到一上文件,并在tlsmgr启动时读取。
    • 维护TLS会话中的key的缓存,缓存key可以提高TLS会话的性能。
  • verify(8)服务在smtpd在接收邮件前验证发件人或收件人是否可投递,验证服务先去地址验证缓存进行查询,如果没有找到则向postfix队列注入一个探测消息,由投递代理或队列管理器处理状态更新。
  • postscreen(8)服务可以放在smtpd进程前面,它的目标是从网络接收连接并判断哪些smtp客户端允许访问postfix。postscreen的目的是阻止垃圾邮件的发送者,它会维护一个临时的白名单,白名单中的客户端可以跳过检测。

Postfix support commands

  • postfix,这个命令是用来启动,关闭和重启系统用的,是预留给超级用户使用的。
  • postalias,用来维护aliases(5)类型数据库。
  • postcat,用来展示队列中的文件内容,这是一个初级的工具,可能会被有更强大功能是命令取代。
  • postconf,展示或更新main.cf中的参数。
  • postdrop,一个邮个发送工具,将邮件放到maildrop队列。
  • postkick,使得一些内部通信管道可用,比如供shell脚本用。
  • postlock,提供了postfix兼容的邮筒锁,比如供shell脚本用。
  • postlog,提供了postfix兼容的日志供shell脚本用。
  • postmap,维护了postfix查询表,比如canonical(5),virtual(5)。
  • postmulti,为每一个postfix实例重复”postfix start“命令,并支持创建,删除postfix实例。
  • postqueue,是享有特权的命令,供sendmail和mailq用来刷新或列出队列用。
  • postsuper,用来维护postfix队列,它移除旧的临时文件,并移动队列文件到正确的目录,这个命令在postfix启动和重启时运行。

© 著作权归作者所有

g
粉丝 3
博文 25
码字总数 28707
作品 0
杭州
私信 提问
Postfix的使用与分析

Postfix简介: 在IBM的GPL协议下开发的MTA(邮件传输代理)软件,Postfix更快更容易管理,更安全,同时与sendmail保持兼容。 官网地址:http://www.postfix.org/ 邮件服务器发信原理图: po...

Archer弓兵
2016/07/21
155
4
[转]开源邮件系统

from: http://tieba.baidu.com/f?kz=212290053 1、简介 我们的开源企业级邮件系统包括服务器端及Web客户端两部分。其中服务器端有Postfix、Sendmail及Qmail三种可选软件,Web客户端有Squirre...

夏春涛
2008/03/05
0
0
centos7.3配置邮件服务器(postfix+dovecot+sasl认证)亲测可用

简介: 邮件系统中的角色:MUA(邮件用户代理)MTA(邮件传输代理)MDA(邮件投递代理)。 postfix:发信服务软件,简单的邮件传输协议(SMTP),tcp25端口; dovecot:收信服务软件,是开源得IMA...

一场大火
2017/07/27
0
0
在wdOS系统下搭建postfix和pop/imap邮件收发服务器的一些记录

一.简介: 1. wdOS是一个基于CentOS版本精简优化过的Linux服务器系统,大部分保留着centos服务,而在CentOS中默认的邮件服务器(SMTP方面)是sendmail,但sendmail存在安全隐患,再者邮件的...

shen_丁丁
2012/07/23
169
0
postfix sasl身份验证

基本的smtp协议没有验证用户身份的能力。虽然信封上的寄件人地址已经隐含了发信者的身份,然而,由于信封地址实在太容易假造,所以不能当成身份凭据。 为了判断客户端是否有权使用转发服务(...

jing31
2010/08/12
2.6K
2

没有更多内容

加载失败,请刷新页面

加载更多

postman批量测试

postman批量调用: 先单个调用,成功了 再save为collection 再点击三角形,点击run 设置1000次,run就可以 见《postman批量测试.docx》

Danni3
26分钟前
8
0
js 对象操作 js 对象和对象赋值 去除关联性 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

当我们在项目需要 复制一个对象到另一个对象并且 被复制的对象不能受复制后的对象的影响。 我先总结下 我们哪些方法可以复制对象 // 直接赋值var obj1 = { a: 1 };var obj2 = obj1;...

xiaogg
27分钟前
7
0
Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为C...

倚天码农
41分钟前
5
0
QML笔记-对QML中信号与槽的基本认识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq78442761/article/details/90753986 目录 基本概念 演示...

shzwork
48分钟前
5
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部