postfix 官方文档笔记
文章来自
colin 's Blog // 认识常识, 认识人本身的局限, 专注
Home
关于我
Tags
Archives
# postfix 配置参数 [Postfix Configuration Parameters](http://www.postfix.org/postconf.5.html#reject_unauth_destination) # postfix 基础配置 [Postfix Basic Configuration](http://www.postfix.org/BASIC_CONFIGURATION_README.html#syntax) ## Postfix配置文件 默认情况下,Postfix配置文件位于`/etc/postfix`中。两个最重要的文件是`main.cf`和`master.cf` ; 这些文件必须由root拥有。给别人写入`main.cf`或m`aster.cf`(或其父目录)的权限意味着为该人提供root权限。 在`/etc/postfix/main.cf`中,您必须设置最少数量的配置参数。Postfix配置参数类似于shell变量,有两个重要的区别:第一个是Postfix不知道UNIX shell之类的引号。 您将配置参数指定为: /etc/postfix/main.cf: 参数=值 并通过在其名称前面加上“$”字符来使用它: /etc/postfix/main.cf: other_parameter = $参数 您可以在给定值之前使用$参数(这是与UNIX shell变量的第二个主要区别)。Postfix配置语言使用延迟评估,并且在运行时需要之前不会查看参数值。 Postfix使用数据库文件进行访问控制,地址重写和其他目的。该DATABASE_README文件给出了一个介绍后缀如何处理的Berkeley DB,LDAP或SQL等类型。以下是Postfix如何调用数据库的常见示例: /etc/postfix/main.cf: virtual_alias_maps = hash:/etc/postfix/virtual 每当您对main.cf或master.cf文件进行更改时,请以root身份执行以下命令以刷新正在运行的邮件系统: postfix reload ## 在出站邮件中使用什么域名 `myorigin` 参数指定在该服务器投递的邮件的域名。 默认是本地计算机名称 $myhostname。 除非您运行的是非常小的站点,否则您可能希望将其更改为 $mydomain, 默认为本地计算机名称的域名部分。 为了发送方和收件人地址之间的一致性, myorigin还用于附加到 unqualified recipient address 的域名部分。 示例(仅应该指定下列之一): /etc/postfix/main.cf: myorigin = $myhostname (default: send mail as "user@$myhostname") myorigin = $mydomain (probably desirable: "user@$mydomain") ## 接收哪些域名的邮件 mydestination 参数指定哪些域名的邮件投递到本地,而不是转发到另一台机器。默认设置是接收机器本身的邮件。有关如何管理多个邮件域,请参阅VIRTUAL_README文件。 您可以指定0个或多个域名,"/file/name" patterns and/or "type:table" lookup tables,(例如 hash:, btree:, nis:, ldap:, or mysql:), 由空格和/或逗号分隔。 "/file/name" 格式将会使用文件中的内容替换。 重要信息:如果您的计算机是整个域的邮件服务器,必须添加 $mydomain。 Example 1: default setting. /etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain localhost Example 2: domain-wide mail server. /etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain localhost $mydomain Example 3: host with multiple DNS A records. /etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain localhost www.$mydomain ftp.$mydomain 警告:为了避免邮件传递循环,您必须列出计算机的所有主机名,包括 $myhostname, and localhost.$mydomain. ## 中继哪些客户端的邮件 默认情况下, Postfix会将邮件从授权网络中的客户端转发到任何目标。使用 mynetworks 参数定义授权网络。默认设置仅授权本地计算机。在Postfix 3.0之前,默认设置是授权本地计算机所连接的IP子网中的所有客户端。 Postfix也可以配置为授权网络外的“移动”客户端中继邮件。这在SASL_README和TLS_README文档中进行了解释。 重要信息:如果您的计算机已连接到广域网,则您的默认 mynetworks 设置可能过于友好。 示例(仅指定以下之一): Examples (specify only one of the following): /etc/postfix/main.cf: mynetworks_style = subnet (default: authorize subnetworks) mynetworks_style = host (safe: authorize local machine only) mynetworks = 127.0.0.0/8 (safe: authorize local machine only) mynetworks = 127.0.0.0/8 168.100.189.2/32 (authorize local machine) 您可以在main.cf文件中指定可信网络,也可以让Postfix为您完成工作。默认是让Postfix完成工作。结果取决于mynetworks_style 参数值。 当Postfix仅为本地计算机转发邮件时,请指定`mynetworks_style = host`。 当Postfix为与本地计算机相同的IP子网中的SMTP客户端转发邮件时,请指定“ mynetworks_style = subnet”(默认值)。在Linux上,这仅适用于使用“ifconfig”命令指定的接口。 当Postfix从与本地计算机相同的IP类 A/B/C 网络中的SMTP客户端转发邮件时,请指定“ mynetworks_style = class”。不要使用拨号站点执行此操作 - 这将导致Postfix“信任”您的整个提供商的网络。而是手动指定显式的mynetworks列表,如下所述。 或者,您可以手动指定mynetworks列表,在这种情况下,Postfix将忽略mynetworks_style设置。要手动指定可信网络列表,请以CIDR(网络/掩码)表示法指定网络块,例如: /etc/postfix/main.cf: mynetworks = 168.100.189.0/28, 127.0.0.0/8 您还可以指定模式文件的绝对路径名,而不是在main.cf文件中列出模式。 ## 中继邮件到哪些目的地 默认情况下,Postfix仅将邮件转发到授权的远程目标。使用`relay_domains`配置参数定义授权的远程目标。默认设置是使用 mydestination 参数列出的域和他们的子域。 Examples (specify only one of the following): /etc/postfix/main.cf: relay_domains = $mydestination (default) relay_domains = (safe: never forward mail from strangers) relay_domains = $mydomain (forward mail to my domain and subdomains) ## 用什么投递方式:直接或间接 默认情况下,Postfix会尝试将邮件直接通过Internet发送。根据您的情况,这可能是不可行的。例如,您的系统会在办公时间之外关闭,位于防火墙后面,或者可能通过不允许直接邮件发送到Internet的提供商进行连接。在这些情况下,您需要配置Postfix以通过中继主机间接传递邮件。 Examples (specify only one of the following): /etc/postfix/main.cf: relayhost = (default: direct delivery to Internet) relayhost = $mydomain (deliver via local mailhub) relayhost = [mail.$mydomain] (deliver via local mailhub) relayhost = [mail.isp.tld] (deliver via provider mailhub) []符号关闭DNS MX查找 STANDARD_CONFIGURATION_README文件有更多的提示和防火墙保护和/或拨号网络提示。 ## 哪些问题需要报告给 postmaster 您应该在aliases表中设置一个postmaster别名,用于将邮件定向到人。邮局主管地址必须存在,以便人们可以报告邮件传递问题。 /etc/aliases: postmaster: you root: you 修改别名文件后执行 `newaliases`, 你的别名文件可能在其它路径中,使用命令 `postconf alias_maps` 查看 Postfix系统向postmaster别名报告问题。您可能不是对所有类型的故障报告感兴趣,因此该报告机制是可配置的。默认情况下仅向postmaster报告严重问题(资源,软件): Default setting: /etc/postfix/main.cf: notify_classes = resource, software 这意味这这些类型的问题消息被允许发送给postmaster bounce 告知postmaster无法投递的邮件。向postmaster发送一份返回给发件人的无法投递邮件的副本,或者在Postfix拒绝邮件时发送SMTP会话的记录。出于隐私原因,无法传递邮件的邮件主副本将在原始邮件标头之后被截断。 This implies "2bounce" (see below). See also the luser_relay feature. 这个信息将会发送给 bounce_notice_recipient 定义的邮件地址 (default: postmaster). 2bounce 当Postfix无法将无法投递的邮件返回给发件人时,请将其发送给邮件管理员(without truncating the message after the primary headers) 这个信息将发送到 2bounce_notice_recipient 定义的邮件地址 (default: postmaster). delay 通知postmaster延迟邮件。在这种情况下,postmaster仅接收邮件头。通知将发送到使用delay_notice_recipient配置参数指定的地址 (默认值:postmaster)。 policy 通知邮件管理员由于(UCE)策略限制而被拒绝的客户端请求。邮局主管收到SMTP会话的记录。通知将发送到使用error_notice_recipient 配置参数指定的地址(默认值:postmaster)。 protocol 通知postmaster协议错误(客户端或服务器端)或客户端尝试执行未实现的命令。邮局主管收到SMTP会话的记录。通知将发送到使用error_notice_recipient配置参数指定的地址(默认值:postmaster)。 resource 由于资源问题(例如,队列文件写入错误)通知邮件管理员未发送的邮件。通知将发送到使用error_notice_recipient配置参数指定的地址 (默认值:postmaster)。 software 通知邮件管理员由于软件问题而未送达的邮件。通知将发送到使用error_notice_recipient配置参数指定的地址(默认值:postmaster)。 ## 代理/ NAT外部网络地址 某些邮件服务器通过网络地址转换器(NAT)或代理连接到Internet。这意味着Internet上的系统连接到NAT或代理的地址,而不是连接到邮件服务器的网络地址。NAT或代理将连接转发到邮件服务器的网络地址,但Postfix不知道这一点。 如果在代理或NAT后面运行Postfix服务器,则需要配置proxy_interfaces参数并指定Postfix接收邮件的所有外部代理或NAT地址。您可以指定符号主机名而不是网络地址。 重要信息:当系统是其他域的备份MX主机时,必须指定代理/ NAT外部地址,否则主MX主机关闭时将发生邮件传递循环。 Example: host behind NAT box running a backup MX host. /etc/postfix/main.cf: proxy_interfaces = 1.2.3.4 (the proxy/NAT external network address) ## 关于Postfix日志记录您需要了解的内容 Postfix守护程序进程在后台运行,并将问题和正常活动记录到syslog守护程序中。syslogd进程按类和严重性对事件进行排序,并将它们附加到日志文件。日志类,级别和日志文件名通常在/etc/syslog.conf中指定。至少你需要这样的东西: /etc/syslog.conf: mail.err /dev/console mail.debug /var/log/maillog 更改syslog.conf文件后,向syslogd进程发送“HUP”信号。 IMPORTANT: many syslogd implementations will not create files. You must create files before (re)starting syslogd. IMPORTANT: on Linux you need to put a "-" character before the pathname, e.g., -/var/log/maillog, otherwise the syslogd process will use more system resources than Postfix.。 希望邮件系统的问题数量很少,但每天晚上在rotated系统日志文件之前运行下列脚本是个好主意: # postfix check # egrep '(reject|warning|error|fatal|panic):' /some/log/file 第一行(后缀检查)使Postfix报告文件权限/所有权差异。 第二行从邮件软件中查找问题报告,并报告中继和垃圾邮件访问块的有效性。这可能会产生大量的输出。您将需要应用一些后处理来消除不感兴趣的信息。 该DEBUG_README 文件描述了“警告”等标签中记录后缀的含义。 ## 运行Postfix守护程序进程chrooted 可以配置Postfix守护程序进程(通过master.cf 文件)在chroot jail中运行。进程以低权限运行,文件系统访问仅限于Postfix队列目录(/var/spool/postfix)。这提供了防止入侵的重要障碍。屏障不是不可穿透的(chroot仅限制文件系统访问),但每一点点都有帮助。 除了在本地传递邮件和/或执行非Postfix命令的Postfix守护进程之外,每个Postfix守护进程都可以运行chrooted。 具有高安全性要求的站点应考虑chroot与网络通信的所有守护进程:smtp(8)和smtpd(8) 进程,也可能是lmtp(8)客户端。作者自己的porcupine.org邮件服务器运行所有可以chroot chrooted的守护进程。 默认的/etc/postfix/master.cf文件没有指定Postfix守护程序运行chrooted。 要启用chroot操作,请编辑文件/etc/postfix/master.cf,并按照文件中的说明进行操作。完成后,执行“postfix reload”以使更改生效。 请注意,chrooted守护程序会解析相对于Postfix队列目录(/ var / spool / postfix)的所有文件名。为了成功使用chroot jail,大多数UNIX系统都要求您引入一些文件或设备节点。源代码分发中的examples / chroot-setup目录有一组脚本,可帮助您在不同的操作系统上设置Postfix chroot环境。 此外,您几乎肯定需要配置syslogd,以便它侦听Postfix队列目录中的套接字。为特定系统实现此目的的syslogd命令行选项示例: FreeBSD: syslogd -l /var/spool/postfix/var/run/log Linux, OpenBSD: syslogd -a /var/spool/postfix/dev/log ## 我自己的主机名 MYHOSTNAME参数指定运行postfix的系统的计算机的完全限定域名。$myhostname 在许多其他Postfix配置参数中作为为默认值。 默认情况下,myhostname设置为本地计算机名称。如果您的本地计算机名称不是完全限定的域名格式,或者您在虚拟接口上运行Postfix,则必须指定邮件系统应使用的完全限定域名。 或者,如果在main.cf中指定mydomain,则Postfix将使用其值为myhostname参数生成完全限定的默认值。 Examples (specify only one of the following): /etc/postfix/main.cf: myhostname = host.local.domain (machine name is not FQDN) myhostname = host.virtual.domain (virtual interface) myhostname = virtual.domain (virtual interface) ## 我自己的域名 MYDOMAIN 参数指定 $MYHOSTNAME 的域名。默认情况下,它是通过从$myhostname剥离第一部分生成。 相反,如果在main.cf中指定mydomain,则Postfix将使用其为myhostname参数生成完全限定域名。 Examples (specify only one of the following): /etc/postfix/main.cf: mydomain = local.domain mydomain = virtual.domain (virtual interface) ## 我自己的网络地址 inet_interfaces 指定postfix应该监听的网络接口; 发送到"user@[network address]" 的邮件将在本地投递,就好像它发送到$mydestination中列出的域一样。 您可以通过在服务器名称前添加IP地址来覆盖Postfix master.cf文件中的inet_interfaces设置 。 默认设置是侦听所有活动接口。如果在虚拟接口上运行邮件程序,则必须指定要侦听的接口。 重要信息:如果在虚拟接口上运行MTA,则必须为接收机器本身邮件的MTA 指定显式inet_interfaces值:此MTA应该永远不会侦听虚拟接口,否则当虚拟MTA关闭时,您将拥有邮件程序循环。 Example: default setting. /etc/postfix/main.cf: inet_interfaces = all Example: host running one or more virtual mailers. For each Postfix instance, specify only one of the following. /etc/postfix/main.cf: inet_interfaces = virtual.host.tld (virtual Postfix) inet_interfaces = $myhostname localhost... (non-virtual Postfix) # Maildrop ## 介绍 Introduction 本文档讨论了将maildrop传递代理插入Postfix的各种选项: ### 不使用 local delivery agent 直接投递 Direct delivery without the local delivery agent Postfix可以配置为直接将邮件传递给maildrop, 不用 local deivery agent 居中传递。这意味着您不会获得 local aliases 展开或 $HOME/.forward文件处理。 比较典型的情况:你在使用托管域时使用这个功能,它们没有 unix home 目录。 以下示例显示如何对some.domain和someother.domain使用maildrop。该示例分为两部分。 第1部分描述了对main.cf文件的更改: 1 /etc/postfix/main.cf: 2 maildrop_destination_recipient_limit = 1 3 virtual_mailbox_domains = some.domain someother.domain 4 virtual_transport = maildrop 5 virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox 6 virtual_alias_maps = hash:/etc/postfix/virtual_alias 7 8 /etc/postfix/virtual_mailbox: 9 user1@some.domain ...text here does not matter... 10 user2@some.domain ...text here does not matter... 11 user3@someother.domain ...text here does not matter... 12 13 /etc/postfix/virtual_alias: 14 postmaster@some.domain postmaster 15 postmaster@someother.domain postmaster 需要第2行,以便Postfix一次向maildrop传递代理提供一个收件人。 第3行通知Postfix some.domain和someother.domain是所谓的虚拟邮箱域。 第4行指定some.domain和someother.domain的邮件应由maildrop传递代理传递。 第5行和第8-11行指定Postfix SMTP服务器应接收邮件的收件人地址。 第6行和第13-15行将postmaster的邮件重定向到 local postmaster。 下面使用的vmail用户标识是maildrop应该运行的用户,如果虚拟邮箱都拥有相同的所有者,则它应该虚拟邮箱的所有者。如果maildrop是suid(请参阅maildrop文档),那么maildrop将更改为相应的所有者以传递邮件。 注意:不要将postfix 用户作为 maildrop 运行的用户。 第2部分介绍了对master.cf文件的更改: /etc/postfix/master.cf: maildrop unix - n n - - pipe flags=ODRhu user=vmail argv=/path/to/maildrop -d ${recipient} pipe(8)手册页提供了上述命令行参数的详细说明等。 如果要支持用户+扩展名@域样式地址,请改用以下内容: /etc/postfix/master.cf: maildrop unix - n n - - pipe flags=ODRhu user=vmail argv=/path/to/maildrop -d ${user}@${domain} ${extension} ${recipient} ${user} ${nexthop} ## 通过本地代理间接调用 maildrop Indirect delivery via the local delivery agent 可以将Postfix配置为通过本地传递代理将邮件传递到maildrop。这比上面讨论的“直接”方法效率略低,但是为您提供了本地别名(5)扩展和$ HOME / .forward文件处理的便利。您通常会将此用于mydestination中列出的域以及具有UNIX系统帐户的用户。 要为所有UNIX系统帐户配置maildrop交付: /etc/postfix/main.cf: mailbox_command = /path/to/maildrop -d ${USER} 注意:$ {USER}拼写为大写。 仅为特定用户启用 maildrop 投递代理,您可以使loal delivery proxy 的 mailbox_command_maps 特性: /etc/postfix/main.cf: mailbox_command_maps = hash:/etc/postfix/mailbox_commands /etc/postfix/mailbox_commands: you /path/to/maildrop -d ${USER} # Postfix SASL Howto [Postfix SASL Howto](http://www.postfix.org/SASL_README.html#server_sasl) ## Postfix 如何使用 SASL 认证 How Postfix uses SASL authentication smtp 服务器需要决定哪个smtp客户端可以合法的发送邮件到外部地址, 或者仅能发送邮件到服务器本身管理的域。通常,当客户端的IP地址与服务器的IP地址位于“相同网络”时,SMTP服务器允许邮件转发到外部地址。 smtp客户端在外部网络时,需要一种方法获得`same network`权限. 为了满足这种需求,Postfix支持SASL身份验证(RFC 4954, formerly RFC 2554). 有了这个,SMTP服务器可以对远程Postfix SMTP客户端进行身份验证,同时postfix smtp 客户端也可以向远程smtp服务端进行认证。一旦客户端认证成功,服务端就会给它`same network`权限。 potfix 不实现sasl本身,而是使用一个现有的sasl实现作为构件块。这意味这postfix有一些sasl相关的配置文件,postfix 将使用特点sasl实现的配置文件。 这个文档将覆盖两种情况postfix/non-postfix配置文件。 NOTE: 人们不怕麻烦的安装postfix系统,是期望它能比其他邮件系统更安全。 Cyrus SASL library 包含很多相关的代码。有了这个,postfix 成为了和其它使用Cyrus SASL library一样安全的邮件系统。Dovecot 也提供了一个值得考虑的替代方案。 ## 在postfix smtp服务器中配置 SASL 认证 Configuring SASL authentication in the Postfix SMTP server 如前面提到的,SASL的实现是和postfix分开的。因为这个原因配置postfix smtp 服务需要两个步骤。 - 配置 SASL 实现提供一系列适用于SASL认证的验证机制, 这取决于所使用的SASL实现,配置认证后端,根据系统密码文件/某些数据库认证smtp客户端。 - 配置Postfix SMTP服务器以启用SASL身份验证, 以及授权认证客户端可发送邮件到外部域和发件人地址必须和认证用户名一致。 Postfix SMTP服务器要成功实现身份验证需要一个功能性SASL框架。因此,在配置Postfix之前,配置SASL应始终是第一步。 ### postfix 支持哪些 SASL 实现 Which SASL Implementations are supported? 目前postfix smtp server 支持 Cyrus SASL 和 Dovecot SASL Note: 当前postfix版本有个插件机制可以支持多种SASL实现. postfix2.3之前只支持 Cyrus SASL 可以通过下列命令查看哪些SASL实现编译进了postifx postconf -a (SASL support in the SMTP server) postconf -A (SASL support in the SMTP+LMTP client) ### 配置 Dovecot SASL Configuring Dovecot SASL Dovecot 是一个pop/imap server, 它有自己的配置来认证pop/imap客户端. 当 postfix 使用dovecot sasl, 它可以共用这部分配置。 #### Postfix 和 Dovecot SASL 通信 Postfix to Dovecot SASL communication postfix smtp server 和 dovecot SASL 可以通过一个 unix-domain soket / tcp socket。 使用unix-domain socket 具有更好的私密性。 下面 dovecot2 的配置文件假设 postfix queue 位于 /var/spool/postfix 1 conf.d/10-master.conf: 2 service auth { 3 ... 4 unix_listener /var/spool/postfix/private/auth { 5 mode = 0660 6 # Assuming the default Postfix user and group 7 user = postfix 8 group = postfix 9 } 10 ... 11 } 12 13 conf.d/10-auth.conf 14 auth_mechanisms = plain login 第 4 行指定 doveoct sasl socket 在 /var/spool/postfix/private/auth 第 5-8行限制只有 postfix 用户和组可以读写这个socket 第 14 行指定为 postfix smtp server 提供 `plain` 和 `login` 认证机制 ### 配置 Cyrus SASL Configuring Cyrus SASL 注: 我对 Cyrux sasl 不敢兴趣,我打算直接使用 dovecot sasl #### Cyrus SASL 配置文件名称 Cyrus SASL configuration file name #### Cyrus SASL 配置文件位置 Cyrus SASL configuration file location #### Cyrus SASL 配置文件通信 Postfix to Cyrus SASL communication ### 在Postfix SMTP服务器中启用SASL身份验证和授权 Enabling SASL authentication and authorization in the Postfix SMTP server 默认 postfix smtp server 使用cyrus sasl 实现,如果 dovecot sasl 实现可用,指定配置项 `smtpd_sasl_type` 的值为 dovecot 代替 cyrus /etc/postfix/main.cf: smtpd_sasl_type = dovecot 另外指定Postfix SMTP服务器如何找到Dovecot身份验证服务器。 具体的接口文件文件要看 dovecot 的配置。 如果你配置 doveoct 使用 unix-domain socket, postfix 类似下方配置: /etc/postfix/main.cf: smtpd_sasl_path = private/auth Note: 这里的例子使用相对于 postifx queue direcotry 的相对路径,所以无论postfix是否允许在 chrooted 模型都可以正常工作。 如果你配置 dovecot 使用 tcp socket 通讯, postfix 类似下方配置: /etc/postfix/main.cf: smtpd_sasl_path = inet:127.0.0.1:12345 Note: 如果你指定一个远程地址, 信息将会在网络上明文发送。 #### 在Postfix SMTP服务器中启用SASL身份验证 Enabling SASL authentication in the Postfix SMTP server 无论哪种SASL实现, 在 postfix smtp server 启用 smtp 认证总是需要 smtpd_sasl_auth_enable 选项 /etc/postfix/main.cf: smtpd_sasl_auth_enable = yes 在执行 `postfix reload` 后, smtp 客户端在 smtp sesson 中将看到多出来的认证功能, 然后是一个服务器支持的认证机制列表 % telnet server.example.com 25 ... 220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 ... 但是,并非所有客户端都能识别RFC中定义的AUTH功能,一些历史实现期望服务器在AUTH动词和其后面的机制列表之间发送“=”作为分隔符。 `broken_sasl_auth_clients` 配置项让 postfix 用这些broken client可以理解的方式重复一遍 auth 语句。 /etc/postfix/main.cf: broken_sasl_auth_clients = yes Note: 为 outlook 2003, outlook express 6 以及以下,启用这个选项。 这个选项不会干扰到其它客户端。 在执行 `postfix reload` 后, smtp 服务器将会声明 auth 命令两次 % telnet server.example.com 25 ... 220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250-AUTH=DIGEST-MD5 PLAIN CRAM-MD5 #### Postfix SMTP服务器策略 - SASL机制属性 Postfix SMTP Server policy - SASL mechanism properties Postfix SMTP服务器支持限制其为客户端提供的SASL机制的策略,基于这些机制的属性。接下来的两节提供了如何使用这些策略的示例。 - property - noanonymous 不要使用允许匿名身份验证的机制。 - noplaintext 不要使用传输未加密的用户名和密码信息的机制。 - nodictionary 不要使用易受字典攻击的机制。 - forward_secrecy 在会话之间需要保密(打破一个会话不会破坏早期会话) - mutual_auth 仅使用对客户端和服务器进行相互身份验证的机制。 ##### 未加密的SMTP会话 Unencrypted SMTP session 默认策略是允许Postfix SMTP服务器中的任何机制,但基于匿名身份验证的机制除外 /etc/postfix/main.cf: # Specify a list of properties separated by comma or whitespace smtpd_sasl_security_options = noanonymous Important: 始终至少设置noanonymous选项。否则,Postfix SMTP服务器可以为陌生人提供与经过适当身份验证的客户端相同的授权。 ##### 已加密的SMTP会话(TLS) 在 tls-encrypted smtp session 期间, 一个单独的参数控制 postfix sasl mechanism policy. 这个参数只用于 tls-encrypted smtp session /etc/postfix/main.cf: smtpd_sasl_tls_security_options = $smtpd_sasl_security_options 一个更复杂的例子,只在 tls-encrypted smtp session 中允许 plaintext mechanisms /etc/postfix/main.cf: smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous 仅在 tls-encrypted smtp session 中提供SASL身份验证 /etc/postfix/main.cf: smtpd_tls_auth_only = yes #### 在Postfix SMTP服务器中启用SASL授权 Enabling SASL authorization in the Postfix SMTP server 当 smtp client 通过sasl 认证后, smtp server 可决定授权给客户端某个权限,可能的例子如下: - 发送邮件到外部收件人 - 在 mail from 中必须使用指定的发件人 默认情况下不启用这些权限。 ##### 邮件中继授权 Mail relay authorization 使用 permit_sasl_authenticated,Postfix SMTP服务器可以允许SASL验证的SMTP客户端将邮件发送到远程目标。例子: # With Postfix 2.10 and later, the mail relay policy is # preferably specified under smtpd_relay_restrictions. /etc/postfix/main.cf: smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination reject_unauth_destination 除非满足下列条件之一,否则拒绝请求: - postfix 是中继服务器: RCPT TO 的域名匹配 $relay_domains 或者它们的子域。 并且不包含发件人指定的路由 (user@elsewhere@domain) - postfix 是 final destination: RCPT TO 的域名匹配 $mydestination, $inet_interfaces, $proxy_interfaces, $virtual_alias_domains, or $virtual_mailbox_domains 并且不包含发件人指定的路由 (user@elsewhere@domain) `relay_domains_reject_code` 参数指定拒绝请求的响应代码 (default: 554). ##### 信封发件人地址授权 Envelope sender address authorization 默认情况下,SMTP客户端可以在MAIL FROM命令中指定任何信封发件人地址。这是因为Postfix SMTP服务器只知道远程SMTP客户端主机名和IP地址,但不指定控制远程SMTP客户端的用户是谁。 改变发生在 smtp client 使用sasl认证时,现在Postfix SMTP服务器知道发件人是谁。指定一个包含 sender address 和 sasl login name 的表,Postfix SMTP服务器可以决定是否允许SASL身份验证的客户端使用特定的信封发件人地址: /etc/postfix/main.cf: smtpd_sender_login_maps = hash:/etc/postfix/controlled_envelope_senders smtpd_recipient_restrictions = ... reject_sender_login_mismatch permit_sasl_authenticated controlled_envelope_senders表指定 sender address 和 sasl login name 之间的绑定: /etc/postfix/controlled_envelope_senders # envelope sender owners (SASL login names) john@example.com john@example.com helpdesk@example.com john@example.com, mary@example.com postmaster admin@example.com @example.net barney, fred, john@example.com, mary@example.com reject_sender_login_mismatch 当 smtp 客户端 MAIL FROM 指定 sender address,但SASL认证登录的用户名不是sender address的 owner (由 smtpd_sender_login_maps 参数定义)时拒绝客户端请求。 或者客户端已经登录但用户名没有对应的 sender address (由 smtpd_sender_login_maps 参数定义) 拒绝客户端请求。 reject_authenticated_sender_login_mismatch 仅对经过身份验证的客户端强制执行reject_sender_login_mismatch限制。 Postfix版本2.1及更高版本中提供此功能。 reject_known_sender_login_mismatch 将reject_sender_login_mismatch限制仅应用于$ smtpd_sender_login_maps中已知的MAIL FROM地址。 Postfix版本2.11及更高版本中提供此功能 reject_unauthenticated_sender_login_mismatch 仅对未经身份验证的客户端强制执行reject_sender_login_mismatch限制。 Postfix版本2.1及更高版本中提供此功能。 #### 其他SMTP服务器SASL选项 Additional SMTP Server SASL options Postfix提供了广泛的SASL身份验证配置选项。下一节列出了一些经常讨论的内容。有关完整列表,请参阅postconf(5)。 ##### 基于账号的访问控制 Per-account access control Postfix可以实现依赖于SASL登录名的策略(Postfix 2.11和更高版本)。通常,这用于 hold 或 reject 来自其凭据已被泄露的帐户的邮件。 /etc/postfix/main.cf: smtpd_recipient_restrictions = permit_mynetworks check_sasl_access hash:/etc/postfix/sasl_access permit_sasl_authenticated ... /etc/postfix/sasl_access: # Use this when smtpd_sasl_local_domain is empty. username HOLD # Use this when smtpd_sasl_local_domain=example.com. username@example.com HOLD ##### 默认认证域名 Default authentication domain Postfix可以将域名(或任何其他字符串)附加到没有域部分的SASL登录名,例如将“john”修改为“john@example.com”: /etc/postfix/main.cf: smtpd_sasl_local_domain = example.com ##### 在指定网络隐藏 SASL认证 Hiding SASL authentication from clients or networks 有些smtp client坚持使用SASL身份验证(即使它们未配置为send credentials),所以它们将始终失败并断开连接。 Postfix可以隐藏这些客户端/网络的AUTH功能: /etc/postfix/main.cf: smtpd_sasl_exceptions_networks = !192.0.2.171/32, 192.0.2.0/24 ##### 将SASL登录名添加到mail headers Adding the SASL login name to mail headers 要在Received:message标头(Postfix版本2.3及更高版本)中报告SASL登录名: /etc/postfix/main.cf: smtpd_sasl_authenticated_header = yes ### 在Postfix SMTP服务器中测试SASL身份验证 Testing SASL authentication in the Postfix SMTP server 要测试服务器端,请将(例如,使用telnet)连接到Postfix SMTP服务器端口,您应该能够进行如下所示的对话。客户端(即您)发送的信息以粗体显示。 % telnet server.example.com 25 ... 220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME AUTH PLAIN AHRlc3QAdGVzdHBhc3M= 235 Authentication successful 要通过使用TLS加密的连接对此进行测试,请使用openssl s_client而不是telnet: % openssl s_client -connect server.example.com:25 -starttls smtp ... 220 server.example.com ESMTP Postfix EHLO client.example.com ...see above example for more... 而不是AHRlc3QAdGVzdHBhc3M =,指定\ 0username \ 0password的base64编码形式(\ 0是空字节)。上面的例子是一个名为`test'的用户,密码为`testpass'。 您可以使用以下命令之一生成base64编码的身份验证信息: bash echo -ne '\000username\000password' | openssl base64 printf printf '\0%s\0%s' 'username' 'password' | openssl base64 ## 在Postfix SMTP / LMTP客户端中配置SASL身份验证 Configuring SASL authentication in the Postfix SMTP/LMTP client ### 在Postfix SMTP / LMTP客户端中启用SASL身份验证 Enabling SASL authentication in the Postfix SMTP/LMTP client 本节显示了Postfix SMTP客户端通过需要SASL身份验证的邮件网关服务器发送所有邮件的典型方案。 解决问题的提示: - 如果您的SASL登录失败并且邮件日志文件中出现“SASL身份验证失败:找不到任何值得的机制”,请参阅“Postfix SMTP / LMTP客户端策略 - SASL机制属性”部分。 - 有关更为模糊的SASL身份验证失败类别的解决方案,请参阅“Postfix SMTP / LMTP客户端策略 - SASL机制名称”。 为了使示例更具可读性,我们将其分为两部分。第一部分负责基本配置,第二部分设置用户名/密码信息。 /etc/postfix/main.cf: smtp_sasl_auth_enable = yes smtp_tls_security_level = encrypt smtp_sasl_tls_security_options = noanonymous relayhost = [mail.isp.example] # Alternative form: # relayhost = [mail.isp.example]:submission smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_auth_enable 启用客户端身份验证。我们将在示例的第二部分中配置客户端的用户名和密码信息。 smtp_tls_security_level 确保与远程smtp服务器的连接将被加密,smtp_sasl_tls_security_options删除了对明文密码的禁止。 relayhost 强制Postfix SMTP将所有远程邮件发送到指定的邮件服务器,而不是尝试将它们直接发送到目标。 在relayhost设置中,“[”和“]”阻止Postfix SMTP客户端查找附带名称的MX(邮件交换器)记录。 中继主机目的地还可以指定非默认TCP端口。例如,替代形式[mail.isp.example]:submission告诉Postfix连接到TCP网络端口587,它是为电子邮件客户端应用程序保留的。 Postfix SMTP客户端与使用非标准“AUTH = method ....”语法的SMTP服务器兼容,以响应EHLO命令;这不需要额外的Postfix客户端配置。 Postfix SMTP客户端不支持过时的“wrappermode”协议,该协议使用SMTP服务器上的TCP端口465。有关使用stunnel命令的解决方案,请参阅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 Important: 将SASL客户端密码文件保留在/ etc / postfix中,并使该文件只读为root用户,以保护用户名/密码组合免受其他用户的攻击。Postfix SMTP客户端仍然可以读取SASL客户端密码。它在删除权限之前以及在进入可选的chroot jail之前以root用户身份打开文件。 每当更改`/etc/postfix/sasl_passwd`文件时,请使用`postmap`命令。 如果在relayhost目标中指定“[”和“]”,则必须在smtp_sasl_password_maps文件中使用相同的格式。 如果在relayhost目标中指定了非默认TCP端口(例如“:submission”或“:587”),则必须在smtp_sasl_password_maps文件中使用相同的格式。 ### 配置依赖于发送方的SASL身份验证 Configuring sender-dependent SASL authentication Postfix支持为不同的发件人地址(版本2.3及更高版本)使用不同的ISP帐户。当一个人使用同一台机器进行工作和个人使用时,这可能很有用,或者当具有不同ISP帐户的人共享相同的Postfix服务器时。 为了实现这一点,Postfix支持每个发件人SASL密码和每个发件人中继主机。在下面的例子中Postfix SMTP客户端将按发件人地址搜索SASL password file ,然后按目标destination。同样,Postfix trivial-rewrite(8)守护程序将搜索每个发件人的relayhost文件,并仅使用默认的relayhost设置作为最后的手段。 /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 username1:password1 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”。 ### Postfix SMTP / LMTP客户端策略 - SASL机制属性 Postfix SMTP/LMTP client policy - SASL mechanism properties 与Postfix SMTP服务器一样,SMTP客户端具有一个策略,可根据其属性确定哪些SASL机制是可接受的。接下来的两节提供了如何使用这些策略的示例。 - property - noanonymous 不要使用允许匿名身份验证的机制。 - noplaintext 不要使用传输未加密的用户名和密码信息的机制。 - nodictionary 不要使用易受字典攻击的机制。 - forward_secrecy 在会话之间需要保密(打破一个会话不会破坏早期会话) - mutual_auth 仅使用对客户端和服务器进行相互身份验证的机制。 ##### 未加密的SMTP会话 Unencrypted SMTP session 默认策略比Postfix SMTP服务器更严格 - 不允许使用纯文本机制(也不允许任何匿名机制): /etc/postfix/main.cf: smtp_sasl_security_options = noplaintext, noanonymous 如果远程服务器仅提供明文身份验证机制(SMTP服务器声明“AUTH PLAIN LOGIN”),则此默认策略(不允许使用明文密码)会导致身份验证失败。在这种情况下,SMTP客户端将记录以下错误消息: SASL authentication failure: No worthy mechs found Note: 如果未在/ usr / lib / sasl2目录中安装libplain.so或liblogin.so模块,也会记录此相同的错误消息。 更安全的方法是使用TLS会话加密来保护明文用户名和密码。要确定远程SMTP服务器是否支持TLS,请连接到服务器并查看它是否宣布STARTTLS支持,如示例所示。客户端(即您)发送的信息以粗体显示。 % telnet server.example.com 25 ... 220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-STARTTLS ##### 已加密的SMTP会话(TLS) 要在Postfix SMTP客户端中打开TLS,请参阅TLS_README以获取配置详细信息。 smtp_sasl_tls_security_options参数在TLS加密的SMTP会话期间控制Postfix SASL机制策略。默认设置是从未加密的会话中复制设置: /etc/postfix/main.cf: smtp_sasl_tls_security_options = $smtp_sasl_security_options 一个更复杂的例子,只在 tls-encrypted smtp session 中允许 plaintext mechanisms /etc/postfix/main.cf: smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous 仅在 tls-encrypted smtp session 中提供SASL身份验证 /etc/postfix/main.cf: smtpd_tls_auth_only = yes ### Postfix SMTP / LMTP客户端策略 - SASL机制名称 Postfix SMTP/LMTP client policy - SASL mechanism names 鉴于上一节的SASL安全选项,Cyrus SASL库将选择SMTP客户端和服务器实现的最安全的身份验证机制。遗憾的是,该身份验证机制可能会失败,因为客户端或服务器未配置为使用该机制。 为了防止这种情况,Postfix SMTP客户端可以从远程SMTP服务器过滤身份验证机制的名称。如果使用正确,过滤器会隐藏Cyrus SASL库中不需要的机制,迫使库从Postfix SMTP客户端过滤器通过的机制中进行选择。 以下示例过滤除了PLAIN和LOGIN机制之外的所有内容: /etc/postfix/main.cf: smtp_sasl_mechanism_filter = plain, login ## 编译 Postfix 添加 SASL 支持 Building Postfix with SASL support # HEADER_CHECKS [HEADER_CHECKS](http://www.postfix.org/header_checks.5.html) Postfix内置内容检查 ## 概要 header_checks = pcre:/etc/postfix/header_checks mime_header_checks = pcre:/etc/postfix/mime_header_checks nested_header_checks = pcre:/etc/postfix/nested_header_checks body_checks = pcre:/etc/postfix/body_checks milter_header_checks = pcre:/etc/postfix/milter_header_checks smtp_header_checks = pcre:/etc/postfix/smtp_header_checks smtp_mime_header_checks = pcre:/etc/postfix/smtp_mime_header_checks smtp_nested_header_checks = pcre:/etc/postfix/smtp_nested_header_checks smtp_body_checks = pcre:/etc/postfix/smtp_body_checks postmap -q "string" pcre:/etc/postfix/filename postmap -q - pcre:/etc/postfix/filename <inputfile ## 描述 本文档描述了基于邮件头和邮件正文行内容的访问控制; 它在邮件进入队列之前由 postfix cleanup 实现 每一行message header / message body 通过和一个 pattern 列表比对。匹配成功就执行对应的动作,然后再对下一行重复匹配 pattern 列表。 Message Header 一次检查一个逻辑头,即使消息头跨越多行也是如此。 body line 总是一次检查一行。 Postfix标头或body_checks旨在阻止来自蠕虫或病毒的大量邮件; 它们不解码附件,也不解压缩档案。 如果需要更复杂的内容分析,请参阅下面“自述文件”部分中引用的文档。 ## 行为 ACTIONS 行为的名称不区分大小写,为了和其它postfix文档保持一致性。统一大写 BCC user@domain 抄送邮件到指定地址。 如果收件人不存在,不会通知发件人。 这个特性 需要 postfix >= 3.0 不支持 smtp heaer/body checks DISCARD optional text... 声明投递成功,并默默丢弃邮件。 如果指定了 optional text 就把它写入到日志。 不过不指定就写入要给常规日志。 这个特性 需要 postfix >= 2.0 不支持 smtp heaer/body checks DUNNO 假装这一行不匹配所有规则,跳过当前行。 进入下一行的检查 这个特性 需要 postfix >= 2.1 不支持 smtp heaer/body checks FILTER transport:destination 覆盖 content_filter 设置, 进入下一行的检查. 邮件进入queue后,使用这里指定的 mda 处理 这个特性 需要 postfix >= 2.0 不支持 smtp heaer/body checks HOLD optional text... 指定邮件放入到 hold queue。进入下一行的检查。 邮件会在 hold queue 直到删除或重新投递。 如果指定了 optional text 就把它写入到日志。 不过不指定就写入要给常规日志。 这个特性 需要 postfix >= 2.0 不支持 smtp heaer/body checks INGNORE 删除当前行,进入下一行的检查。 INFO optional text... 如果指定了 optional text 就把它以info: 开头写入到日志。 不过不指定就写入要给常规日志。 一般用于例行记录或调试。 这个特性 需要 postfix >= 2.0 PASS optional text... 如果指定了 optional text 就把它以pass: 开头写入到日志。 不过不指定就写入要给常规日志。 跳过剩余行的检测 这个特性 需要 postfix >= 3.2 不支持 smtp heaer/body checks PREPEND text... 在当前行前面添加一行, 进入下一行的检查。 This feature is available in Postfix 2.1 and later. This feature is not supported with milter_header_checks. REDIRECT user@domain 把邮件重定向到指定用户,进入下一行的检查。 如果匹配多个 REDIRECT, 最后一个生效。 This feature is available in Postfix 2.1 and later. This feature is not supported with smtp header/body checks. REPLACE text... 替换当前行,进入下一行的检查。 Postfix >= 2.2.2 REJECT optional text... 拒绝整封邮件,不检查剩下的行。 如果指定了 option text,会返回给客户端 STRIP optional text... 删除当前行,以格式 strip: [optional text]/[generic text] 记录消息到日志。 如果需要默默的删除行,见 IGNORE WARN optional text... 以格式 warning: [optional text]/[generic text] 记录消息到日志。 用于调试 pattern 能否正常匹配 # postmap Postfix lookup table 管理 ## 概要 SYNOPSIS postmap [-bfFhimnNoprsuUvw] [-c config_dir] [-d key] [-q key] [file_type:]file_name ... ## 描述 DESCRIPTION postmap 创建或查询一个或多个Postfix查找表,或更新现有表。 如果结果表不存在则使用相同的 group 创建,其它的读权限和源文件一致。 当进程在更新表时,信号传递会被推迟,一个排他锁放置在这个表上。以避免观察者进程出现意外。 ## 输入文件格式 INPUT FILE FORMAT lookup table 输入文件的格式如下: - 表条目的格式 - `key value` 中间空格分隔 - 空行,以 # 开头的行被忽略 - 逻辑行以非空白文本开头。行从空格表示时前一个逻辑行的续行。 key 和 value 前后的空白字符会被去除, postfix >=3.2 支持 key 中有空白字符 When the -F option is given, the value must specify one or more file- names separated by comma and/or whitespace; postmap(1) will concatenate the file content (with a newline character inserted between files) and will store the base64-encoded result instead of the value. 当 key 指定电子邮件地址信息时,localpart 按 RFC 5322要求,如果需要时要用双引号括起来。例如, 地址包含“;”的localpart,或者以"."开始或结束的localpart 注意 邮件地址包含两个部分 localpart domain, 例如 tina@example.com: - localpart: tina - domain: example.com 默认, lookup table 的 key 不区分大小写(转换为小写); postfix 2.3 开始这种转换只会发生在固定大小写的 lookup table 类型,例如: btree, dbm, hash。 postfix 2.3 之前的版本哪怕查询表支持匹配大小写也会强制转换小写,例如: regexp, pcre . 这导致的结果是会丢失 $number 子匹配 ## 命令行参数 COMMAND-LINE ARGUMENTS -q key 使用 key 查找指定的 map postmap hash:/etc/mail/access # 重建hash表: # pipe Postfix传递到外部命令 ## 概要 synopsis pipe [generic Postfix daemon options] command_attributes... ## 描述 DESCRIPTION pipe(8)守护进程处理来自Postfix队列管理器的请求,将消息传递给外部命令。pipe 进程本身由 master dameon 调用。 邮件属性,如发件人地址,收件人地址和下一跳的主机名指定可以指定为命令行宏,在执行外部命令之前被展开 pipe(8)守护程序更新队列文件并将收件人标记为finished,或者它通知队列管理器应该再尝试传递一次。投递状态根据情况发送到 bounce, defer, trace 进程 ## 每次投递一个收件人 SINGLE-RECIPIENT DELIVERY 某些目标一次只能处理一个收件人, 例如: 传真机。另外再邮件消息头前添加 Delivered-to: or X-Original-To: 时不希望一次投递多个收件人 要设置postfix一次只投递一个收件人时: transport_destination_recipient_limit = 1 ## 命令属性语法 COMMAND ATTRIBUTE SYNTAX 外部命令属性在服务定义末尾的master.cf文件中给出。 语法如下: chroot=pathname (optional) 修改进程的 root dir 和 work dir 到指定目录。该行为在切换执行权限到 user 参数指定的用户,执行 directory=pathname 之前。如果切换目录失败,邮件投递会被 deferred directory=pathname (optional) 修改进程的 work dir 到指定目录。该行为在执行外部命令前执行。这个目录对 user 参数指定的用户必须有权限访问。默认工作目录是 $queue_direcotry。如果切换目录失败,邮件投递会被 deferred eol=string (optional, default: \n) 输出记录的分界符。典型的情况例如使用 `\r\n` 或 `\n` flags=BDFORXhqu.> (optional) 可选的消息处理标志. 默认是 copy unchanged B 在每封邮件的末尾添加一个空行。 某些邮件用户代理只有在以空行开头时才识别“From ”行,这是必需的。 D 在信封收件人地址前面添加“Delivered-To: recipient”邮件标头。 注意:为此,transport_destination_recipient_limit必须为1(有关详细信息,请参阅上面的SINGLE-RECIPIENT DELIVERY)。 D标志还强制执行循环检测(Postfix 2.5及更高版本):如果邮件已包含具有相同收件人地址的Delivered-To:标头,则邮件将返回为无法传递。 地址比较不区分大小写。 F 将“From sender time_stamp”信封标头添加到邮件内容中。 有些软件期望有这个邮件头,例如UUCP。 O 在前面添加“X-Original-To:收件人”邮件头,其中包含Postfix的收件人地址。 注意:为此,transport_destination_recipient_limit必须为1(有关详细信息,请参阅上面的SINGLE-RECIPIENT DELIVERY)。 X-Original-To: 原始收件人 R 使用信封发件人地址添加一个Return-Path:邮件头。 X 表示当前外部命令执行最终交付。 此标志会影响“success”DSN(投递状态通知)消息中报告的状态,并将其从“relayed”更改为“delivered”。 h 将命令行$original_recipient和$recipient地址域部分(最右边的@字符右侧的文本)格式化为小写; 将整个命令行$domain和$nexthop主机或域信息格式化为小写。 通过UUCP交付时建议设置。 q 根据RFC 822的8-bit transparent version,在命令行$sender,$original_recipient和$recipient address localparts(最右边@字符左侧的文本)中用引号包裹空格和其他特殊字符。通过UUCP或BSMTP投递时,建议。 结果与Postfix sendmail(1)邮件子任务命令对命令行收件人的地址解析兼容。 q标志仅影响整个地址,而不影响来自$user,$extension或$mail-box命令行宏的部分地址信息。 u 将命令行$ original_recipient和$ recipient address localpart(最右边@字符左侧的文本)格式化为小写。 通过UUCP进行投递时建议。 . 在以"."开头的行前添加一个"."。 例如,BSMTP软件需要这样做。 > 将“>”添加到以“From”开头的行。 这是 uucp 期望的格式。 null_sender=replacement (default: MAILER-DAEMON) 当展开 $sender 命令行宏,或生成 From_ / Return-Path: 消息头时,如果发件人地址为空,就使用这里定义的邮件地址。 size=size_limit (optional) 不要传递超过此大小限制的消息(以字节为单位); 将它们返回给发件人。 user=username (required) user=username:groupname 使用指定用户名的用户标识和组标识执行外部命令。 该软件拒绝使用root权限或使用邮件系统所有者的权限执行命令。 如果指定了groupname,则使用相应的组ID而不是username的组ID。 argv=command... (required) 要执行的命令。 必须将其指定为最后一个命令属性。 该命令直接执行,即没有shell命令解释器对shell元字符的解释。 在包含空格的命令参数(Postfix 3.0及更高版本)周围指定“{”和“}”。 打开“{”之后和关闭之前的空格“}”将被忽略。 在命令参数向量中,可以识别以下宏,并将其替换为队列管理器传递请求中的相应信息。 除了格式${name}之外,还可以识别格式$name和不推荐使用的格式$(name)。 如果需要 $ 符号,要用 $$。 ${client_address} 远程客户端地址 ${client_helo} 远程客户端 helo 命令的参数 ${client_hostname} 远程客户端主机名 ${client_port} 远程客户端端口号 ${client_protocol} 远程客户端协议 ${domain} 收件人地址的域部分。 例如,对于地址user+foo@domain,域部分是 domain。 ${extension} 收件人地址的 extension 部分。 例如,对于地址user+foo@domain,extension为foo。 ${mailbox} This macro expands to the complete local part of a recip- ient address. For example, with an address user+foo@domain the mailbox is user+foo. 收件人地址的 localpart 部分, 例如, 对于地址 user+foo@domain。 localpart 是 user+foo ${nexthop} next-hop 主机名. ${original_recipient} 在地址重写或别名展开前的完整收件人地址。 ${queue_id} queue id. ${recipient} 完整收件人地址 ${sasl_method} 当Postfix SMTP服务器收到消息时,此宏将扩展为AUTH命令中SASL身份验证机制的名称。 ${sasl_sender} 当Postfix SMTP服务器收到消息时,此宏扩展为MAIL FROM命令中的SASL发送者名称(即根据RFC 4954的原始提交者)。 ${sasl_username} 当Postfix SMTP服务器收到消息时,此宏将扩展为AUTH命令中的SASL用户名。 从Postfix 2.2开始提供此功能。 ${sender} 此宏扩展为信封发件人地址。 默认情况下,空发送方地址扩展为MAILER-DAE-MON; 如上所述,这可以使用null_sender属性进行更改。 ${size} postfix 记录的邮件大小, 将要投递邮件的近似值 ${user} 此宏扩展为收件人地址的用户名部分。 例如,使用地址user + foo @ domain,用户名部分是user。 ## 资源和速度控制 RESOURCE AND RATE CONTROLS transport_time_limit ($command_time_limit) 为特定的 transport 覆盖 command_time_limit 参数的设定。 transport 指 master.cf 中指定的投递代理服务名称 transport_destination_concurrency_limit ($default_destination_concurrency_limit) 为特定的 transport 覆盖 default_destination_concurrency_limit 参数的设定。 transport 要指定为 master.cf 中指定的投递代理服务名称 transport_destination_recipient_limit ($default_destination_recipient_limit) 为特定的 transport 覆盖 default_destination_concurrency_limit 参数的设定。 transport 要指定为 master.cf 中指定的投递代理服务名称 # master.cf  postfix 的所有服务器程序都由 master daemon 在需要时启动。 文件格式: # 表示注释 空白开始的行表示续行 字段: service name: 服务名称, 命名规则得看第二个字段来定。 type: 服务的通讯方式: inet, unix, fifo inet net socket 服务的 service name 格式为 ip:port, 如果是本机可以省略ip和: 例如: smtp /etc/service 定义的 smtp 端口 127.0.0.1:10025 本机 loop 接口的 10025 端口 465 本机所有接口的 465 端口 unix unix domain soket 例如: maildrop 一个必须透过 postfix pipe daemon 才能访问的组件 fifo named pipe 例如: pickup 一个必须透过 fifo 机制才能访问的 postfix 组件 private y postfix 私有, 不开放给其它软件使用 n 公共访问, inet 类型必须是 n。否则外界就无法访问该服务 uppriv y 服务组件运行时使用 mail_owner 指定的非特权用户运行。 默认 postfix n 使用 root 特权运行 chroot y 默认值 y,改变服务组件的工作根目录提升安全性。工作根目录由 main.cf 的 queue_direcotry 定义 wakeup 有些组件必须每个一段时间唤醒一次。比如 pickup 60 每60秒唤醒一次 60? 如果有需要每60秒唤醒一次 0 不需要唤醒 maxproc 同时运行的进程个数上限。 默认 100 0 没有限制 cmd + args 执行服务的实际命令。 如果命令位于 daemon_direcotry 目录,不需要指定路径。 只有postfix提供的服务器程序才能放在这里,如果你要运行自己的程序需要使用postfix提供的 pipe daemon ## postfix 中的时间单位 s 秒 m 分 h 时 d 天 w 周 ## -o 强制指定参数 比如 smtp 组件会读取 master.cf 中的设定。 但可以使用 -o 参数在命令行强制指定参数 smtp-quick unix - - n - - smtp -o smtp_connect_timeout=5s # 队列管理 5 个队列 incoming 输入 active 活动 deferred 等待 暂时无法投递成功的邮件。 corrupt 故障 如果邮件损坏无法处理,放置到此队列。供管理员查原因 hold 保留 通过postsuper工具可以把邮件移动到hold队列,hold队列可以无限期保存。 bounce_size_limit = 50000bytes 退信通知和被退邮件大小不能超过 bounce_size_limit。 否则只发送退信通知函。 maximal_queue_lifetime = 5d 如果邮件在 deferred 中超过 maximal_queue_lifetime 。不再投递,而是退回给发件人。 queue_run_delay = 1000秒 每隔 1000秒,检查 deferred 队列看是否有需要投递的邮件 minimal_backoff_time 如果邮件投递失败,下一次投递的时间间隔最小 1000秒 maximal_backoff_time 如果邮件投递失败,下次投递的时间间隔最大 4000秒。 默认每次投递失败,postfix都会延迟下次投递时间。  # Q&A postfix hold queue 是什么意思? incoming active deferred hod 这些队列的区别 postfix -H 和 postsuper -r 的区别 什么是 cleanup server
Pre:
dovecot 官方文档笔记
Next:
postgresql 常用sql语句
COMMENT
Sign in
to leave a comment.
No Leanote account ?
Sign up now
.
0
comments
More...
Title
-
Artist
0:00
No Leanote account ? Sign up now.