首页 > 开发 > 综合 > 正文

postfix技巧

2024-07-21 02:37:28
字体:
来源:转载
供稿:网友

  增加postfix的进程数
  
  下面的设置依靠于内核版本:
  
  要在引导的时候修改参数,修改/etc/sysctl.conf添加:
  fs.file-max = 16384
  kernel.threads-max = 2048
   
  要在系统运行的时候修改参数,以root身份执行下面的命令
  # echo 16384 > /PRoc/sys/fs/file-max
  # echo 2048 > /proc/sys/kernel/threads-max
  如何让postfix找到最佳MX记录
  
  postfix缺省会按DNS上面定义的优先度查找所有MX地址,对应MX记录的服务器一应答,postfix就停止搜索并投递信件。
  但是假如对方服务器假如返回状态码4xx(拒绝信件)或者5xx(延迟)来拒绝连接,那么postfix就会延迟这封信的发送,而不是继续寻找可用的MX记录。
  如何让postfix能继续寻找MX记录呢?在main.cf设置:
  smtp_skip_4xx_greeting = yes
  smtp_skip_5xx_greeting = yes
  然后执行postfix reload。
  smtp_skip_5xx_greeting只有在20000104后面的版本才有提供
  
  postfix时常提示出现关于set-uid的错误
  
  传统的UNIX系统中,sendmail命令被安装成具有set-uid root权限,很多其他的MTA也有这个问题,但是postfix的sendmail命令由于安全方面的原因被设计成不能被set-uid root。
  但是有些linux系统上有个很有用的工具叫linuxconf,会缺省把postfix的sendmail命令当成Sendmail的sendmail命令,并自动纠正它的权限位,即使你取消了postfix的sendamil的set-uid位,linuxconf还会乐此不疲地帮你修改回去。
  解决方法有两个:
  
  停止开机的linuxconf服务,并删除linuxconf。
   
  假如是Suse Linux,那么可以进行如下设置:
  在/etc/permissions.local添加:
  /usr/sbin/sendmail root.root 755
  并确定/etc/rc.config中PERMISSIONS_SECURITY参数的最后有设置 local,例如:
  CHECK_PERMISSIONS=set
  PERMISSION_SECURITY="secure local"
  postfix出现错误“fatal: unknown service: smtp/tcp”
  
  这个可能出现地原因是master.cf中指定postfix SMTP客户端运行在chroot环境中,但是必要的文件没有安装到/var/spool/postfix中。激活chroot功能让系统入侵者增加了一个障碍。
  这里有两个解决方法:
   
  取消master.cf中的chroot设置。
   
  安装chroot运行需要的的文件,可以参考安装源码中examples/chroot-setup目录里面的说明
  postfix出现错误“fatal: open database /etc/aliases.db”
  
  文件存在,但是格式不对,导致的原因可能是aliases.db文件是由Berkeley DB版本1创建的,但是你现在使用的是版本2或者3,或者这个文件是用BTree格式建立的,但是postfix能识别的格式是hash,解决的方法是以root的身份执行newaliases,这样就能建立一个postfix能识别的aliases.db文件。
   
  假如按上面的方法处理后,newaliases的结果报告aliases.db文件长度是0,那么可能是编译的时候使用的db.h等Berkeley DB的开发库文件有问题,解决方法是正确安装Berkeley DB开发包。
  postfix日志中出现“Host not found, try again”
  
  发信给远端服务器上的用户,出现:
   Jul 14 12:45:38 myhostname postfix/qmgr[2246]: 74FBF30501:
  from= size=309 (queue active)
   Jul 14 12:45:39 myhostname postfix/smtp[2349]: 74FBF30501:
  to= relay=none, delay=3944, status=deferred (Name
  service error for domain recip.domain: Host not found, try again)
  但是用nslookup又能解析这个主机名。

  
  postfix会首先进行MX记录查找,所以你执行nslookup的时候也应该首先查找MX记录。有些DNS服务器没有MX记录,那么就会出现这个错误
  
  什么使用了postfix,majordomo的"approve"命令会中断
  
  postfix的本地投递代理在信件头部添加一个Delivered-To信息,为了防止邮件由于转发造成循环。但是在majordomo邮件列表中, Delivered-To会在治理员批准要发送到列表的邮件有所妨碍,因为postfix会认为这封信是在循环发送。
  现在推荐的解决方法是修改approve脚本,去掉任何带“/delivered-to/i”的行。
  
  postfix如何设置取消Delivered-To头部信息
  
  很多MUA在配置文件里面可以设置禁止出现Delivered-To:头部信息(例如~/.mailrc和/usr/lib/Mail.rc)
   
  在邮件列表里面,Delivered-To头部信息会妨碍列表使用不想在外发邮件中出现的“secret alias”,所以建议在SMTP端口上面使用正规表达式过滤,在main.cf中设置:
  smtpd_recipient_restrictions =
   ... regeXP:/etc/postfix/access_regexp ...
  smtpd_recipient_restrictions =
   ... pcre:/etc/postfix/access_regexp ...
  /etc/postfix/access_regexp:
   /^(.*)-outgoing@(.*)/ 554 Use $1@$2 instead
   
  prepend_delivered_header配置参数也控制Delivered-To的使用。缺省的设置是command, file, forward(在把信件发送给命令,发送给文件或者转发的时候使用Delivered-To)。不推荐在转发邮件的情况下取消Delivered-To头部信息。
  如何在postfix中使用procmail
  
  在main.cf中设置:
  mailbox_command = /path/to/procmail
  或者
  /etc/postfix/main.cf:
  mailbox_command = /path/to/procmail -a $EXTENSION
  假如可以的话,避免使用shell的要害字符,比如"$",IFS或者"&&",因为它们会迫使postfix运行一个shell进程。
  
  如何让postfix支持maildir
  
  在main.cf中设置:
  home_mailbox = Maildir/
  任何相对路径末尾加上“/”号都表示打开了maildir支持,home_mailbox设置的值将会追加到用户的home目录,也就是假如你指定home_mailbox = mymail/,那么postfix也认为打开了maildir支持,并把信件投递到用户home目录下的mymail目录中。
  
  为什么Postfix提示"NIS domain name not set - NIS lookups disabled"
  
  提示的信息说明你的机器上面没有激活NIS,要在postfix本地投递代理中禁用NIS客户端代码,更改main.cf中对应的部分,根据aliases文件的类型进行下面的类似设置:
  alias_maps = $alias_database
  这将强制postfix只使用本地的aliases数据库。
  
  为什么Postfix提示“biff_notify: Connection refused”
  
  postfix本地投递代理缺省会尝试提示本地用户新邮件到达,这个特性使用了comsat网络服务,但是comsat网络服务经常由于系统性能或者安全原因而关闭,所以出现这个"biff_notify: Connection refused"的警告。
  要在postfix投递代理中取消comsat客户端代码,只要在/etc/postfix/main.cf中指定:
  biff = no
  或者起用comsat服务。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表