跳转到主要内容

于 2025年04月22日 摘录自 Postfix Address Rewriting

Postfix 地址重写的目的

地址重写是 Postfix 邮件系统的核心。 Postfix 重写地址有许多不同的目的。 有些只是为了美观,有些则是为了将格式正确的邮件发送到正确的目的地。 Postfix 中地址重写的例子有

  • 将不完整的地址转换为完整的地址。 例如,将 "username "转换为 "[email protected]",或将 "username@hostname "转换为 "[email protected]"。
  • 用等效地址替换地址。 例如,发送邮件时将 "[email protected] "替换为 "[email protected]",接收邮件时进行反向转换。
  • 用外部地址替换内部地址。 例如,从家用电脑向互联网发送邮件时,将 "[email protected] "替换为 "[email protected]"。
  • 用多个地址替换一个地址。 例如,用别名下列出的地址替换别名的地址。
  • 确定向特定地址发送邮件的方式和地点。 例如,使用smtp(8)发送代理将 "[email protected] "的邮件发送到 DNS 中列为 "example.com "域名邮件服务器的主机上。

虽然 Postfix 目前没有地址重写语言,但它可以通过查找表进行功能强大的地址操作。 Postfix 通常使用带有固定字符串的查找表将一个地址映射到一个或多个地址,通常使用正则表达式将多个地址映射到一个或多个地址。 固定字符串查找表可以是本地文件形式,也可以是 NIS、LDAP 或 SQL 数据库形式。 DATABASE_README文档介绍了 Postfix 查找表。

本文档涵盖的主题

重写或不重写报文头,或标记为无效

Postfix 2.1 及以前的版本总是重写邮件头地址,并在 Postfix 认为不完整的地址上附加 Postfix 自己的域名信息。 虽然重写报文头地址对本地邮件来说没有问题,但对远程邮件来说却不可取:

  • 邮件头地址重写不符合邮件标准、
  • 附加 Postfix 自身的域名会产生不正确的结果,包括一些不完整的地址、
  • 附加 Postfix 自身的域名有时会造成垃圾邮件是由本地用户发送的假象。

Postfix 2.2 版允许您选择不重写来自远程 SMTP 客户端的邮件头,或将邮件头中不完整的地址标为无效。 具体操作如下:

  • Postfix 总是重写来自本地 SMTP 客户端和 Postfix sendmail 命令的邮件头,并将自己的域名附加到不完整的地址上。 local_header_rewrite_clients参数控制 Postfix 将哪些 SMTP 客户视为本地客户(默认情况下,只考虑本地网络接口地址)。
  • remote_header_rewrite_domain参数值为空(默认设置)时,Postfix 从不改写来自远程 SMTP 客户端的邮件头地址。
  • 否则,Postfix 会重写来自远程 SMTP 客户端的邮件头,并将remote_header_rewrite_domain值附加到不完整的地址上。 该功能可用于附加一个保留域,如 "domain.invalid",这样,不完整的地址就不会被误认为是本地地址。

Postfix 地址重写概述

下图放大了 Postfix 中涉及地址重写活动最多的部分。 有关整个 Postfix 架构的概述,请参阅OVERVIEW文档。 后面有数字的名称表示 Postfix 守护进程,没有数字的名称表示 Postfix 队列或邮件信息的内部来源。

 trivial-
rewrite(8)
(标准格式)
 trivial-
rewrite(8)
(resolve)
 
^
|
 
^
|
 
smtpd(8)>- cleanup(8)-> incoming -> active -> qmgr(8)-< smtp(8)
qmqpd(8)lmtp(8)
pickup(8)local(8)
 ^
 
^
|
 
 

跳转

转发

通知

 deferred  

下表总结了所有 Postfix 地址操作。 如果您是第一次阅读本文档,请跳至"收到邮件时重写地址"。 阅读完本文档的其余部分后,表格将帮助您快速找到所需的内容。

地址操纵范围守护进程开启控制关闭控制
将地址改写为标准格式所有邮件trivial-
rewrite(8)
append_at_myorigin, append_dot_mydomain, swap_bangpath, allow_percent_hacklocal_header_rewrite_clients, remote_header_rewrite_domain
规范地址映射 所有邮件cleanup(8)canonical_mapsreceive_override_options, local_header_rewrite_clients, remote_header_rewrite_domain
地址伪装 所有邮件cleanup(8)masquerade_domainsreceive_override_options, local_header_rewrite_clients, remote_header_rewrite_domain
自动 BCC 收件人 新邮件cleanup(8)always_bcc, sender_bcc_maps, recipient_bcc_mapsreceive_override_options
虚拟别名 所有邮件cleanup(8)virtual_alias_mapsreceive_override_options
将地址解析为(传输、下一跳目的地)所有邮件trivial-
rewrite(8)
local_transport, virtual_transport, relay_transport, default_transport, relayhost, sender_dependent_relayhost_maps, sender_dependent_default_transport_mapscontent_filter
重新定位的用户表所有邮件trivial-
rewrite(8)
relocated_mapsnone
通用映射表 发出的 SMTP 邮件smtp(8)smtp_generic_mapsnone
本地别名数据库仅限本地邮件local(8)alias_mapsnone
本地每个用户的 .forward 文件仅限本地邮件local(8)forward_pathnone
本地通用地址仅限本地邮件local(8)luser_relaynone

接收邮件时重写地址

cleanup(8)服务器接收来自 Postfix 外部的邮件以及来自内部的邮件,例如转发邮件、退回发件人的无法投递邮件以及有关邮件系统问题的邮局管理员通知。

cleanup(8)服务器会将发件人、收件人和邮件内容转换成标准格式,然后将其写入接收队列文件。 该服务器会清理邮件标题和信封中的发件人和收件人地址,添加邮件标准所要求的发件人:或日期:等缺失的邮件标题,并删除不应出现的密送:等邮件标题。 清理(8)服务器会将更复杂的地址处理委托给trivial-rewrite(8)服务器,本文稍后将对此进行介绍。

此阶段的地址处理包括

将地址改写为标准格式

在通过任何地址映射查找表运行一个地址之前,cleanup(8)守护进程首先会将地址重写为标准的 "[email protected] "形式,方法是将地址发送给trivial-rewrite(8)守护进程。 改写为标准格式的目的是减少查找表所需的条目数量。

Postfixtrivial-rewrite(8)守护进程实现了以下硬编码地址操作:

将"@hosta,@hostb:user@site "重写为 "user@site

如果你想知道这是什么,上面的地址形式称为路由地址,指定通过 "hosta "和 "hostb "发送给 "user@site "的邮件。 使用这种形式已经废弃很久了。 Postfix 无法处理路由地址,只能去掉路由部分。

注意:Postfix 2.2 及更高版本只有在客户端与local_header_rewrite_clients参数匹配,或remote_header_rewrite_domain配置参数指定了非空值的情况下,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

将 "site!user "重写为 "user@site"

该功能由swap_bangpath参数(默认为 yes)控制。 其目的是将 UUCP 风格的地址重写为域风格。 这只有在通过 UUCP 接收邮件时才有用,否则可能也无大碍。

注意:Postfix 2.2 及更高版本只有在客户端匹配local_header_rewrite_clients参数,或remote_header_rewrite_domain配置参数指定为非空值时,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

将 "user%domain "重写为 "user@domain"

该功能由布尔值allow_percent_hack参数(默认为 yes)控制。 通常,该功能用于处理诸如 "user%domain@otherdomain "之类的怪事。

注意:Postfix 2.2 及更高版本只有在客户端匹配local_header_rewrite_clients参数,或remote_header_rewrite_domain配置参数指定为非空值时,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

将 "user "重写为 "user@$myorigin"

该功能由布尔值append_at_myorigin参数(默认值:是)控制。 千万不要关闭此功能,因为很多 Postfix 组件都希望所有地址都是 "user@domain "形式。

注意:Postfix 2.2 及更高版本只有在客户端与local_header_rewrite_clients参数匹配时,才会重写来自远程 SMTP 客户端的邮件头;否则,如果指定了remote_header_rewrite_domain配置参数,则会附加该参数指定的域名。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

如果您的机器不是$myorigin的主机,而且您希望不通过主机而在本地发送某些用户,则可在虚拟别名表中创建一个条目,将 "user@$myorigin "重定向到 "user@$myhostname"。 另请参阅STANDARD_CONFIGURATION_README文档中的 "在本地传送部分用户 "部分。

将 "user@host "重写为 "user@host.$mydomain"

该功能由布尔型append_dot_mydomain参数控制(默认值:Postfix ≥ 3.0:否,Postfix < 3.0:是)。 这样做的目的是一致处理同一主机名的不同形式。

注意:Postfix 2.2 及更高版本只有在客户端符合local_header_rewrite_clients参数时,才会重写来自远程 SMTP 客户端的邮件头;否则,如果指定了remote_header_rewrite_domain配置参数,则会附加该参数指定的域名。 要获得 Postfix 2.2 之前的行为,可指定"local_header_rewrite_clients=static:all"。

有人会说,将 "host "重写为 "host.domain "不好。 这就是为什么可以关闭它。 其他人则喜欢 Postfix 自动添加自己的域的便利性。

将 "user@site. "重写为 "user@site"(去掉尾点)。

单个尾点会被静默删除。 但是,以多个点结尾的地址将作为无效地址被拒绝。

注意:Postfix 2.2 及更高版本只有在客户端与local_header_rewrite_clients参数匹配,或remote_header_rewrite_domain配置参数指定了非空值的情况下,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

规范地址映射

cleanup(8)守护进程使用canonical(5)表重写邮件封套和邮件头中的地址。 默认情况下,所有报文头和信封地址都会被重写;这可以通过canonical_classes配置参数来控制。

注意:Postfix 2.2 及更高版本只有在客户端与local_header_rewrite_clients参数匹配,或remote_header_rewrite_domain配置参数指定了非空值的情况下,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

地址重写针对本地和远程地址。 这种映射非常有用,可以用 "Firstname.Lastname "风格的地址替换登录名,或清除传统邮件系统生成的邮件地址中的无效域。

典型映射默认为禁用。 要启用该功能,请编辑main.cf文件中的canonical_maps参数,并指定一个或多个查找表,以空格或逗号分隔。

例如

/etc/postfix/main.cf:
    canonical_maps = hash:/etc/postfix/canonical
/etc/postfix/canonical:
    wietse        Wietse.Venema

对于如上所示的静态映射,使用诸如hash:,ldap:,mysql: 或pgsql: 等查找表即可。 对于动态映射,可以使用正则表达式表。 这需要您熟悉regexp_table(5)pcre_table(5)canonical(5) 中表达的思想。

除了同时适用于发件人地址和收件人地址的规范映射外,您还可以指定只适用于发件人地址或收件人地址的规范映射。

例如

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical
    recipient_canonical_maps = hash:/etc/postfix/recipient_canonical

发件人和收件人规范映射先于普通规范映射应用。 发件人规范映射(sender_canonical_classes)和收件人规范映射(receiver_canonical_ classes)参数分别控制哪些地址受发件人规范映射(sender_canonical_maps)和收件人规范映射(receiver_canonical_maps)的影响。

当你想把丑陋的发件人地址重写为漂亮的地址,同时又想在不创建邮件循环的情况下向这些丑陋的地址发送邮件时,发件人特定重写就非常有用。

对于由smtpd(8)qmqpd( 8)pickup(8) 接收的邮件,可以通过覆盖master .cf文件中的main.cf设置,选择性地关闭规范映射。 此功能在 Postfix 2.1 及更高版本中可用。

示例

/etc/postfix/master.cf:
    127.0.0.1:10026    inet  n      -      n      -      -     smtpd
        -o receive_override_options=no_address_mappings

注意:此处"="周围不要指定空白。

地址伪装

地址伪装是一种将域内主机隐藏在邮件网关后面的方法,使邮件看起来像是来自网关本身,而不是来自个别机器。

注意:Postfix 2.2 及更高版本只有在客户端匹配local_header_rewrite_clients参数,或remote_header_rewrite_domain配置参数指定为非空值时,才会重写来自远程 SMTP 客户端的邮件头。 要获得 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients=static:all"。

地址伪装默认是禁用的,由cleanup(8)服务器实现。 要启用该功能,请编辑main.cf文件中的masquerade_domains参数,并指定一个或多个域名,域名之间用空格或逗号隔开。 Postfix 尝试伪装域名时,会从左到右处理列表,并在第一个匹配时停止处理。

例如

/etc/postfix/main.cf:
    masquerade_domains = foo.example.com example.com

将 "any.thing.foo.example.com "删除为 "foo.example.com",但将 "any.thing.else.example.com "删除为 "example.com"。

前缀为""的域名表示不对该域名或其子域名进行伪装:

/etc/postfix/main.cf:
    masquerade_domains = !foo.example.com example.com

不会改变 "any.thing.foo.example.com "和 "foo.example.com",而是将 "any.thing.else.example.com "删除为 "example.com"。

masquerade_exceptions配置参数指定了哪些用户名不应进行地址伪装。 指定一个或多个用户名,以空格或逗号分隔。

例如

/etc/postfix/main.cf:
    masquerade_exceptions = root

在默认情况下,Postfix 不会例外。

微妙之处:默认情况下,地址伪装只应用于邮件头和信封发件人地址,而不适用于信封收件人。 这样就可以在邮件网关机器上使用地址伪装,同时仍能将外部邮件转发给单个机器上的用户。

要使信封收件人地址也接受伪装,请指定(Postfix 1.1 及更高版本):

/etc/postfix/main.cf:
    masquerade_classes = envelope_sender, envelope_recipient,
        header_sender, header_recipient

如果这样重写信封收件人,Postfix 将无法再向单个机器发送邮件。

对于由smtpd(8)qmqpd( 8)pickup(8) 接收的邮件,可以通过覆盖master .cf文件中的main.cf设置有选择地关闭地址伪装。 此功能在 Postfix 2.1 及更高版本中可用。

示例

/etc/postfix/master.cf:
    127.0.0.1:10026    inet  n      -      n      -      -     smtpd
        -o receive_override_options=no_address_mappings

注意:此处"="周围不要指定空白。

自动 BCC 收件人

应用规范和伪装映射后,cleanup(8)守护进程可以生成可选的 BCC(盲碳拷贝)收件人。 Postfix 提供了三种机制:

always_bcc= 地址

向指定地址发送所有邮件的副本。 在 Postfix 2.1 之前的版本中,该功能由smtpd(8)qmqpd (8)pickup(8) 实现。

sender_bcc_maps=type:table

使用信封发件人地址搜索指定的"type:table"查找表,以查找自动 BCC 地址。 此功能在 Postfix 2.1 及更高版本中可用。

recipient_bcc_maps=type:table

使用信封收件人地址搜索指定的"type:table"查找表,以查找自动 BCC 地址。 此功能在 Postfix 2.1 及更高版本中可用。

注意:自动 BCC 收件人仅为新邮件生成。 为避免邮件发送器循环,Postfix 内部转发的邮件或 Postfix 自行生成的邮件不会生成自动 BCC 收件人。

对于由smtpd(8)qmqpd( 8)pickup(8) 接收的邮件,可以通过覆盖master .cf文件中的main.cf设置,有选择地关闭自动 BCC 收件人(包括always_bcc)。 此功能在 Postfix 2.1 及更高版本中可用。

示例

/etc/postfix/master.cf:
    127.0.0.1:10026    inet  n      -      n      -      -     smtpd
        -o receive_override_options=no_address_mappings

注意:此处"="周围不要指定空白。

虚拟别名

在将收件人写入队列文件之前,cleanup(8)守护进程会使用可选的virtual(5)别名表为收件人重定向邮件。 映射只影响信封收件人地址,对邮件标题或信封发件人地址没有影响。 虚拟别名查找可用于将虚拟别名域的邮件重定向到真实用户邮箱,以及将已不存在的域的邮件重定向。 虚拟别名查询还可用于将 "Firstname.Lastname "转换回 UNIX 登录名,不过本地别名似乎是更合适的工具。 有关 Postfix 虚拟域托管方法的概述,请参阅VIRTUAL_README文档。

注意:虚拟别名virtual_alias_maps )适用于所有收件人: 本地(8)、虚拟和远程。 这与本地别名alias_maps )不同,后者只适用于本地(8)接收者。

虚拟别名默认为禁用。 要启用虚拟别名,请编辑main.cf文件中的virtual_alias_maps参数,并指定一个或多个查找表,以空格或逗号分隔。

示例

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual
/etc/postfix/virtual:
    Wietse.Venema        wietse

在虚拟别名映射中找到的地址会再次迭代虚拟别名,但不会进行规范映射,以避免循环。

对于如上所示的静态映射,使用查找表(如hash:,ldap:,mysql: 或pgsql: )就足够了。 对于动态映射,可以使用正则表达式表。 这就要求您熟悉regexp_table(5)pcre_table(5)virtual(5) 中表达的思想。

对于由smtpd(8)qmqpd (8)pickup(8) 接收的邮件,可以通过覆盖master .cf文件中的main.cf设置有选择地关闭虚拟别名。 此功能在 Postfix 2.1 及更高版本中可用。

示例

/etc/postfix/master.cf:
    127.0.0.1:10026    inet  n      -      n      -      -     smtpd
        -o receive_override_options=no_address_mappings

注意:不要在"="周围指定空白。

至此,邮件就可以存储到 Postfix的收件队列中了。

邮件投递时的地址重写

Postfix 队列管理器会根据邮件的目的地对邮件进行分类,然后将其交给 Postfix 投递代理,如local(8)smtp( 8)lmtp(8) 。 与cleanup(8)服务器一样,Postfix 队列管理器将更复杂的地址处理委托给trivial-rewrite(8)服务器。

此阶段的地址操作包括

每个 Postfix 发送代理都会尝试将邮件发送到目的地,同时根据 SMTP、LMTP 等协议的规则封装发件人、收件人和邮件内容。 如果邮件无法投递,则会被退回发件人或移至延迟队列,稍后再试。

通过smtp(8)发送代理发送邮件时的地址操作:

通过本地 (8)发送代理发送邮件时的地址操作:

本文档的其余部分将更详细地介绍每个地址操作步骤,并提供具体示例或示例文档指针。

将地址解析为(传输、下一跳目的地)

Postfixqmgr(8)队列管理器从接收队列中选择新邮件,或从延迟队列中选择旧邮件。 首先,它会查找覆盖:

在没有内容过滤器覆盖的情况下,qmgr(8)队列管理器会询问trivial-rewrite(8)地址重写和解析守护进程对每个收件人的发送方式(哪种邮件发送传输方式)和发送地点(下一跳目的地)。

从 2.0 版开始,Postfix 区分了四个主要域类。 每个类别都有自己的收件人域名列表,每个类别都有自己的发送方法,如下表所示。 详情请参见ADDRESS_CLASS_README文档。 Postfix 2.0 之前的版本只区分本地邮件和其他邮件。

请注意,该表不会将收件人与virtual_alias_domains 匹配。 原因是虚拟别名域中的所有有效收件人都必须别名到不同域中的地址。 根据定义,虚拟别名域中的所有其他收件人都是无法投递的,在此无需考虑。

Domain classRecipient domain matchDelivery methodAvailability
Localmydestination, inet_interfaces, proxy_interfaceslocal_transportPostfix 1.0
Virtual mailboxvirtual_mailbox_domainsvirtual_transportPostfix 2.0
Relayrelay_domainsrelay_transportPostfix 2.0
Defaultnonedefault_transportPostfix 1.0

T除传送传输外,上表中的传送方法还可包括下一跳目的地。 这可以覆盖默认情况下从收件人域获取的下一跳目的地。

随着时间的推移,已添加了一些功能来覆盖上述传输和/或下一跳目的地信息。 下表列出了传输或下一跳目的地的来源,具体取决于接收者的域类别。

Domain classTransport sources (in order of descending precedence)Next hop sources (in order of descending precedence)
Localtransport_maps, local_transporttransport_maps, local_transport, recipient domain
Virtual mailboxtransport_maps, virtual_transporttransport_maps, virtual_transport, recipient domain
Relaytransport_maps, relay_transporttransport_maps, relay_transport, sender_dependent_relayhost_maps, relayhost, recipient domain
Defaulttransport_maps, sender_dependent_default_transport_maps, default_transporttransport_maps, sender_dependent_default_transport_maps, default_transport, sender_dependent_relayhost_maps, relayhost, recipient domain

重新定位的用户表

接下来,trivial-rewrite(8)地址重写和解析守护进程会通过relocated(5)数据库运行每个收件人。 该表提供了如何联系不再拥有账户的用户,或如何处理不再存在的整个域的邮件的信息。 当邮件被发送到该表中列出的地址时,邮件会被返回给发件人并附带一条信息。

在查找transport(5)表后,会搜索relocated(5)数据库,因为预计transport(5)表会用不同的地址替换一个收件人地址。

重定位用户的查询默认为禁用。 要启用此功能,请编辑main.cf文件中的relocated_maps参数,并指定一个或多个查找表,以空格或逗号分隔。

例如

/etc/postfix/main.cf:
    relocated_maps = hash:/etc/postfix/relocated
/etc/postfix/relocated:
    [email protected]      [email protected]

从 Postfix 第 2 版开始,SMTP 服务器会以 "用户已迁移到 [email protected] "为由拒收已迁移用户的邮件。 旧版本的 Postfix 会先接收邮件,然后以无法投递为由将邮件退回给发件人,并给出同样的理由。

外发 SMTP 邮件的通用映射

有些主机没有有效的互联网域名,而是使用localdomain.local 这样的名称。 当你想通过互联网发送邮件时,这可能会造成问题,因为许多邮件服务器会拒绝接受域名无效的邮件地址。

使用smtp_generic_maps参数可以指定generic(5)查找表,当邮件通过 SMTP 离开机器时,该表会用有效的互联网地址替换本地邮件地址。 generic(5)映射会替换信封和邮件头地址,而且是非递归的。 在本地计算机上的地址之间发送邮件时,不会出现这种情况。

此功能在 Postfix 2.2 及更高版本中可用。

示例

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic
/etc/postfix/generic:
    [email protected]               [email protected]
    [email protected]               [email protected]
    @localdomain.local                  [email protected]

当邮件通过 SMTP 发送到远程主机时,会用他的 ISP 邮件地址替换[email protected],用她的 ISP 邮件地址替换[email protected],并用他的 ISP 账户替换其他本地地址,地址扩展名为 +local(本例假定 ISP 支持 "+"式地址扩展)。

本地别名数据库

当邮件要在本地投递时,local(8)投递代理会通过aliases(5)数据库运行每个本地收件人名称。 这种映射不会影响邮件标题中的地址。 本地别名通常用于实施分发列表,或将标准别名(如 postmaster)的邮件直接发送给真人。 该表还可用于将 "Firstname.Lastname "地址映射到登录名。

注意:本地别名alias_maps )只适用于本地(8)收件人。 这与虚拟别名virtual_alias_maps )不同,后者适用于所有收件人: 本地(8) 、虚拟和远程。

默认情况下启用别名查找。 默认配置取决于操作系统环境,但通常是以下配置之一:

/etc/postfix/main.cf:
    alias_maps = hash:/etc/aliases
    alias_maps = dbm:/etc/aliases, nis:mail.aliases

别名数据库文件的路径名由alias_database配置参数控制。 该值取决于系统。 通常为以下值之一:

/etc/postfix/main.cf:
    alias_database = hash:/etc/aliases (4.4BSD, LINUX)
    alias_database = dbm:/etc/aliases (4.3BSD, SYSV<4)
    alias_database = dbm:/etc/mail/aliases (SYSV4)

别名(5)文件可以指定将邮件发送到本地文件,或发送到在标准输入流中接收邮件的命令。 出于安全考虑,向命令和文件目的地发送邮件时,使用的是别名数据库所有者的权限。 在向 "root "所有的别名中的命令或文件传送时,会使用默认用户名default_privs

本地每个用户的 .forward 文件

通过local(8)发送代理发送邮件时,用户可以在其主目录下的 .forward 文件中指定目的地,从而控制自己的邮件发送。 这些文件的语法与本地别名(5)文件相同,只是别名的左侧(查找键和冒号)不存在。

本地通用地址

local(8)发送代理发现收件人不存在时,邮件通常会被退回给发件人("用户未知")。 有时需要将不存在的收件人的邮件转发到另一台机器上。 为此,您可以使用luser_relay配置参数指定一个替代目的地。

另外,也可以使用fallback_transport配置参数,将发送给不存在的收件人的邮件委托给完全不同的邮件传输方式。 有关详情,请参阅local(8)发送代理文档。

注意:如果使用luser_relay功能接收非 UNIX 账户的邮件,则必须指定:

/etc/postfix/main.cf:
    local_recipient_maps =

(即空),否则PostfixSMTP 服务器将以 "本地收件人表中用户未知 "为由拒绝非 UNIX 账户的邮件。 有关详细信息,请参阅LOCAL_RECIPIENT_README文件。

luser_relay可以指定一个地址。 它受"$name "扩展的限制。 例如

[email protected]

在"@other.host "前加上不带地址扩展名的空用户名。 例如,"username+foo "的邮件将发送到 "[email protected]"。

[email protected]

整个原始收件人本地部分,包括地址扩展名,都会被添加到"@other.host "前。 例如,发送给 "username+foo "的邮件会被发送到 "[email protected]"。

sysadmin+$user

不带地址扩展名的裸用户名会附加到 "sysadmin "后面。 例如,"username+foo "的邮件将发送至 "sysadmin+username"。

sysadmin+$local

整个原始收件人本地部分,包括地址扩展名,都会附加到 "sysadmin "上。 例如,发送给 "username+foo "的邮件会被发送到 "sysadmin+username+foo"。

调试地址操作

Postfix 2.1 及更高版本可以生成邮件发送报告,用于调试。 这些报告不仅显示地址重写、别名扩展或转发后的发件人/收件人地址,还显示投递到邮箱、投递到非 Postfix 命令、远程 SMTP 服务器响应等信息。

Postfix 可以生成两种类型的邮件投递报告用于调试:

  • What-if: 报告可能发生的情况,但不实际投递邮件。 要求使用这种操作模式:
  • $ /usr/sbin/sendmail -bv address...
    邮件投递状态报告将发送至 <您的登录名>。
    
  • 发生了什么:发送邮件并报告成功和/或失败,包括来自远程 SMTP 服务器的回复。 请求使用此操作模式:

    $ /usr/sbin/sendmail -v address...
    邮件投递状态报告将发送至 <您的登录名>。
    

这些报告包含 Postfix 发送代理生成的信息。 由于这些代理是作为守护进程运行的,不会直接与用户交互,因此结果会以邮件形式发送给测试邮件的发件人。 这些报告的格式与普通的未投递通知几乎完全相同。

下面是使用 "sendmail -bv [email protected] "命令生成的投递报告。 报告的第一部分包含人类可读文本。 在这种情况下,邮件将通过 mail.cloud9.net 发送,SMTP 服务器回复 "250 OK"。 其他报告可能会显示已投递到邮箱,或已投递到非 Postfix 命令。

Content-Description: Notification
Content-Type: text/plain
This is the mail system at host spike.porcupine.org.
Enclosed is the mail delivery report that you requested.
                        The mail system
<[email protected]>: delivery via mail.cloud9.net[168.100.1.4]: 250 2.1.5 Ok

报告的第二部分采用机器可读形式,包括以下信息:

  • 信封寄件人地址 ([email protected])。
  • 信封收件人地址 ([email protected])。 如果收件人地址被 Postfix 更改,则 Postfix 也会将原始收件人地址包括在内。
  • 投递状态。

某些细节取决于 Postfix 版本。 以下示例适用于 Postfix 2.3 及更高版本。

Content-Description: Delivery report
Content-Type: message/delivery-status
Reporting-MTA: dns; spike.porcupine.org
X-Postfix-Queue-ID: 84863BC0E5
X-Postfix-Sender: rfc822; [email protected]
Arrival-Date: Sun, 26 Nov 2006 17:01:01 -0500 (EST)
Final-Recipient: rfc822; [email protected]
Action: deliverable
Status: 2.1.5
Remote-MTA: dns; mail.cloud9.net
Diagnostic-Code: smtp; 250 2.1.5 Ok

报告的第三部分包含 Postfix 本来会发送的邮件,包括发件人:和收件人:邮件头,这样你就可以看到地址重写对这些邮件的影响。 使用 "sendmail -bv "提交的邮件没有正文内容,因此在下面的示例中没有显示。

Content-Description: Message
Content-Type: message/rfc822
Received: by spike.porcupine.org (Postfix, from userid 1001)
        id 84863BC0E5; Sun, 26 Nov 2006 17:01:01 -0500 (EST)
Subject: probe
To: [email protected]
Message-Id: <[email protected]>
Date: Sun, 26 Nov 2006 17:01:01 -0500 (EST)
From: [email protected] (Wietse Venema)