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

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

我有一个testing设置工作,但我不明白一些(很多)的东西,并正在尝试纠正之前迁移。

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

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

virtual_mailbox_maps = hash:/etc/postfix/virtual-mailbox-users 

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

 [email protected] [email protected] [email protected] [email protected] etc, etc. 

首先,我在哪里可以find第二个参数[email protected]格式的文档,大多数格式都是文件或目录的forms(如in / a / b / c)。

如果我用别的东西replace第二个参数,例如,

 [email protected] /tmp/foo 

那么我可以发送邮件到[email protected],但不能从,这导致:

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

(我有更多的问题,但是这可能会帮我解开一些问题,例如,我可以把所有的邮件发送到user@domain*.com发送到其中一个邮箱,比如[email protected]?)

(不好意思,这个名字的说明性质,我的原文是从'How to'开始的,但是被拒绝了。)


我做了一个实验,我用$ user_domain1.com代替了$ virtual_mailbox_maps条目,并且发送工作正常,但发送邮件失败( 发件人地址被拒绝:不是用户所有 )。 所以,右边(价值)很重要。 这是我的第一个问题。 (我已经阅读了描述格式等的各种文件,但却没有find具体谈到与SMTP交互的内容。

附录 :感谢@masegaloeh的跟踪。 相关的configuration如下,'googling'smtpd_sender_login_maps解释其余部分。

 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 

当postfix收到来电时,基本上可以分为三个过程:

  1. 通过与发件人邮件服务器进行SMTP交易来接收电子邮件,并应用SMTP限制,例如:检查收件人是否存在
  2. 通过将电子邮件发送到其中一个发送代理(dovecot,本地,虚拟)来存储电子邮件

基于上述两个过程,参数virtual_mailbox_maps具有(至less)两个函数:

  1. 作为收件人validation,当postfix接收电子邮件,以便postfix可以拒绝未经过收件人。 这个检查是在reject_unauth_destination被调用的时候执行的。
  2. 虚拟(8)递送代理查找邮箱位置的参数。 参数$virtual_mailbox_base被无条件地添加到这个path中,所以maildir存储的绝对path是$virtual_mailbox_base$virtual_mailbox_maps

第二个函数只有在你configurationpostfix发送邮件到virtual传送代理时才能使用。 根据您在上面发布的教程,postfix将使用dovecot交付代理而不是virtual

 virtual_transport = dovecot 

因为dovecot-lda提供邮件,所以virtual_mailbox_maps在这个阶段没有被使用(存储邮件)。 dovecot将使用这个参数代替postfixconfiguration

 mail_location = maildir:/var/mail/vmail/%d/%n/mail:LAYOUT=fs 

确定在哪里存储电子邮件。


它在什么地方logging下来,$ virtual_mailbox_maps文件的格式是“地址”,第二个必须与第一个匹配以使SMTP工作( 注意 :这是基于我的经验观察)?

参数virtual_mailbox_maps必须由一个或多个查找表组成 。 。 所有Postfix查找表将信息存储为(键,值)对。 所以这就是为什么virtual_mailbox_maps文件由两列组成:左侧是键,右侧是键值。

大多数Postfix查找表用于查找信息。 例如,虚拟传送代理使用virtual_mailbox_maps来查找收件人邮箱的path。 所以你的散列表的右侧必须指定path。

但是有了一些表格, Postfix只有在查找关键字存在的情况下才需要知道 。 在这里可以使用任何非空的查找结果值:不使用查找结果。 例如,smtpd使用virtual_mailbox_maps来检查收件人是否存在。

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


当我更换$virtual_mailbox_maps条目,例如,[email protected]确定,并交付工作,但发送电子邮件失败(与发件人地址拒绝:不是由用户拥有

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

 smtpd_sender_restrictions = reject_unknown_sender_domain, reject_sender_login_mismatch smtpd_sender_login_maps = $virtual_mailbox_maps 

当你有reject_sender_login_mismatchsmtpd_sender_login_maps的时候,postfix会检查你的SASL用户名是否映射到发送邮件时提供的发件人。 所以smtpd_sender_login_maps = $virtual_mailbox_maps的格式必须包含:

 [email protected] [email protected] 

在你的情况下,[email protected] = [email protected],这就是为什么你需要把“地址”放在你的$virtual_mailbox_maps

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