概述
把家庭办公环境的postfix应用技巧和提示整合到这篇文档的目的是便于查找。这篇文档仅描述了邮件的发送。如果你的postfix服务器不直接接收邮件(比如:它没有公网的域名和固定的IP),那么你将需要一个类似于“fetchmail”的解决方法--这超出了postfix的文档范围
从STANDARD_CONFIGURATION_README文档中选择相关主题:
 ·基于internet主机的postfix安装
 ·基于Intranet主机的postfix安装
从SASL_README文档中选择相关主题:
 ·在postfix的smtp客户端启用SASL认证
 ·配置邮件发送者的SASL认证
关于这些主题的更详细的信息查看SASL_README 和 STANDARD_CONFIGURATION_README文档
基于Internet主机的postfix安装
postfix几乎在没有改变独立主机的设置的前提下就能被安装好。至少,当你下载postfix源码后知道如何安装postfix。
你可以用“postconf -n”命令查看main.cf中的哪些设置变更过。除了一些路径的设置和“基本配置”文档中的参数设置外,几乎没有什么申述需要在独立主机上设置:
/etc/postfix/main.cf
 myhostname=ceshi.linux.com   (其中ceshi.linux.com是机器的FQDN)
 mydomain=linux.com
 myorigin=$mydomain
 mydestination=$myhostname  localhost.$mydomain  localhost
  mail.$mydomain
 inet_interfaces=all
 mynetworks=127.0.0.1/8  192.168.1.0/24
 proxy_interfaces=1.2.3.4 
 relayhost = [mail.$mydomain]
/etc/aliases:
   postmaster: qq@linux.com
    root: qq@linux.com 
也可以参见“没有公网主机名的postfix安装”部分,如果它们对你的配置有帮助的话。
没有公网主机名的postfix安装
这部分是适用于那些没有internet主机名(即公网固定IP)的postfix主机。一般是那些通过DHCP或者拨号获取公网动态IP地址的主机。postfix可以用一个不存在(fantasy)的名称为linux系统用户提供发送/接收邮件的功能。但是当你在给internet用户发邮件时,不能在邮件地址中使用这个名称,因为internet用户将无法给你回复邮件。实际上,越来越多的站点将拒绝域名不存在的邮件。
注意:下面的内容将随postfix版本不同而有所不同。查看postfix的版本,使用"postconf mail_version"命令
解决方法1:postfix2.2及以后的版本
postfix 2.2 使用通用的地址映射方法把本地邮件地址映射为internet上的有效地址。这个映射仅在邮件发送出postfix主机时才发生;当邮件在同一台机器的不同用户间传递邮件时,将不会使用地址映射功能。
下面的例子展现了一些附加的配置。你需要把这些附加的配置与该文档前半部分介绍的基本配置结合起来。
1 /etc/postfix/main.cf:
2     smtp_generic_maps = hash:/etc/postfix/generic
3
4 /etc/postfix/generic:
5     his@localdomain.local             hisaccount@hisisp.example
6     her@localdomain.local             heraccount@herisp.example
7     @localdomain.local                hisaccount+local@hisisp.example
当邮件通过SMTP发送给公网的邮件服务器时:
第5,6行    左边是内部的邮件地址,右边的部分是公网的邮件地址
如果你的系统使用dbm文件来代替db文件的话,那么用dbm来代替hash。查看你的postfix支持哪些查询表,用"postconf -m"命令。
当你改变了通用查询表的内容时,需要执行一下"postmap /etc/postfix/generic"命令来重新生成该配置文件。
解决方法2: postfix 2.1及以前版本
老版本的postfix系统是使用有效地internet地址,并且让postfix把有效的internet地址映射为本地的地址。这样,你能发送邮件给internet用户和本地用户。
下面的例子展现了一些附加的配置。你需要把这些附加的配置与该文档前半部分介绍的基本配置结合起来。
 1 /etc/postfix/main.cf:
 2     myhostname = hostname.localdomain
 3     mydomain = localdomain
 4
 5     canonical_maps = hash:/etc/postfix/canonical
 6
 7     virtual_alias_maps = hash:/etc/postfix/virtual
 8
 9 /etc/postfix/canonical:
10     your-login-name    your-account@your-isp.com
11
12 /etc/postfix/virtual:
13     your-account@your-isp.com       your-login-name
如果你的系统使用dbm文件来代替db文件的话,那么用dbm来代替hash。查看你的postfix支持哪些查询表,用"postconf -m"命令。
当你改变了canonical表的内容时,需要执行一下"postmap /etc/postfix/canonical"命令
当你改变了virtual表的内容时,需要执行一下"postmap /etc/postfix/virtual"命令
在postfix的smtp/lmtp客户端启用sasl验证
这个部分向你展示了一个典型的方案:postfix的smtp客户端经过邮件网关sasl验证后发送邮件。
问题解决提示:
如果你的sasl登陆失败,并在maillog日志文件里提示:sasl验证失败:没发现可用的验证机制。这个错误参见“postfix SMTP/LMTP客户端策略--SASL机制属性”。
对于一些模糊的sasl验证失败,参见“postfix SMTP/LMTP客户端策略--SASL机制名称”
为了是这个例子更可读,我们把它分成两个部分介绍。第一个部分关注基本的配置,第二个部分主要是设置用户名/密码信息。
/etc/postfix/main.cf:
    smtp_sasl_auth_enable = yes
    relayhost = [mail.isp.example]
    # Alternative form:
    # relayhost = [mail.isp.example]:submission
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
 
smtp_sasl_auth_enable设置决定是否启用客户端的验证。我们将在第二部分配置客户端的用户名和密码信息。
relayhost参数设置将强制postfix的SMTP把所有发往公网的邮件传递到指定的邮件网关,而不是直接把邮件发送到目的邮箱。
在relayhost参数设置中,中括号"[]"阻止postfix的smtp到mx记录中查找中括号中的名称。
relayhost的目的地可以指定一个非默认的tcp端口。例如:[mail.isp.example]:submission告诉postfix连接tcp的587端口--这是为email客户应用保留的端口。
postfix的smtp客户端要与smtp服务器使用一样的验证方法"AUTH=method...."以回应ehlo命令;这要求没有额外的postfix客户端配置。
postfix的smtp客户端不支持过期的"wrappermode"协议--在smtp服务器使用465端口。使用隧道,请参见TLS_README文档
使用smtp_sasl_password_maps参数,我们能配置postfix的smtp客户端发送用户名和密码信息给邮件网关服务器。正如接下来要讨论的部分,postfix的smtp客户端支持多isp帐户。由于这个原因,用户名和密码存储在一个邮件网关服务器可以访问的表中
/etc/postfix/sasl_passwd:
    # destination                   credentials
    [mail.isp.example]              username:password
    # Alternative form:
    # [mail.isp.example]:submission username:password
重要提示:
把sasl客户端的密码文件放在/etc/postfix目录中,确保只有root用户对该文件可读写。postfix的smtp客户端可以读取sasl客户端的密码。它在降低特权和使用chroot前,以root用户的身份打开该文件
当改变/etc/postfix/sasl_passwd之后,一定要使用postmap命令
如果在relayhost destination中指定了相关的值,必须在smtp_sasl_password_maps文件中使用相同的值
如果你在relayhost destination中指定了非默认的tcp端口(比如:":submission" or ":587"),你必须在smtp_sasl_password_maps使用相同的端口
配置基于发送者的sasl验证机制
postfix为不同的发送地址提供不同的isp帐户(postfix 2.3版本之后)。当一个人使用同一台机器用于工作和生活时,或者当同一台postfix服务器使用不同的isp帐户时,这个设置将非常有用。
为了实现这个功能,postfix支持per-sender的sasl密码和per-sender中继主机。在下面的例子中,postfix的smtp客户端将先通过发送者地址查找sasl密码文件,然后通过目的地址查找sasl密码文件。同样的,postfix的trivial-rewrite(8)守护进程将查找per-sender的中继主机文件,并使用默认的中继设置作为最后的办法。
/etc/postfix/main.cf:
    smtp_sender_dependent_authentication = yes
    sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    relayhost = [mail.isp.example]
    # Alternative form:
    # relayhost = [mail.isp.example]:submission
/etc/postfix/sasl_passwd:
    # Per-sender authentication; see also /etc/postfix/sender_relay.
    user1@example.com               username2:password2
    user2@example.net               username2:password2
    # Login information for the default relayhost.
    [mail.isp.example]              username:password
    # Alternative form:
    # [mail.isp.example]:submission username:password
/etc/postfix/sender_relay:
    # Per-sender provider; see also /etc/postfix/sasl_passwd.
    user1@example.com               [mail.example.com]:submission
    user2@example.net               [mail.example.net]
如果你富有创造性,你能把两个表整合到mysql数据库中,并配置不同的postfix查询条件
如果你的系统使用dbm文件来代替db文件的话,那么用dbm来代替hash。查看你的postfix支持哪些查询表,用"postconf -m"命令。
当改变了sasl_passwd表时,执行"postmap /etc/postfix/sasl_passwd"命令
当改变了sender_relay表时,执行"postmap /etc/postfix/sender_relay"命令