使用Postfix系统做外发SMTP服务器的问题

12/3/2006来源:Qmail人气:8622

目的: 搭建单独的SMTP外发服务器,从正常的邮件服务器中独立出来
  要求:关闭Openrelay,没有经过身份验证不能使用smtp服务器发送邮件(本域也免谈)
  状态: 以前工作进展程度,SMTP+身份验证正常工作,没有身份验证不能发送邮件给域内或域外用户。(通过把$mydestination $relay_domains设置成空实现的),存在问题,当用户发送给本域用户时,无法立即发现用户是否实际存在。需要等待一段时间后才能收到smtp的退信。
  
  改进要求: 如果用户发邮件给本域不存在用户,系统立即提示用户不存在,且不通过验证不能发送邮件给任何人,包括域内用户。

  改进方法:
  
  增加relay_recipient_maps,但是这个工作需要依赖于relay_domains,对于邮件系统的默认配置,如果存在 relay_domains,那么系统将会自动接受relay_domains的邮件,无论用户是否提供身份验证信息。
  
  修改方法:
  因为我的系统使用了MySQL,FC4默认的postfix还不支持postfix,所以要重新编译,在互联网上逛,发现这个编译方法很方便,延续了我系统使用rpm包的习惯:
  rpm -ivh postfix-2.1.6-1.src.rpm
  
  cd /usr/src/redhat/SOURCES
  
  bash
  
  export POSTFIX_MYSQL_REDHAT=1
  export POSTFIX_SASL=2
  export POSTFIX_TLS=1
  
  sh make-postfix.spec
  
  exit
  
  cd /usr/src/redhat/SPECS
  
  rpmbuild -ba postfix.spec
  
  cd /usr/src/redhat/RPMS/i386
  这样就搞定了,呵呵
  
  在/etc/postfix/main.cf中增加:
  

==============
relay_domains = mysql:/etc/postfix/mysql-relay.cf
  relay_recipient_maps = mysql:/etc/postfix/mysql-user.cf, mysql:/etc/postfix/mysql-virtual.cf
  
==============
  上面两行关于mysql的配置,根据系统的不同,略有不同, mysql-relay.cf主要是查找 那些域名是属于 域内的(发往自己邮件服务器的)
  
mysql-user.cf mysql-virtual.cf 这两个文件是user表,其实就是 自己邮件服务器上的所有邮件地址列表。

  修改:
  
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject
  
最后增加一个 reject,我找了好久,最后发现增加一个 reject 就实现我的要求了,具体说明参见postfix的说明。
  
  
PS: 用过postfix后,就会不知不觉的放弃其他MTA,至少我是这样的。