一,postfix概述:

     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年代晚期出现,是一个开放源代码的软件。

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

处理过程 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规则的记录等等。)

     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的结构

postfix由十几个具有不同功能的半驻留进程组成,并且在这些进程中并无特定的进程间父子关系。某一个特定的进程可以为其他进程提供特定的服务。

大多数的postfix进程由一个进程统一进行管理,该进程负责在需要的时候调用其他进程,这个管理进程就是master进程。该进程也是一个后台程序。

这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等。通过灵活的配置特性可以使整个系统的运行成本大大降低。

3.1 postfix的邮件队列(mail queues)

postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理:

1. maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。

2. incoming:放置正在到达或队列管理进程尚未发现的邮件。

3. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有长度的限制。

4. deferred:放置不能被投递的邮件。

队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限制,这样做的目的是为了避免进程运行内存超过系统的可用内存。

3.2 postfix对邮件风暴的处理

当有新的邮件到达时,postfix进行初始化,初始化时postfix同时只接受两个并发的连接请求。当邮件投递成功后,可以同时接受的并发连接的数目就会缓慢地增长至一个可以配置的值。当然,如果这时系统的消耗已到达系统不能承受的负载就会停止增长。还有一种情况时,如果postfix在处理邮件过程中遇到了问题,则该值会开始降低。

当接收到的新邮件的数量超过postfix的投递能力时,postfix会暂时停止投递deferred队列中的邮件而去处理新接收到的邮件。这是因为处理新邮件的延迟要小于处理deferred队列中的邮件。Postfix会在空闲时处理deferred中的邮件。

3.3 postfix对无法投递的邮件的处理

当一封邮件第一次不能成功投递时,postfix会给该邮件贴上一个将来的时间邮票。邮件队列管理程序会忽略贴有将来时间邮票的邮件。时间邮票到期时,postfix会尝试再对该邮件进行一次投递,如果这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时[间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推。当然,经过一定次数的尝试之后,postfix会放弃]对该邮件的投递,返回一个错误信息给该邮件的发件人。

    3.4 postfix对不可到达的目的地邮件的处理

postfix会在内存中保存一个有长度限制的当前不可到达的地址列表。这样就避免了对那些目的地为当前不可到达地址的邮件的投递尝试。从而大大提高了系统的性能。

3.5 postfix的安全性

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

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

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

3. Postfix的各种进程不[在其他用户进程的控制之下运行,而是运行在驻留主进程master的控制之下,与其他用户进程无父子关系,所有有]很好的绝缘性。

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

四,案例

     拓扑

2012-09-12_093620

[root@mail Server]# yum install yum install httpd  php  php-mysql  mysql  mysql-server  mysql-devel  openssl-devel  dovecot  perl-DBD-MySQL  tcl  tcl-devel  libart_lgpl  libart_lgpl-devel libtool-ltdl  libtool-ltdl-devel  expect 装载所必需的环境(关于DNS配置详见本人博客其他内容)
[root@mail Server]# service mysqld start 开启服务
[root@mail Server]# chkconfig mysqld on 设置为开机启动(为mysql设置密码此处略)
[root@mail Server]# service sendmail stop 关闭sendmail
[root@mail Server]# chkconfig sendmail off
[root@mail Server]# service saslauthd start 启验证服务
[root@mail Server]# chkconfig saslauthd on
拷文件
[root@mail ~]# tar -zxvf postfix-2.8.2.tar.gz -C /usr/local/src/ 利用源代码实现支持数据库连接
[root@mail ~]# cd /usr/local/src/
[root@mail src]# cd postfix-2.8.2/
[root@mail postfix-2.8.2]# groupadd -g 2525 postfix 系统账号组
[root@mail postfix-2.8.2]# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix创建账号
[root@mail postfix-2.8.2]# groupadd -g 2526 postdrop
[root@mail postfix-2.8.2]# useradd -g postdrop -u 2526 -s /bin/false -M postdrop
[root@mail postfix-2.8.2]# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2   -lssl -lcrypto'(无makefile文件 选择生成 无config文件 用make生成)
[root@mail postfix-2.8.2]# make
[root@mail postfix-2.8.2]# make install

按照以下的提示输入相关的路径([]号中的是缺省值,”]”后的是输入值,省略的表示采用默认值)

install_root: [/] /
tempdir: [/usr/local/src/ postfix-2.6.5] /tmp
config_directory: [/etc/postfix] /etc/postfix
daemon_directory: [/usr/libexec/postfix]
command_directory: [/usr/sbin]
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail]
newaliases_path: [/usr/bin/newaliases]
mailq_path: [/usr/bin/mailq]
mail_owner: [postfix]
setgid_group: [postdrop]  
       html_directory: [no] /var/www/postfix_html
       manpages: [/usr/local/man]
       readme_directory: [no]

生成别名二进制文件,这个步骤如果忽略,会造成postfix效率极低

[root@mail postfix-2.8.2]# newaliases
设置开机启动 (利用service启动)

[root@mail abc]# cp  /mnt/cdrom/Server/postfix-2.3.3-2.1.el5_2.i386.rpm /tmp/abc/
[root@mail abc]# rpm2cpio postfix-2.3.3-2.1.el5_2.i386.rpm |cpio –id 借用原rpm包控制脚本
[root@mail abc]# cd etc/
[root@mail rc.d]# cd init.d/
[root@mail init.d]# cp postfix /etc/init.d/
[root@mail init.d]# vim /etc/init.d/postfix
[root@mail init.d]# service postfix start
[root@mail init.d]# chkconfig --add postfix
[root@mail init.d]# vim /etc/postfix/main.cf
 2012-09-11_174549

2012-09-11_174556

2012-09-11_174624

2012-09-11_174710

2012-09-11_174902

2012-09-11_175402

为postfix开启基于cyrus-sasl的认证功能

2012-09-11_175451

 

[root@mail init.d]# cd /usr/lib/sasl2/
[root@mail sasl2]# cp -p Sendmail.conf smtpd.conf
[root@mail sasl2]# vim smtpd.conf
2012-09-11_180020

[root@mail sasl2]# telnet mail.163.com 25

2012-09-11_180427

[root@mail ~]# tar -jxvf courier-authlib-0.63.1.20111230.tar.bz2  -C /usr/local/src/ 与mysql结合 验证
[root@mail ~]# cd /usr/local/src/
[root@mail src]# cd courier-authlib-0.63.1.20111230/
[root@mail courier-authlib-0.63.1.20111230]# ./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --with-authmysql --with-mysql-libs=/usr/lib/mysql --with-mysql-includes=/usr/include/mysql --with-redhat --with-authmysqlrc=/etc/authmysqlrc --with-authdaemonrc=/etc/authdaemonrc --with-ltdl-lib=/usr/lib --with-ltdl-include=/usr/include
[root@mail courier-authlib-0.63.1.20111230]# make
[root@mail courier-authlib-0.63.1.20111230]# make install
[root@mail courier-authlib-0.63.1.20111230]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
[root@mail courier-authlib-0.63.1.20111230]# cp /etc/authdaemonrc.dist  /etc/authdaemonrc 调用认证模块
[root@mail courier-authlib-0.63.1.20111230]# cp /etc/authmysqlrc.dist  /etc/authmysqlrc   调用数据库
[root@mail courier-authlib-0.63.1.20111230]# vim /etc/authdaemonrc

2012-09-11_182824

2012-09-11_182932

2012-09-11_183007

[root@mail courier-authlib-0.63.1.20111230]# vim /etc/authmysqlrc

2012-09-11_184047

2012-09-11_184100

2012-09-11_184137

2012-09-11_184246

2012-09-11_184430

2012-09-11_184557

2012-09-11_184742

2012-09-11_184938 

利用service启动

[root@mail courier-authlib]# cd /usr/local/src/courier-authlib-0.63.1.20111230/
[root@mail courier-authlib-0.63.1.20111230]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# chmod 755 /etc/init.d/courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# service courier-authlib start
[root@mail courier-authlib-0.63.1.20111230]# chkconfig --add courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# chkconfig courier-authlib on

[root@mail courier-authlib-0.63.1.20111230]# echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf生成库文件被其他软件包调用
[root@mail courier-authlib-0.63.1.20111230]# ldconfig -v调用
建立虚拟账号目录
[root@mail courier-authlib-0.63.1.20111230]# mkdir -pv /var/mailbox
[root@mail courier-authlib-0.63.1.20111230]# chown -R postfix /var/mailbox

[root@mail courier-authlib-0.63.1.20111230]# vim /usr/lib/sasl2/smtpd.conf 更改验证方式 用authlib验证
2012-09-11_190830

[root@mail courier-authlib-0.63.1.20111230]# service saslauthd restart
[root@mail courier-authlib-0.63.1.20111230]# service courier-authlib restart

让postfix支持虚拟域和虚拟用户
[root@mail courier-authlib-0.63.1.20111230]# vim /etc/postfix/main.cf

2012-09-11_191330

2012-09-11_191343

使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库:

[root@mail ~]# tar -zxvf extman-1.1.tar.gz
[root@mail ~]# cd extman-1.1
[root@mail extman-1.1]# cd docs/
[root@mail docs]# mysql -u root -p <extmail.sql
[root@mail docs]# mysql -u root -p &lt;init.sql
[root@mail docs]# mysql -u root -p 进行验证
mysql> show databases;

2012-09-11_192111
mysql&gt; use extmail;
mysql&gt; show tables;

2012-09-11_192329
[root@mail docs]# cp mysql_virtual_* /etc/postfix/
[root@mail docs]# mysql -u root -p
Enter password: 授予用户extmail访问extmail数据库的权限
mysql&gt; GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';

mysql&gt; GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
mysql&gt; FLUSH PRIVILEGES;
已经支持虚拟账号
[root@mail docs]# service postfix restart
[root@mail docs]# vim /etc/dovecot.conf
2012-09-11_193337 

2012-09-11_193603

2012-09-11_193634

2012-09-11_193744

2012-09-11_193822

2012-09-11_193836

2012-09-11_193918

2012-09-11_194003
2012-09-11_194119

2012-09-11_194230

 

[root@mail docs]# vim /etc/dovecot-mysql.conf  调用数据库
2012-09-11_194622
[root@mail docs]# vim /etc/postfix/main.cf
2012-09-11_194907
[root@mail docs]# service postfix restart
[root@mail docs]# service dovecot restart
[root@mail docs]# chkconfig dovecot on
[root@mail docs]# mkdir -pv /var/www/extsuite  运行固定目录
[root@mail ~]# tar -zxvf extmail-1.2.tar.gz  web方式访问邮箱
[root@mail ~]# mv extmail-1.2 /var/www/extsuite/extmail
[root@mail ~]# mv extman-1.1 /var/www/extsuite/extman
[root@mail ~]# cd /var/www/extsuite/ 
2012-09-11_195708
[root@mail extsuite]# cd extmail/
[root@mail extmail]# cp webmail.cf.default webmail.cf 拷贝样例文件
[root@mail extmail]# vim webmail.cf 
2012-09-11_200058

2012-09-11_200319

2012-09-11_200356

2012-09-11_200515

 2012-09-11_200826


[root@mail extmail]# service httpd start

[root@mail extmail]# chkconfig httpd on
[root@mail extmail]# vim /etc/httpd/conf/httpd.conf

2012-09-11_201558

2012-09-11_201652
[root@mail extmail]# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/

测试

2012-09-11_203134
注册 装载extman
[root@mail extmail]# cd /var/www/extsuite/
[root@mail extsuite]# cd extman
[root@mail extman]# cp webman.cf.default webman.cf
[root@mail extman]# vim webman.cf

2012-09-11_203834

2012-09-11_203842
[root@mail extsuite]# cd extmail/
[root@mail extmail]# vim webmail.cf

2012-09-11_204152
[root@mail extmail]# cd ../extman/
[root@mail extman]# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
[root@mail extman]# vim /etc/httpd/conf/httpd.conf
2012-09-11_204630

[root@mail extman]# mkdir  -pv  /tmp/extman
[root@mail extman]# chown postfix.postfix  /tmp/extman

[root@mail ~]# tar -zxvf Unix-Syslog-1.1.tar.gz
[root@mail ~]# cd Unix-Syslog-1.1
[root@mail Unix-Syslog-1.1]# perl Makefile.PL
[root@mail Unix-Syslog-1.1]# make
[root@mail Unix-Syslog-1.1]# make install
[root@mail Unix-Syslog-1.1]# vim /etc/postfix/main.cf
2012-09-11_210409
[root@mail Unix-Syslog-1.1]# service postfix restart
测试图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2012-09-11_205408

2012-09-11_205543

2012-09-11_205654

2012-09-11_205800

2012-09-11_205824

2012-09-11_205844

2012-09-11_205858

2012-09-11_210103

 

 

 

 

 

 

 

2012-09-11_210108

2012-09-11_210526

2012-09-11_210609

 

 

 

2012-09-11_210614

2012-09-11_210624

2012-09-11_210630

2012-09-11_210842

 

 

 

2012-09-11_210923

2012-09-11_211010

 

2012-09-11_211034

2012-09-11_211051