后缀“用户不存在”,但用户确实存在

我在其他地方找不到一个奇怪的情况。 当我将邮件发送到本地机器上的rcook时,我在syslog中看到了这一点:

Feb 16 20:27:14 linode postfix/pickup[1305]: 326CC4463F: uid=0 from=<root> Feb 16 20:27:14 linode postfix/cleanup[1524]: 326CC4463F: message-id=<[email protected]> Feb 16 20:27:14 linode postfix/qmgr[1306]: 326CC4463F: from=<[email protected]>, size=302, nrcpt=1 (queue active) Feb 16 20:27:14 linode postfix/lmtp[1531]: 326CC4463F: to=<[email protected]>, orig_to=<rcook>, relay=linode.example.net[private/dovecot-lmtp], delay=0.06, delays=0.04/0.01/0.01/0.01, dsn=5.1.1, status=bounced (host linode.example.net[private/dovecot-lmtp] said: 550 5.1.1 <[email protected]> User doesn't exist: [email protected] (in reply to RCPT TO command)) Feb 16 20:27:14 linode postfix/bounce[1533]: 326CC4463F: sender non-delivery notification: 3C71844643 Feb 16 20:27:14 linode postfix/qmgr[1306]: 326CC4463F: removed 

它看起来像“rcook”正在由后缀变成“[email protected]”。 我正在使用mysql查找postfix,根据我的main.cf文件:

 #Virtual domains, users, and aliases virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf 

我必须将一个用户[email protected]添加到我的/etc/postfix/mysql-virtual-mailbox-maps.cf文件中。 然后rcook将邮件发送到/ var / mail / rcook目的地为rcook。 换句话说,发送邮件到'rcook'变成'[email protected]',然后交付回'rcook'我希望有人在这里可以清理发生了什么事情。
它看起来像rcook是一个真正的邮箱:

 root@linode (~ ): postmap -q rcook mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf 1 

 root@linode (~ ): ls /var/mail/rcook [Airmail] dovecot-uidvalidity * amazon and ebay sales dovecot-uidvalidity.54e27e23 Apple Mail To Do Drafts etc etc etc lots of mailboxes... 

[email protected]映射到rcook:

 root@linode (~ ): postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf rcook 

但是这个失败,除非我为[email protected]添加一个virtual_users条目:

 date | mail -s 'testing' rcook 

我的问题是,为什么rcook被映射到[email protected]? 我认为它与后缀世界中的$ mydomain值有关,但我不知道如何设置。

 root@linode (~ ): postconf | grep mydomain append_dot_mydomain = no mydomain = example.net 

这是我的后缀非默认值:

 alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases append_dot_mydomain = no biff = no config_directory = /etc/postfix inet_interfaces = all mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 mydestination = localhost myhostname = linode.example.net mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 myorigin = /etc/mailname readme_directory = no recipient_delimiter = + relayhost = smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot smtpd_tls_auth_only = yes smtpd_tls_cert_file = /etc/dovecot/dovecot.pem smtpd_tls_key_file = /etc/dovecot/private/dovecot.pem smtpd_use_tls = yes virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_transport = lmtp:unix:private/dovecot-lmtp 

在/ etc / dovecot /中没有任何地方提到example.net。 这里发生了什么? 我应该提到,如果我添加一个用户[email protected]到我的virtual_users,一切都很好。 我只是对于引擎盖下发生了什么以及为什么需要这个用户感到困惑,因为这只是一个别名。

以下是在我的virtual_users映射中添加“[email protected]”时发生的情况:

 Feb 17 10:35:55 linode postfix/pickup[8804]: 3D785901CA: uid=0 from=<root> Feb 17 10:35:55 linode postfix/cleanup[9231]: 3D785901CA: message-id=<[email protected]> Feb 17 10:35:55 linode postfix/qmgr[1619]: 3D785901CA: from=<[email protected]>, size=326, nrcpt=1 (queue active) Feb 17 10:35:55 linode dovecot: lmtp(9262, [email protected]): IX33DwuK41QuJAAAmhsNrQ: msgid=<[email protected]>: saved mail to INBOX Feb 17 10:35:55 linode postfix/lmtp[9233]: 3D785901CA: to=<[email protected]>, orig_to=<rcook>, relay=linode.example.net[private/dovecot-lmtp], delay=0.03, delays=0.01/0/0.01/0.01, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> IX33DwuK41QuJAAAmhsNrQ Saved) Feb 17 10:35:55 linode postfix/qmgr[1619]: 3D785901CA: removed 

让我们来告诉你在linux中的电子邮件传递过程的秘密,具有sendmail二进制和后缀。

当你跑步

 date | mail -s 'testing' rcook 

你告诉sendmail 发送邮件给rcook,一个没有域名的收件人地址给postfix。 因为你有参数append_at_myorigin = yes (默认值),那么postfix会把域名部分添加到收件人地址。 附加的域可以通过参数myorigin控制。 在你的情况下,看起来像/etc/mailname的内容是example.net

这就解释了为什么Postfix会将您的收件人地址修改为[email protected]。 让我们继续这个故事吧

现在,postfix必须决定电子邮件的去向。 首先,postfix将查找virtual_alias_maps来查找这个电子邮件是否应该别名。 因为你已经定义了[email protected]别名到rcook,那么postfix会把你的电子邮件转到rcook。

但是等等,别名目标没有域名部分,那么它去哪里? 答案是在这个手册页和这个答案 。 简短的解释是后缀追加别名目标rcook与myorigin (再次)。 所以,我们的别名目标被转换为[email protected]

但它会创build循环,对不对? 电子邮件是自杀的?

幸运的是,后缀是足够聪明的,以避免它。 因为[email protected]已经满足了这些条件

  • 它已经是别名了
  • example.net在virtual_mailbox_domains中定义

那么后缀将在virtual_mailbox_maps查找[email protected]

不幸的是,它不会在你的第一个案例中find它,所以后缀会反弹它。 在virtual_mailbox_maps上添加条目时,postfix将通过dovecot LMTP服务愉快地存储它。

参考文献:

男人5 postconf

最后一点我要提一下,如果有人对我感到困惑,那么为什么当postfix将“rcook”改为“[email protected]”时邮件最终会被放到/ var / mail / rcook /里。 发生这种情况是因为在/etc/dovecot/conf.d/10-mail.conf中我有这样的:

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

这剥离了域名。 一旦@masegaloeh给出了他的优秀答案,我能够弄清楚这个最后一块。