解释postfix $virtual_mailbox_maps参数值的user@domain格式

cop*_*hat 3 postfix dovecot

我正在尝试使用本文设置邮件服务器 。基本上使用 postfix 和 dovecot。

我有一个有效的测试设置,但我不明白一些(很多)内容,并试图在迁移之前纠正它。

在许多事情中,这是最令人困惑的:我不明白 $virtual_mailbox_maps 的第二个参数部分是如何工作的。

我在 main.cf 中有以下内容:

virtual_mailbox_maps = hash:/etc/postfix/virtual-mailbox-users
Run Code Online (Sandbox Code Playgroud)

我的 /etc/postfix/virtual-mailbox-users 看起来像

user@domain1.com    user@domain1.com
user@domain2.com    user@domain2.com
etc, etc.
Run Code Online (Sandbox Code Playgroud)

首先,在哪里可以找到第二个参数user@domain1.com格式的文档,大多数格式都是文件或目录的形式(如/a/b/c)。

如果我用其他参数替换第二个参数,例如,

user@domain1.com    /tmp/foo
Run Code Online (Sandbox Code Playgroud)

然后我可以将邮件发送到 user@domain1.com,但不能发送邮件,这会导致:

我的第二个问题: SMTP 使用 $virtual_mailbox_maps 吗?(为什么,因为它已经将电子邮件地址作为关键参数?)。dovecot 是否使用 $virtual_mailbox_maps?

(我还有很多问题,但这可能会帮助我解决一些问题。例如,我可以将所有发送到 user@domain*.com 的邮件发送到其中一个邮箱,例如 user@domain1.com 吗?)

(请原谅标题的声明性,我的原作以“如何”开头,但被拒绝了。)


我做了一个实验,我将 $virtual_mailbox_maps 条目替换为 ,并且user@domain1.com OK发送成功,但发送电子邮件失败(发件人地址被拒绝:不属于用户)。因此,右侧(值)很重要。这就是我的第一个问题。(我已经阅读了描述格式等的各种文档,但找不到任何专门讨论与 SMTP 交互的内容。

附录:感谢@masegaloeh 追踪此问题。相关配置如下,smtpd_sender_login_maps剩下的“google”解释了。

root@generic:/etc/postfix# postconf -n| grep smtpd_sender
smtpd_sender_login_maps = $virtual_mailbox_maps
smtpd_sender_restrictions = reject_unknown_sender_domain, reject_sender_login_mismatch
Run Code Online (Sandbox Code Playgroud)

mas*_*oeh 5

postfix接收邮件时,基本上可以分为三个过程:

\n\n
    \n
  1. 通过与发件人邮件服务器进行 SMTP 事务来接收电子邮件并应用 SMTP 限制,例如:检查收件人是否存在
  2. \n
  3. 通过将电子邮件发送到递送代理之一(鸽舍、本地、虚拟)来存储电子邮件
  4. \n
\n\n

基于上面的两个过程,参数virtual_mailbox_maps(至少)有两个功能:

\n\n
    \n
  1. 由于 postfix 接收电子邮件时会进行收件人验证,因此 postfix 可以拒绝不存在的收件人。此检查是在reject_unauth_destination调用时执行的。
  2. \n
  3. virtual(8)传递代理查找邮箱位置的参数。参数$virtual_mailbox_base无条件地添加到该路径之前,因此 maildir 存储的绝对路径为$virtual_mailbox_base$virtual_mailbox_maps
  4. \n
\n\n

仅当您配置 postfix 将电子邮件发送给virtual递送代理时,才可以使用第二个函数。根据您上面发布的教程,postfix 将dovecot改为使用交付代理virtual

\n\n
virtual_transport = dovecot\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为是dovecot-lda发送电子邮件,所以virtual_mailbox_maps在此阶段未使用(存储电子邮件)。dovecot 将使用此参数,而不是 postfix 配置

\n\n
mail_location = maildir:/var/mail/vmail/%d/%n/mail:LAYOUT=fs\n
Run Code Online (Sandbox Code Playgroud)\n\n

确定电子邮件的存储位置。

\n\n
\n\n
\n

在哪里记录 $virtual_mailbox_maps 文件的格式是“地址地址”,并且第二个必须与第一个匹配才能使 SMTP 工作(注意:这是基于我的经验观察)?

\n
\n\n

参数必须由一个或多个查找表virtual_mailbox_maps组成。\n。所有 Postfix 查找表都将信息存储为(键,值)对。这就是文件由两列组成的原因:左侧用于键,右侧用于值。virtual_mailbox_maps

\n\n

大多数Postfix查找表用于查找信息。\xc2\xa0例如,虚拟投递代理用于virtual_mailbox_maps查找收件人邮箱的路径。所以哈希表的右侧必须指定路径。

\n\n

然而,对于某些表,Postfix 仅需要知道查找键是否存在\n。此处可以使用任何非空查找结果值:不使用查找结果。\xc2\xa0例如,smtpd 用于virtual_mailbox_maps检查收件人是否存在。

\n\n

所以实际上你可以将任何条目放在右侧,virtual_mailbox_maps因为后缀不会使用它。在这种情况下,没有像“地址地址”这样的格式。

\n\n
\n\n
\n

当我将$virtual_mailbox_maps条目替换为 user@domain1.com 时,正常,并且发送成功,但发送电子邮件失败(发件人地址被拒绝:不属于 user

\n
\n\n

那是因为你有这个参数main.cf

\n\n
smtpd_sender_restrictions = reject_unknown_sender_domain,\n    reject_sender_login_mismatch\nsmtpd_sender_login_maps = $virtual_mailbox_maps\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您拥有reject_sender_login_mismatchsmtpd_sender_login_maps后,postfix 将检查您的 SASL 用户名是否映射到您发送电子邮件时提供的发件人。所以 的格式smtpd_sender_login_maps = $virtual_mailbox_maps必须包括:

\n\n
my.real.email@example.com   my.sasl.username@example.com\n
Run Code Online (Sandbox Code Playgroud)\n\n

在您的情况下,my.real.email@example.com = my.sasl.username@example.com,这就是您需要将“地址地址”放入$virtual_mailbox_maps.

\n\n

当然你可以提供smtpd_sender_login_maps不同的表virtual_mailbox_maps。但文章作者决定将它们统一起来。也许原因是您只需要更改一个文件即可添加/删除有效收件人

\n