postfix的工作原理

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

Postfix内部收信、发信流程图

image

image 

整个处理流程分为三个阶段:接收邮件、将邮件排入队列、递送邮件。每个阶段由一组独立的Postfix组件负责。当一封邮件被收下并排入队列之后,队列管理器(Queue Manager)会启动适当的MDA,将邮件送到终点。

Postfix的队列管理器

邮件本身的处理工作主要是由队列管理器(Queue Manager)负责,每一个能收到邮件的Postfix组件,都有一个共同的目的地--队列管理器。邮件进入队列之前的关卡是Cleanup Daemon,因为只有经过清理的邮件,才有资格进入队列。Cleanup将邮件排入队列后,会通知Queue Manager去处理新邮件。每当Queue Manager察觉收信队列有新信到达时,就会使用Trivial-Rewrite来决定邮件路由信息,这些信息包括传输方法、下一站以及收件人地址。

Queue Manager总共维护四种队列:收件(Incoming)、活动(Active)、延迟(Deferred)、故障(Corrupt)。新邮件通过Cleanup之后的第一站是“收件队列”。假设系统资源空闲。Queue Manager会将邮件移入“活动队列”,然后调用适当的MDA来投递邮件,而投递失败的邮件则会被移入“耽搁队列”。

如果邮件被耽搁太久,或是被判定无法送达,则Queue Manager还要负责协调Bounce与Defer Daemons来产生一份递送状态报告,并传回给系统管理员或送信者(或两者)。在Postfix的队列目录下(默认位置是/var/spool/postfix/),除了上述四种邮件队列目录之外,还有bounce/与defer/目录。这些目录含有状态信息,解释特定邮件为何被耽搁或无法递送,Bounce与Defer Daemon就是利用这些目录下的状态信息来产生通知函。

实验环境

本地yum服务器

Dns服务器

一:查看系统的状态

1:我们需要把原有的sendmail服务停止掉或者删除安装的包

[root@mail ~]# yum remove sendmail

[root@mail ~]# service sendmail stop

2:修改主机的名字为mai.bj.com

[root@mail ~]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=mail.bj.com

3:修改本机的dns指向

[root@mail ~]# vim /etc/resolv.conf

search xyh.com

nameserver 192.168.10.100

4:重启系统,使配置生效

[root@mail ~]# init 6

二:构建dns服务器

1:[root@mail ~]# yum install bind bind-chroot caching-nameserver

[root@mail ~]# cd /var/named/chroot/

[root@mail chroot]# cd etc/

[root@mail etc]# cp -p named.caching-nameserver.conf named.conf

[root@mail etc]# vim named.conf

options {

listen-on port 53 { any; };

allow-query { any; };

allow-query-cache { any; };

};

view localhost_resolver {

match-clients { any; };

match-destinations { any; };

recursion yes;

include "/etc/named.rfc1912.zones";

};

2:[root@mail etc]# vim named.rfc1912.zones

zone "bj.com" IN {

type master;

file "bj.com.db";

allow-update { none; };

}

3:创建dns的数据库的文件

[root@mail etc]# cd ../var/named/

[root@mail named]# cp -p localhost.zone bj.com.db

clip_image002

4:设置named为开机启动,并重新启动该服务

[root@mail named]# chkconfig named on

[root@mail named]# service named start

5:测试

[root@mail named]# dig -t mx bj.com

<&lt;>&gt; DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <&lt;>&gt; -t mx bj.com

global options: printcmd

Got answer:

-&gt;&gt;HEADER<&lt;- opcode: QUERY, status: NOERROR, id: 5543

flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

QUESTION SECTION:

bj.com. IN MX

ANSWER SECTION:

bj.com. 86400 IN MX 10 mail.bj.com.

AUTHORITY SECTION:

bj.com. 86400 IN NS ns.bj.com.

ADDITIONAL SECTION:

mail.bj.com. 86400 IN A 192.168.10.100

ns.bj.com. 86400 IN A 192.168.10.100

三:搭建postfix服务器

1:[root@mail ~]# yum install postfix

2:[root@mail ~]# vim /etc/postfix/main.cf

clip_image004

69 myhostname = mail.bj.com

77 mydomain = bj.com

93 myorigin = $mydomain

107 inet_interfaces = all 打开该行

108 #inet_interfaces = $myhostname

109 #inet_interfaces = $myhostname, localhost

110 #inet_interfaces = localhost 注释掉本行

155 mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain

3:

发送邮件:

telnet 192.168.2.100 25

EHLO mail.bj.com

mail from:user1@bj.com

rcpt to:user2@bj.com

data

subject:ok

11111111111111111111111111

4:由于默认情况下允许进行中继到外边,我们现在只允许本机进行中继

[root@mail ~]# vim /etc/postfix/main.cf

255 mynetworks = 127.0.0.1

5:设置postfix自动启动

[root@mail ~]# chkconfig postfix on

[root@mail ~]# service postfix restart

四:安装邮件的接收服务器

1:[root@mail ~]# yum install dovecot

2:[root@mail ~]# chkconfig dovecot on

[root@mail ~]# service dovecot start

五:安装sasl实现对用户的身份的验证

1:[root@mail ~]# yum install cyrus*

2:修改配置文件

[root@mail ~]# vim /etc/sysconfig/saslauthd

MECH=pam

MECH=shadow 增加本地账号库的验证

3:创建用户并对用户进行验证的测试

[root@mail ~]# echo -n "user1@bj.com" |openssl base64

dXNlcjFAYmouY29t

[root@mail ~]# echo -n "123" |openssl base64

MTIz

4:

[root@mail ~]# testsaslauthd -u user1 -p 123

0: OK "Success."

5:非本地账户

[root@mail ~]# telnet 192.168.10.100 25

mail from:123@sina.com

250 2.1.0 Ok

rcpt to:1234@126.com

554 5.7.1 &lt;1234@126.com>: Relay access denied

本地账户

[root@mail ~]# telnet 192.168.10.100 25

250-AUTH CRAM-MD5 PLAIN NTLM GSSAPI DIGEST-MD5 LOGIN

250-AUTH=CRAM-MD5 PLAIN NTLM GSSAPI DIGEST-MD5 LOGIN

auth login dXNlcjFAYmouY29t

334 UGFzc3dvcmQ6

MTIz

235 2.0.0 Authentication successful

mail from:user1@bj.com

250 2.1.0 Ok

rcpt to:user2@bj.com

250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

hello

123

.

250 2.0.0 Ok: queued as 4026D36BBB8

quit

221 2.0.0 Bye

6:查看日志文件

[root@mail ~]# tail -f /var/log/maillog

Mar 7 20:23:38 mail postfix/qmgr[3739]: 4026D36BBB8: from=<user1@bj.com>, size=331, nrcpt=1 (queue active)

Mar 7 20:23:38 mail postfix/local[3765]: 4026D36BBB8: to=<user2@bj.com>, relay=local, delay=31, delays=31/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)

六:搭建squirrel的包,实现对postfix的web的访问和管理

1:[root@mail ~]# yum install squirrelmail –y

2:配置main menu主菜单

[root@mail ~]# /usr/share/squirrelmail/config/conf.pl

Server Settings

1. Domain : bj.com

2. Invert Time : false

3. Sendmail or SMTP : SMTP

clip_image006

clip_image008

clip_image010

七:设置虚拟的目录

1:[root@mail ~]# vim /etc/httpd/conf/httpd.conf

Alias /webmail "/usr/share/squirrelmail"

2:重新启动httpd服务

[root@mail ~]# service httpd restart

八:用ie浏览器进行测试

clip_image012

使用用户user1给user2发送一份邮件

clip_image014

clip_image016

用user2登录查看邮件是否已经收到

clip_image018

clip_image020