postfix简介
 
1、postfix是使用最广泛的sendmail的成功的一个替代品,在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真是一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。
2、postfix的特点
(1)postfix是免费的
(2)性能好,更快,性能比sendmail快三倍
(3)兼容性好  postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix
(4)更健壮  重负荷可正常工作,当超出可用内存时,postfix会自动减少进程数目
(5)更灵活 postfix由许多小程序组成,每程序完成特定功能
(6)postfix具有多层防御结构,可以有效地抵御恶意***者
这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等。通过灵活的配置特性可以使整个系统的运行成本大大降低。
  1.2.1 postfix的邮件队列(mail queues)
  postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理:
  1. maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。
  2. incoming:放置正在到达或队列管理进程尚未发现的邮件。
  3. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有长度的限制。
  4. deferred:放置不能被投递的邮件。
  队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限制,这样做的目的是为了避免进程运行内存超过系统的可用内存。
 
  1.2.3 postfix对无法投递的邮件的处理
  当一封邮件第一次不能成功投递时,postfix会给该邮件贴上一个将来的时间邮票。邮件队列管理程序会忽略贴有将来时间邮票的邮件。时间邮票到期时,postfix会尝试再对该邮件进行一次投递,如果这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时[间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推。当然,经过一定次数的尝试之后,postfix会放弃]对该邮件的投递,返回一个错误信息给该邮件的发件人。
  1.2.4 postfix对不可到达的目的地邮件的处理
  postfix会在内存中保存一个有长度限制的当前不可到达的地址列表。这样就避免了对那些目的地为当前不可到达地址的邮件的投递尝试。从而大大提高了系统的性能。
 
 
postfix对邮件的处理过程?
 
  2.1 接收邮件的过程
  当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理:
  1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在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 投递邮件的过程
 
      邮件队列管理进程是整个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调用外部命令处理邮件的机制.
 
 
      邮件用户代理MUA(Mail User Agent)是用于发送或许接收电子邮件的客户端顺序。MUA 也可以是一个顺序或许脚原模拟了一个典型MUA 正在发送或许接收Email 时的行为。MUA 正在发送电子邮件时运用SMTP/ESMTP 协议来与一个MTA 对话,正在接收邮件时,运用POP3 协议或许IMAP4 协议。常用的MUA 客户端软件有Outlook、Outlook Express、Foxmail、ThunderBird、The Bat!等。
       邮件传送代理MTA(Mail Transport Agent)的作用是正在不同的主机之间传送电子邮件,它运用SMTP 协议,罕见的MTA 效劳软件有sendmail、qmail、Postfix、exim。MTA 接收来自MUA(Mail User Agent 邮件用户代理)或许是其他MTA、MDA(MailDelivery Agent 邮件投递代理)的邮件,它解析邮件头来绝议邮件的接收者。一般,MTA 需求重写邮件头,然先查找DNS 一定收件人信箱所正在的远程主机,并经过网络发送给其他MTA 或许MDA。
       邮件获取代理MRA(Mail Retrieval Agent)提求了使MUA 可以远程获取电子邮件的效劳,如qpoper、cyrus-imap、courier-imap、dovecot 等,为了使得邮件存取格式兼容,正在MRA 顺序中经常都提求了邮件投递代理顺序MDA。MRA 运用的协议有POP3 和IMAP4 等。POP3 可以运用户从效劳器下载邮件并离线阅读。IMAP4 运用于那些没有外地信箱的用户,具有远程操作信箱的才干。IMAP4 容许多个客户机器同时访问一个信箱。原文想象的系统中,Webmail 正在先台便是经过IMAP4 协议来访问用户信箱的。
 
 
 
一、安装前的准备工作:
 
1、安装以下开发所用到的rpm包组:
Development Libraries
Development Tools
Legacy Software Development
X Software Development
 
方法:
# yum groupinstall "packge_group_name"
 
2、安装所需的rpm包,包括以下这些:
httpd, tcl, tcl-devel, libart_lgpl, libart_lgpl-devel, libtool-ltdl, libtool-ltdl-devel, expect
 
3、关闭sendmail,并将它的随系统自动启动功能关闭:
# service sendmail stop
# chkconfig sendmail off
 
4、启动saslauthd服务,并将其加入到自动启动队列:
# service saslauthd start
# chkconfig saslauthd on
 
 
5、安装bind软件,这样方便以后域名解析
可在网络上下载,这里以本地yum源安装为例
yum install bind
yum install caching-nameserver 提供了一些数据文件
rpm -q bind-chroot 确保它没装,否则需改路径
dns服务器比较了解了,这里不过多介绍
提供三个文件,如/etc/named.conf /var/named/wl.com.zone /var/named/172.16.zone
(1)/etc/named.conf内容如下
options {
directory "/var/named";
 forwarders { 172.16.0.1; };
};
 
 
zone "." IN {
type hint;
file "named.ca";
};
 
zone "localhost" IN {
type master;
file "localhost.zone";
};
 
 
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "wl.com" IN {
type master;
file "wl.com.zone";
forwarders {};
};
zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.zone";
forwarders {};
};
 
(2)/var/named/wl.com.zone内容如下
$TTL 600
$ORIGIN wl.com.
@          IN      SOA      ns.wl.com.   admin.wl.com. (
   2012032901
   2H  
   20M 
   7D  
   1D) 
      IN       NS        ns  
      IN       MX  10    mail
ns    IN       A        172.16.23.7
mail  IN      A        172.16.23.7
www   IN      CNAME  mail
pop3  IN      CNAME   mail
imap  IN      CNAME   mail
}
 
(3)/var/named/172.16.zone内容如下
 
$TTL 600
@          IN      SOA      ns.wl.com.   admin.wl.com. (
   2012032901
   2H  
   20M 
   7D  
   1D) 
      IN       NS        ns.wl.com.
7.23  IN       PTR       mail.wl.com.
7.23  IN       PTR       ns.wl.com.
}
 
(4)改属组
 chown  -R :named  /etc/named.conf  /var/named/wl.com.zone /var/named/172.16.zone
(5)启动测试
  service named configtest
  service named start
 
 
 
 
二、安装mysql-5.5.20
 
1、准备数据存放的文件系统
 
新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。
 
这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。
 
2、新建用户以安全方式运行进程:
 
# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data
 
3、安装并初始化mysql-5.5.20
 
首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.19-linux2.6-i686.tar.gz,其下载位置为ftp://172.16.0.1/pub/Sources/mysql-5.5。
 
# tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv mysql-5.5.20-linux2.6-i686  mysql
# cd mysql 
 
# chown -R mysql:mysql  .
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# chown -R root  .
 
4、为mysql提供主配置文件:
 
# cd /usr/local/mysql
# cp support-files/my-large.cnf  /etc/my.cnf
 
并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:
thread_concurrency = 2
 
另外还需要添加如下行指定mysql数据文件的存放位置:
datadir = /mydata/data
 
 
5、为mysql提供sysv服务脚本:
 
# cd /usr/local/mysql
# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
 
添加至服务列表:
# chkconfig --add mysqld
# chkconfig mysqld on
 
而后就可以启动服务测试使用了。
 
 
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
 
6、输出mysql的man手册至man命令的查找路径:
 
编辑/etc/man.config,添加如下行即可:
MANPATH  /usr/local/mysql/man
 
7、输出mysql的头文件至系统头文件路径/usr/include:
 
这可以通过简单的创建链接实现:
# ln -sv /usr/local/mysql/include  /usr/include/mysql
 
8、输出mysql的库文件给系统库查找路径:
 
# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
 
而后让系统重新载入系统库:
# ldconfig
 
9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。具体实现过程这里不再给出。
 
 
三、安装配置postfix
注:添加postfix用户的id号与组id号一般要大于1000,要记着以方便后面调用
# groupadd -g 2525 postfix
# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
# groupadd -g 2526 postdrop
# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
注:id postfix 确定下
    可到网上载最新的编译安装,这里以postfix-2.9.1.tar.gz为例:
# tar zxvf postfix-2.9.1.tar.gz   Source/postfix
# cd postfix-2.9.1 编译器参数     
注:yum list all | grep sasl sasl sasl-devel lib 确保这几个包已经安装上
 
# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto'
注:这里是给编译时指定参数变量,要与mysql结合来指定mysql的一些头文件和库文件,如果mysql是yum安装,路径要改为相应目录,确定下:
ls /usr/include | grep sasl        
yum list all | grep openssl devel装过
-DUSE_SASL_AUTH                       指定启用sasl谁功能
-DUSE_CYRUS_SASL -I/usr/include/sasl  指定sasl头文件安装位置
AUXLIBS                               指定一些库文件位置,以便postfix安装时可找到
-lz -lm                               启用压缩功能,和mcrpty功能
 
# make
# make install
 
 
按照以下的提示输入相关的路径([]号中的是缺省值,”]”后的是输入值,省略的表示采用默认值)
 
  install_root: [/] /
  tempdir: [/usr/local/src/ postfix-2.9.1] /tmp/postfix
  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]            
    manpages: [/usr/local/man]
    readme_directory: [no]
 
   html_directory: [no]  /var/www/html/postfix 如果想使用帮助文档,httpd服务启用时可用
    
生成别名二进制文件:
#  newaliases
 
2.进行一些基本配置,测试启动postfix并进行发信 
# vim /etc/postfix/main.cf
修改以下几项为您需要的配置
myhostname = mail.magedu.com
myorigin = magedu.com
mydomain = magedu.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8
 
说明:
myorigin参数用来指明发件人所在的域名,即做发件人地址伪装;
mydestination参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件;定义本地负责解析的域,是否中继
myhostname 参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名;
mydomain参数指定您的域名,默认情况下,postfix将myhostname的第一部分删除而作为mydomain的值;
mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;
inet_interfaces 参数指定postfix系统监听的网络接口;本机有多个ip时,想使用确定的ip监听时可用
 
注意:
1、在postfix的配置文件中,参数行和注释行是不能处在同一行中的;
2、任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;
3、每修改参数及其值后执行 postfix reload 即可令其生效;但若修改了inet_interfaces,则需重新启动postfix;
4、如果一个参数的值有多个,可以将它们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix会把第一个字符为空格或tab的文本行视为上一行的延续;
 
启动postfix
/usr/local/postfix/sbin/postfix  start
 
连接postfix,验正服务启动状况:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:root@magedu.com
250 2.1.0 Ok
rcpt to:redhat@magedu.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:Mail test!
Mail test!!!
.
250 2.0.0 Ok: queued as AB94A1A561
quit
221 2.0.0 Bye
Connection closed by foreign host.
 
切换到redhat用户进行收信:
# su - redhat
$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/redhat": 1 message 1 new
>N  1 root@magedu.com        Wed Sep  5 10:59  15/488   "Mail test!"
&
 
四、为postfix提供SysV服务脚本/etc/rc.d/init.d/postfix,内容如下(#END 之前):
#!/bin/bash
#
# postfix      Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
 
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
 
RETVAL=0
prog="postfix"
 
start() {
# Start daemons.
echo -n $"Starting postfix: "
        /usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
        echo
return $RETVAL
}
 
stop() {
  # Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
 
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
 
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
 
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
 
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
 
restart() {
stop
start
}
 
# See how we were called.
case "$1" in
  start)
start
;;
  stop)
stop
;;
  restart)
stop
start
;;
  reload)
reload
;;
  abort)
abort
;;
  flush)
flush
;;
  check)
check
;;
  status)
  status master
;;
  condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
  *)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
 
exit $?
 
# END
 
为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/postfix
 
将postfix服务添加至服务列表:
# chkconfig --add postfix
 
设置其开机自动启动:
# chkconfig postfix on
 
使用此脚本重新启动服务,以测试其能否正常执行:
# service postfix restart
 
 
五、为postfix服务开启用户别名支持:
 
1、在配置文件开启基于hash的别名文件支持
 
在main.cf中,找到如下指令,而后启用它(即移除前面的#号):
#alias_maps = hash:/etc/aliases
 
2、在/etc/aliases文件中定义新的别名项,其格式通常为以冒号隔开的两个字段,前一个字段为初始目标邮件地址,后一个字段为实际发往的地址,如:
redhat: magedu
gentoo@126.com:  admin@magedu.com
ll:            wl, centos     //表示可群发,如发给ll用户时,表示同时发给wl和centos这两个用户
 
3、将/etc/aliases转换为hash格式:
# postalias  /etc/aliases
#newalias     
这两种方式等同
ls /etc | grep aliases 来确定生成了aliases.db这个库文件,用这种方式提高查询效率
 
4、让postfix重新载入配置文件,即可进行测试;
service postfix reload
 
六、实现postfix基于客户端的访问控制
 
1、基于客户端的访问控制概览
 
postfix内置了多种反垃圾邮件的机制,其中就包括“客户端”发送邮件限制。客户端判别机制可以设定一系列客户信息的判别条件:
smtpd_client_restrictions
smtpd_data_restrictions
smtpd_helo_restrictions
smtpd_recipient_restrictions
smtpd_sender_restrictions
 
上面的每一项参数分别用于检查SMTP会话过程中的特定阶段,即客户端提供相应信息的阶段,如当客户端发起连接请求时,postfix就可以根据配置文件中定义的smtpd_client_restrictions参数来判别此客户端IP的访问权限。相应地,smtpd_helo_restrictions则用于根据用户的helo信息判别客户端的访问能力等等。
 
如果DATA命令之前的所有内容都被接受,客户端接着就可以开始传送邮件内容了。邮件内容通常由两部分组成,前半部分是标题(header),其可以由header_check过滤,后半部分是邮件正文(body),其可以由check_body过滤。这两项实现的是邮件“内容检查”。
 
postfix的默认配置如下:
smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =
 
这限制了只有mynetworks参数中定义的本地网络中的客户端才能通过postfix转发邮件,其它客户端则不被允许,从而关闭了开放式中继(open relay)的功能。
 
Postfix有多个内置的限制条件,如上面的permit_mynetworks和reject_unauth_destination,但管理员也可以使用访问表(access map)来自定义限制条件。自定义访问表的条件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access进行,它们后面通常跟上type:mapname格式的访问表类型和名称。其中,check_sender_access和check_recipient_access用来检查客户端提供的邮件地址,因此,其访问表中可以使用完整的邮件地址,如admin@magedu.com;也可以只使用域名,如magedu.com;还可以只有用户名的部分,如marion@。
 
2、实现示例
 
这里以禁止172.16.100.200这台主机通过工作在172.16.100.1上的postfix服务发送邮件为例演示说明其实现过程。访问表使用hash的格式。
 
(1)首先,编辑/etc/postfix/access文件,以之做为客户端检查的控制文件,在里面定义如下一行:
172.16.100.200 REJECT
 
(2)将此文件转换为hash格式
# postmap /etc/postfix/access
 
(3)配置postfix使用此文件对客户端进行检查
编辑/etc/postfix/main.cf文件,添加如下参数:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
 
(4)让postfix重新载入配置文件即可进行发信控制的效果测试了。
      service postfix restart
 
 
注:smtpd_client_restrictions对客户端发信进行限制,smtpd_recipient_restrictions对接收进行限制
如:想对发往huxin.com这个域的用户的信都拒绝接收和转发,可进行如下操作: 
(1)首先,编辑/etc/postfix/dennyy,添加如下一行:
huxin.com:   REJECT
(2)将此文件转换为hash格式  
postmap /etc/postfix/dennyy   dennyy这个文件可随意起名
ls /etc/postfix | grep dennyy 看是否生成dennyy.db这个文件
(3)配置postfix使用此文件对客户端发送的域huxin.com进行检查,如果是这个域的用户,就拒绝中继发送
编辑/etc/postfix/main.cf文件,添加如下参数:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/dennyy, permit_mynetworks, reject_unauth_destination
 
(4)让postfix重新载入配置文件即可进行发信控制的效果测试了。
      service postfix restart
 
注:利用imap(tcp/143)或pop3(tcp/110)协议接收邮件
(1)网上下载dovecot进行安装,这里用本地yum源安装为例 
  yum -y install dovecot
(2) 编缉/etc/dovecot.conf配置文件
#protocols = imap imaps pop3 pop3s 注释去掉,启用协议
(3) 启动dovecot服务,添加它为开机启动
  service dovecot start
  chkconfig dovecot on
(4)验证测试
  先发邮件:如mail -s "kkkk" centos < /etc/inittab  : -s 指定主题 centos收件人
telnet pop3.wl.com 110     启用110端口,即pop3协议接收邮件
USER   centos      用户
PASS   centos      密码
LIST               列出邮件
RETR     1         打开第一封邮件
(5)使用pop3协议接收邮件成功
 
七、为postfix开启基于cyrus-sasl的认证功能
 
使用以下命令验正postfix是否支持cyrus风格的sasl认证,如果您的输出为以下结果,则是支持的:
# /usr/local/postfix/sbin/postconf  -a
cyrus
dovecot
 
#vi /etc/postfix/main.cf
添加以下内容:
############################CYRUS-SASL############################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
 
#vim /usr/lib/sasl2/smtpd.conf
添加如下内容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
 
让postfix重新加载配置文件
#/usr/sbin/postfix reload
 
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 Welcome to our mail.magedu.com ESMTP,Warning: Version not Available!
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN               (请确保您的输出以类似两行)
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
 
 
注:cyrus-sasl的认证功能
(1)编辑/etc/postfix/main.cf,添加如下内容
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
 
找到mynetworks,把它值设为127.0.0.0/8,表示不是本机用户想发邮件,都必须提供用户名密码进行认证,通过方能进行邮件中继转发出去或发送
permit_sasl_authenticated :启用sasl进行用户发送邮件认证
/etc/rc.d/init.d/saslauthd   启动进程
service saslauthd start
 
chkconfig saslauthd on
 
 
#vim /usr/lib/sasl2/smtpd.conf
添加如下内容:
pwcheck_method: saslauthd    利用saslauthd认证机制
mech_list: PLAIN LOGIN       利用PLAIN LOGIN认证方式
 
让postfix重新加载配置文件
#/usr/sbin/postfix reload
查看/var/log/maillog是否成功
 
(2)验证
先事前把用户名密码进行base64编码如:echo -n "wl" | openssl base64    -n必须,否则它会加上回车符, 得到d2w=  
# telnet localhost 25
EHLO mail.wl.com           扩展功能
 
AUTH LOGIN
d2w=   用户名
d2w=   密码
 
(3)收邮件
mutt -f pop://wl@pop3.wl.com   收邮件   -f 指定协议 指定主机名与smtp无关 mutt可以对base64解码  发件人不是你指定的用户账号,而是你登录时的系统账号