Postfix 捕获所有域/用户并将邮件发送到外部邮件服务器

Postfix 捕获所有域/用户并将邮件发送到外部邮件服务器

我正在配置一个邮件服务器,该服务器必须保存任何域和任何用户的所有电子邮件并将其存储在一个特定用户的邮件文件夹中。为此,我使用了以下配置:

virtual_alias_maps = pcre:/etc/postfix/virtual

# cat /etc/postfix/virtual 
/.*/    specificuser

这很完美,但唯一的问题是我无法发送电子邮件;我想将 cron 输出发送到例如 gmail 帐户。发出的 cron 电子邮件也映射到虚拟帐户并保存在特定用户的邮件文件夹中。

我尝试通过添加域(例如,)来使通配符更小,/.*@somedomain/但这没有起作用。我也尝试在/etc/postfix/virtual文件中添加额外的一行:

/root.*/    [email protected]

但随后电子邮件仍被发送到specificuser邮件文件夹。 的地址重写在root@localserver第一次运行时是正确的,并被重写为[email protected],但随后再次执行重写并[email protected]最终映射到specificusercatchall 上。请参阅下面的相关日志记录。

postfix/cleanup[399895]: maps_find: virtual_alias_maps: pcre:/etc/postfix/virtual(0,lock|fold_fix|utf8_request): [email protected] = [email protected]
postfix/cleanup[399895]: mail_addr_find: [email protected] -> [email protected]
[...]
postfix/cleanup[399895]: maps_find: virtual_alias_maps: pcre:/etc/postfix/virtual(0,lock|fold_fix|utf8_request): [email protected] = specificuser
postfix/cleanup[399895]: mail_addr_find: [email protected] -> specificuser

有人能指出我正确的配置吗?

答案1

做这样的事情

virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_transport = lmtp:unix:private/dovecot-lmtp

根据Postfix 文档,虚拟邮箱域是不对应于 UNIX 系统帐户的域。相反,每个收件人都映射到 /path/name 形式的虚拟邮箱位置,其中 /path 是目录(例如,/var/mail/vhosts),name 是 /path 下的文件或目录名称。同一域中每个收件人的虚拟邮箱位置可以不同。

要启用虚拟邮箱域,您需要在 /etc/postfix/main.cf 文件中设置以下参数:

virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_transport = lmtp:unix:private/dovecot-lmtp

第一个参数指定 Postfix 将接受邮件的虚拟邮箱域列表。您可以使用逗号分隔的列表、哈希表或正则表达式来定义域。在本例中,您只有一个域:example.com。

第二个参数指定虚拟邮箱收件人到其虚拟邮箱位置的映射。您需要创建一个名为 /etc/postfix/virtual_mailbox 的文件,并按照以下格式列出收件人及其位置:

[email protected]    example.com/user1
[email protected]    example.com/user2
...

您可以使用 /var/mail/vhosts 下的任何目录结构,只要它与虚拟邮箱位置匹配即可。编辑文件后,您需要运行 postmap /etc/postfix/virtual_mailbox。

第三个参数指定将处理虚拟邮箱收件人邮件的投递代理。在本例中,您使用的是 Dovecot 的 LMTP 服务器,该服务器侦听名为 private/dovecot-lmtp 的 UNIX 套接字。您需要配置 Dovecot 以启用 LMTP 并设置虚拟邮箱的邮件位置。

根据Dovecot 文档,您需要将以下行添加到您的 /etc/dovecot/conf.d/10-master.conf 文件中:

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

并且您需要将以下行添加到 /etc/dovecot/conf.d/10-mail.conf 文件中:

mail_location = maildir:/var/mail/vhosts/%d/%n
mail_uid = vmail
mail_gid = vmail

第一行告诉 Dovecot 将虚拟邮箱的邮件存储在何处。它使用与 Postfix 相同的目录结构。%d 和 %n 变量由收件人的域和用户名替换。

第二行和第三行告诉 Dovecot 使用哪个用户和组来访问邮件文件。您需要创建一个名为 vmail 的系统用户和组,没有登录 shell 和主目录,并确保他们拥有 /var/mail/vhosts 目录及其子目录。

完成这些更改后,您需要重新启动 Postfix 和 Dovecot 才能使它们生效。

相关内容