分享
 
 
 

邮件系统postfix安装与配置(上)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

一、 postfix概述

postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。下面一段话摘自postfix的官方站点(http://www.postfix.org):

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

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程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。

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.2 postfix的安全性

postfix通过一系列的措施来提高系统的安全性,这些措施包括:

1. 动态分配内存,从而防止系统缓冲区溢出;

2. 把大邮件分割成几块进行处理,投递时再重组;

3. Postfix的各种进程不在其他用户进程的控制之下运行,而是运行在驻留

主进程master的控制之下,与其他用户进程无父子关系,所有有很好的

绝缘性。

4. Postfix的队列文件有其特殊的格式,只能被postfix本身识别;

二、 postfix对邮件的处理过程

2.1 接收邮件的过程

当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理:

1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。

2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。

3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。

4. 由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是用于UUCP协议的投递代理。

三、 postfix的安装过程

3.1源代码包的安装

1. 获取postfix的源代码包

从postfix官方站点www.postfix.org取得postfix的源代码包postfix-19991231-pl08.tar.gz。将其拷贝到/tmp

2.解开源代码包,将生成/tmp/ postfix-19991231-pl08目录。

tar xvzf postfix-19991231-pl08.tar.gz

3.编译源代码包

cd /tmp/ postfix-19991231-pl08

make

4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。我们可以先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示:

postfix:*:12345:12345:postfix:/no/where:/no/shell

5.确定/etc/aliases文件中包含如下的条目:

postfix: root

6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令:

./INSTALL.sh

7. 启动postfix

# postfix start

8.关于maildrop目录权限的说明:

postfix可以使用一个所有用户都可写的(也即目录权限为1773)的maildrop

目录来让本地用户提交邮件。这种方法避免了使用set-uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然可以提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用maildrop目录。但是,由于该目录的权限是733,其他用户可以建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在INSTALL.sh 脚本问你是否需要set-gid 时回答no。

如果你的系统有多个用户的话,最好取消以上的方式而采用利用set-gid 用户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组"maildrop" 并且确定该组中没有用户成员。然后在INSTALL.sh 问你是否需要set-gid 时指定"maildrop"。

提示:在安装postfix之前,请删除已经安装的sendmail。

3.2 rpm包的安装

1. 获取postfix的rpm软件包。

我们可以从http://www.alltrading.es/postfix/RPMS/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2.i386.rpm。

2. 备份你的/etc/aliases和/etc/aliases.db,因为postfix要使用该别名数据库。

3. 用以下命令查看系统是否安装了sendmail:

[root@mail /root]# rpm -qa |grep sendmail

sendmail-doc-8.9.3-15

sendmail-8.9.3-15

sendmail-cf-8.9.3-15

4. 用以下命令强行卸载sendmail:

[root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps

5. 用以下命令杀死运行中的sendmail进程:

[root@mail /root]# killall sendmail

6. 安装postfix:

[root@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm

postfix ##################################################

postfix-script: warning: creating missing Postfix pid directory

postfix-script: warning: creating missing Postfix incoming directory

postfix-script: warning: creating missing Postfix active directory

postfix-script: warning: creating missing Postfix bounce directory

postfix-script: warning: creating missing Postfix defer directory

postfix-script: warning: creating missing Postfix deferred directory

postfix-script: warning: creating missing Postfix saved directory

postfix-script: warning: creating missing Postfix corrupt directory

postfix-script: warning: creating missing Postfix public directory

postfix-script: warning: creating missing Postfix private directory

[root@mail /root]#

7. 启动postfix

[root@mail /root]# /etc/rc.d/init.d/postfix start

3.3 配置系统每次启动时自动启动postfix

1.如果你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix:

if [ -f /usr/libexec/postfix ]; then

/usr/libexec/postfix start

fi

2.如果你安装的是postfix的rpm包,可以通过setup命令来设置在系统启动时启动postfix。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有