Postfix 是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现,是一个开放源代码的软件。

sendmail由于出现的比较早,但是各方面的问题也比较突出,postfix就是为了替代sendmail的缺点而出现的,postfix 邮件服务器的优点很明显:

1. 开源的,要知道开源的即是免费的

2. 速度更快,比sendmail×××倍

3. 兼容性好,与sendmail兼容,两者互相迁移很方便。

4. 更能干,在重负荷之下仍然能正常工作,当超负荷之后,他会自动调整

5. 更灵活,不同于sendmail一体化的设计,postfix使用模块化的设计,各个模块专注于自己的工作。

6. 安全性,具有多层的防御结构。


postfix的模块有哪些呢?

1. smtpd 用于响应用户的请求

2. cleanup 用于检测语法

3. pickup 用于分检邮件

4. smtp 类似于客户端,传输邮件

5. qmgr 队列管理器 用于不同邮件状态的管理。

postfix由这些还有其他的一些模块来进行服务,各个模块自己完成自己的任务,他们由一个master进程统一调度


postfix的四种邮件队列?

1. maildrop 本地邮件存放处

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

3. active 放置已经打开了正准备投递的邮件,当然它是由长度限制的。

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

队列管理进程仅仅在内存中保留active队列,并且限制其长度。


postfix 对邮件风暴的处理

当有新的邮件到达的时候,postfix进行初始化,此时postfix同时只接受两个并发连接请求,当邮件投递成功后,可以同时接收的并发连接就会缓慢地增长,一直到可配置的值

当系统资源消耗已经达到不能承受的负载,就会停止并发连接数量的增长,或者postfix在处理邮件过程中遇到问题,数量也会减少。

当接收到的新邮件的数量,超过它的投递能力时,postfix会停止投递deferred队列中的邮件,去处理新接收到的邮件,因为处理新邮件的延迟小于处理defferred队列中的邮件。


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

当第一次发送失败,postfix会给该邮件,贴上一个将来的时间有票,在达到这个时间之前,不会再处理该类邮件,到到达这个时间时,进行投递,再次失败,将再次贴上一个双倍与第一次的邮件将来时间的邮票,以此类推,进行多次尝试之后,放弃该邮件,回复用户错误信息


postfix对于目标不可达的目的邮件的处理

postfix内存之中保存了一个有长度限制的不可达的地址列表,避免想这些地方进行邮件投递


postfix的安全性

1. 动态分配内存,放置系统缓冲区溢出

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

3. postfix的各个进程互相不进行控制,只接受master主进程的控制

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


postfix邮件服务对于邮件的处理过程:

接收的过程: 当接受新邮件时,新的邮件首选在incoming队列停留,并进行处理

1. 对于来自与本地的邮件:local进程负责接收,并放置邮件于maildrop队列中,然后pickup进程对其进行完整性检测,maildrop目录的权限必须进行设置 避免用户删除其他用户的邮件

2. 对于网络的邮件:smtpd 进程负责接收邮件,并且进行安全性检测

3. postfix进程会自己产生邮件,用于将邮件的不可投递信息返回给发件人,这些工作由bounce后台程序产生

4. postfix 产生邮件,提示postfix管理员 postfix运行过程中出现问题

5. cleanup进程,对邮件进行处理,添加信头中丢失的Form信息。也就是将地址重写为标准的user@’域名‘ 的格式,从信头中抽取收件人的地址,投入到incoming队列中,请求处理该信件,请求地址重写进程将收件人地址转换为标准的user@‘域名’的格式


邮件的投递过程

上面的部分结束之后,邮件已经到达incoming的队列了,接下来进行邮件的投递。

1. 邮件到达邮件队列管理进程,他将办含有队列文件路径信息,发件人地址,收件人地址的投递请求发送给投递代理。

2. 与此同时,邮件队列管理进程维护者deferred,active队列,不同状态的邮件放置于的队列

3. 针对于发送成功与失败,队列管理进程与rewrite,与bounce后台程序练习,成功的给rewrite进行地址解析,失败的给bounce返回信息给用户

4. 检查成功的邮件送给投递代理进程,local和smtpd





实验:linux中实现postfix邮件服务器

实验环境:linux 虚拟机5.4

1.安装postfix。

[root@mailServer]# rpm -ivh postfix-2.3.3-2.1.el5_2.i386.rpm

[root@mailServer]# rpm -ivh system-switch-mail-0.5.25-12.noarch.rpm

//用于转换邮件服务器的工具,系统默认sendmail作为邮件服务器,转换为postfix

2.选择postfixmail

邮件服务器-postfix服务器_邮件服务器

3. 配置文件

模块管理文件 /etc/postfix/master.cf

主配置文档 /etc/postfix/main.cf


Postconf -d 查看默认的参数值

Postconf -n 查看新的参数值

Postconf -e 编辑

编辑main.cf文件

69myhostname = mail.163.com //本地域名

77mydomain = 163.com //自己的域名

93myorigin = $mydomain

//实现地址伪装,将邮件的真实来源改正为myorigin所指的域名中。

110inet_interfaces = localhost //只接受自己的用户

107inet_interfaces = all //监听所有

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

//哪些是本地信件,允许本地作用域发送邮件。

邮件服务器-postfix服务器_邮件服务器_02

观察日志信息,如果咩有打开main.cf 156行的注释

邮件服务器-postfix服务器_postfix_03

邮件状态进入到了 deferred,发送失败

邮件服务器-postfix服务器_linux_04

配置本地用户可以发送邮件。则发送成功!


Postfix mail的中继!!

255mynetworks = 168.100.189.0/28, 127.0.0.0/8

在所标记网段中 的 计算机发来的邮件允许中继。



Postfix mail的中安全认证!

broken_sasl_auth_clients= yes

smtpd_sasl_auth_enable= yes

smtpd_sasl_security_options= noanonymous //不允许匿名账号发送

#smtpd_sasl_application_name= smtpd //smtpd

#smtpd_client_restrictions= permit_sasl_authenticated,reject//经过验证可以连接,没经过

验证拒绝

#smtpd_client_restrictions= permit_sasl_authenticated //限制用户连接验证不验证都连

smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination


将他们写入postfix的主配置文件中



邮件服务器-postfix服务器_邮件服务器_05

邮件服务器-postfix服务器_linux_06

[root@mail~]# service saslauthd restart

[root@mail~]# vim /usr/lib/sasl2/smtpd.conf


当然此时如果使用不存在的账号,来测试是否能通讯的话,还是能够发送邮件,那是因为身份验证不是强制性的。

673smtpd_client_restrictions = permit_sasl_authenticated,reject //更改配置文件

邮件服务器-postfix服务器_linux_07

还是需要 auth login 进行验证账号密码 均为base64 编码



拓展:

SquirrelMail是一套基于标准的,采用PHP4开发Webmail邮件系统。它内置纯PHP支持的IMAP和SMTP协议,所有页面都遵循HTML4.0标准(没有使用JavaScript支持),以便最大限度兼容更多浏览器上。它对系统要求非常低,并且安装和配置非常容易。SquirrelMail具备一个客户端邮件程序所应拥有的一切功能,包括支持增强型的MIME、地址薄、文件夹操作等等功能。Outlook皮肤主题。

[root@mail~]# yum install squirrelmail

[root@mail~]# cd /var/www/html/

[root@mailhtml]# ln -s /usr/share/squirrelmail mail

[root@mailsqurrmail]# cd /var/www/html/squrrmail

[root@mailsqurrmail]# ./conf.pl

邮件服务器-postfix服务器_邮件服务器_08

与性能有关的配置

邮件服务器-postfix服务器_邮件服务器_09

服务器设置

邮件服务器-postfix服务器_linux_10

全局配置

邮件服务器-postfix服务器_邮件服务器_11

语言选项

邮件服务器-postfix服务器_postfix_12

登陆测试

邮件服务器-postfix服务器_linux_13

邮件服务器-postfix服务器_linux_14

当登陆之后,提示错误,错误信息是没有imap服务器,也就是没有邮件接收服务器,而linux中的邮件接收服务器是dovecot,所以安装dovecot,并启动dovecot 服务之后

邮件服务器-postfix服务器_邮件服务器_15

邮件服务器-postfix服务器_linux_16

673#smtpd_client_restrictions = permit_sasl_authenticated,reject

编辑配置文件,注释行


邮件可以发送出去了