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

Ric*_*ich 5 postfix dovecot

我遇到了在别处找不到的奇怪情况。当我在本地机器上向 rcook 发送邮件时,我在系统日志中看到了这个:

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=<20150217042714.326CC4463F@linode.example.net>
Feb 16 20:27:14 linode postfix/qmgr[1306]: 326CC4463F: from=<root@example.net>, size=302, nrcpt=1 (queue active)
Feb 16 20:27:14 linode postfix/lmtp[1531]: 326CC4463F: to=<rcook@example.net>, 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 <rcook@example.net> User doesn't exist: rcook@example.net (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
Run Code Online (Sandbox Code Playgroud)

看起来“rcook”正在被后缀变成“rcook@example.net”。根据我的 main.cf 文件,我正在使用 mysql 查找后缀:

#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
Run Code Online (Sandbox Code Playgroud)

我必须将用户 rcook@example.net 添加到我的 /etc/postfix/mysql-virtual-mailbox-maps.cf 文件中。然后 rcook 在 /var/mail/rcook 中获取发往 rcook 的邮件。换句话说,将邮件发送到 'rcook' 会变成 'rcook@example.net',然后将其发送回 'rcook' 我希望这里有人能弄清楚发生了什么。
看起来 rcook 是一个真正的邮箱:

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

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... 
Run Code Online (Sandbox Code Playgroud)

rcook@example.net 映射到 rcook:

root@linode (~ ): postmap -q rcook@example.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf 
rcook
Run Code Online (Sandbox Code Playgroud)

但这失败了,除非我为 rcook@example.net 添加一个 virtual_users 条目:

date | mail -s 'testing' rcook
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么 rcook 被映射到 rcook@example.net?我认为它与 postfix 世界中的 $mydomain 值有关,但我不知道这是如何设置的。

root@linode (~ ): postconf | grep mydomain
append_dot_mydomain = no
mydomain = example.net
Run Code Online (Sandbox Code Playgroud)

这是我的后缀非默认值:

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
Run Code Online (Sandbox Code Playgroud)

在 /etc/dovecot/ 中的任何地方都没有提到 example.net。这里发生了什么?我应该提到,如果我将用户 rcook@example.net 添加到我的 virtual_users,一切都很好。我只是对幕后发生的事情感到困惑,以及为什么需要这个用户,因为它只是一个别名。

以下是我将“rcook@example.net”添加到我的 virtual_users 映射时日志中发生的情况:

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=<20150217183555.3D785901CA@linode.example.net>
Feb 17 10:35:55 linode postfix/qmgr[1619]: 3D785901CA: from=<root@example.net>, size=326, nrcpt=1 (queue active)
Feb 17 10:35:55 linode dovecot: lmtp(9262, rcook@example.net): IX33DwuK41QuJAAAmhsNrQ: msgid=<20150217183555.3D785901CA@linode.example.net>: saved mail to INBOX
Feb 17 10:35:55 linode postfix/lmtp[9233]: 3D785901CA: to=<rcook@example.net>, 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 <rcook@example.net> IX33DwuK41QuJAAAmhsNrQ Saved)
Feb 17 10:35:55 linode postfix/qmgr[1619]: 3D785901CA: removed
Run Code Online (Sandbox Code Playgroud)

mas*_*oeh 4

让met告诉你Linux中电子邮件发送过程的秘密,包括sendmail二进制文件和postfix。

当你跑步时

date | mail -s 'testing' rcook
Run Code Online (Sandbox Code Playgroud)

您告诉 sendmail 将电子邮件发送到 rcook,这是一个不带 postfix 域部分的收件人地址。因为你有参数append_at_myorigin = yes(默认值),所以 postfix 会将域部分添加到收件人地址。附加域可通过参数 控制myorigin。在您的情况下,看起来的内容/etc/mailnameexample.net

这就是为什么 postfix 将您的收件人地址修改为 rcook@example.net。让我们继续这个故事……

现在,postfix 必须决定电子邮件的去向。首先,postfix 将查找virtual_alias_maps该电子邮件是否应该使用别名。因为你已经定义了 rcook@example.net 别名为 rcook,那么 postfix 会将你的电子邮件地址别名为 rcook。

但是等等,别名目标没有域部分,那么它去哪里了?答案就在这个手册页这个答案中。简短的解释是后缀附加别名目标 rcook myorigin(再次)。因此,我们的别名目标被转换为rcokk@example.net.

但它会产生循环,对吧?该电子邮件是他自己的别名?

幸运的是,postfix 足够聪明,能够避免这种情况。因为 rcokk@example.net满足了这些条件

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

那么后缀将在 中查找 rcokk@example.net virtual_mailbox_maps

不幸的是,它在你的第一种情况下没有找到它,所以 postfix 会退回它。当您在 postfix 上添加条目时,virtual_mailbox_maps它会很乐意通过 dovecot LMTP 服务存储它。

参考:

人 5 会议后