postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。postfix是Wietse Venema想要为使用最普遍的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是经过sendmail来投递的,大约有100万用户使用sendmail,天天投递上亿封邮件。这真是一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。linux
简介 1.1 postfix的特色数据库
1. postfix是免费的:小程序
postfix想要做用的范围是广大的Internet用户,试图影响大多数的Internet上的电子邮件系统,所以它是免费的。vim
2. 更快:安全
postfix在性能上大约比sendmail×××倍。一部运行postfix的台式PC天天能够收发上百万封邮件。服务器
3. 兼容性好:网络
postfix是sendmail兼容的,从而使sendmail用户能够很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。并发
4. 更健壮:dom
postfix被设计成在重负荷之下仍然能够正常工做。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减小运行进程的数目。当处理的邮件数目增加时,postfix运行的进程不会跟着增长。ide
5. 更灵活:
postfix是由超过一打的小程序组成的,每一个程序完成特定的功能。你能够经过配置文件设置每一个程序的运行参数。
6. 安全性
postfix具备多层防护结构,能够有效地抵御恶意***者。如大多数的postfix程序能够运行在较低的权限之下,不能够经过网络访问安全性相关的本地投递程序等等。
1.2 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经过一系列的措施来提升系统的安全性,这些措施包括:
2. 把大邮件分割成几块进行处理,投递时再重组;
3. Postfix的各类进程不[在其余用户进程的控制之下运行,而是运行在驻留主进程master的控制之下,与其余用户进程无父子关系,因此有很好的绝缘性。
4. Postfix的队列文件有其特殊的格式,只能被postfix自己识别;
postfix对邮件的处理过程 2.1 接收邮件的过程
当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,而后针对不一样的状况进行不一样的处理:
1.对于来自于本地的邮件:locall进程负责接收来自本地的邮件放在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调用外部命令处理邮件的机制.
下面进行postfix的环境搭建:
本次试验环境都是根据上几回试验后的环境为基础进行搭建的
[root@mail ~]# service sendmail stop
[root@mail ~]# chkconfig sendmail off
[root@mail ~]# yum install postfix
[root@mail ~]# service postfix start
[root@mail ~]# chkconfig postfix on
修改配置文件以下:
[root@mail ~]# vim /etc/postfix/master.cf
咱们能够看到master管理的模块
[root@mail ~]# postconf –n //postfix能够修改的选项
[root@mail ~]# postconf –d //postfix默认的选项
[root@mail ~]# postconf //postfix当前正在生效的选项
[root@mail ~]# postconf -e "$mydomain=bj.zz.com" //直接进行修改里面的选项,不建议这样作
[root@mail ~]# vim /etc/postfix/main.cf //配置文件
69 myhostname = mail.bj.zz.com //主机名
77 mydomain = bj.zz.com //域名
93 myorigin = $mydomain //向外发送邮件时说明邮件是哪一个域的,通常用于地址假装。可选修改项
107 inet_interfaces = all //监听地址
110 #inet_interfaces = localhost //监听本端地址,注释掉。
155 #mydestination = $myhostname, localhost.$mydomain, localhost
156 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain //根据域名决定哪些邮件是本地邮件
发送邮件测试
root@mail ~]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.bj.zz.com ESMTP Postfix
mail from:user1@bj.zz.com
250 2.1.0 Ok
rcpt to:user2@bj.zz.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:test
zzzzzzzzzzzzzzzzzzzz
.
250 2.0.0 Ok: queued as 5CC7E10D74C
quit
221 2.0.0 Bye
Connection closed by foreign host.
查看日志
[root@mail ~]# tail -f /var/log/maillog
Aug 13 04:14:07 mail postfix/qmgr[7518]: 5CC7E10D74C: from=<user1@bj.zz.com>, size=385, nrcpt=1 (queue active)
Aug 13 04:14:07 mail postfix/local[7520]: 5CC7E10D74C: to=<user2@bj.zz.com>, relay=local, delay=39, delays=39/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
切换用户user2,查看是否收到邮件。
[root@mail ~]# su - user2
[user2@mail ~]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/user2": 3 messages 2 new
1 MAILER-DAEMON@mail.b Sun Aug 12 19:28 13/548 "DON'T DELETE THIS MESSAGE -- F"
>N 2 user1@bj.zz.com Mon Aug 13 04:13 15/505 "test"
N 3 user1@bj.zz.com Mon Aug 13 04:14 15/515 "test"
& 3
Message 3:
From user1@bj.zz.com Mon Aug 13 04:14:07 2012
X-Original-To: user2@bj.zz.com
Delivered-To: user2@bj.zz.com
subject:test
Date: Mon, 13 Aug 2012 04:13:28 +0800 (CST)
From: user1@bj.zz.com
To: undisclosed-recipients:;
zzzzzzzzzzzzzzzzzzzz