我遇到了一个奇怪的情况,在其他地方找不到。当我在本地计算机上向 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=<[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”正在变成“[电子邮件保护]“由 postfix 提供。我根据我的 main.cf 文件使用 mysql 查找 postfix:
#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
我必须添加一个用户,[电子邮件保护]到我的 /etc/postfix/mysql-virtual-mailbox-maps.cf 文件。然后 rcook 会在 /var/mail/rcook 中收到发往 rcook 的邮件。换句话说,向“rcook”发送邮件会变成“[电子邮件保护]' 然后将其送回 '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...
[电子邮件保护]rcook 的地图:
root@linode (~ ): postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
rcook
但这会失败,除非我添加一个 virtual_users 条目[电子邮件保护]:
date | mail -s 'testing' rcook
我的问题是,为什么 rcook 被映射到[电子邮件保护]? 我认为这与后缀世界中的 $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。这是怎么回事?我应该说一下,如果我确实添加了用户[电子邮件保护]对于我的虚拟用户来说,一切都很好。我只是不明白幕后到底发生了什么,以及为什么需要这个用户,因为它只是一个别名。
以下是我在日志中添加“[电子邮件保护]'到我的虚拟用户映射:
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
答案1
让我们来告诉你 Linux 中电子邮件传递过程的秘密,其中包括 sendmail 二进制文件和 postfix。
当你跑步的时候
date | mail -s 'testing' rcook
你告诉 sendmail发电子邮件rcook,收件人地址无域部分到 postfix。由于您有参数append_at_myorigin = yes
(默认值),因此 postfix 会将域部分添加到收件人地址。附加的域可通过参数控制myorigin
。在您的例子中,内容看起来/etc/mailname
是例子.net。
这就解释了为什么 postfix 将您的收件人地址修改为[电子邮件保护]。让我们继续这个故事……
现在,postfix 必须决定电子邮件应该发往何处。首先,postfix 将查找virtual_alias_maps
此电子邮件是否应该使用别名。因为您已定义[电子邮件保护]别名为 rcook,然后 postfix 将把你的电子邮件别名为 rcook。
但是等一下,别名目标没有域部分,那么它去哪里了?答案就在本手册页和这个答案。简而言之,后缀在别名目标 rcook 上myorigin
再次添加。因此,我们的别名目标被转换为[email protected]
。
但这会造成循环,对吧?电子邮件是他自己的别名?
幸运的是,postfix 足够智能,可以避免这种情况。因为 [email protected]
满足了这些条件
- 它已经是别名了
- example.net 在 virtual_mailbox_domains 中定义
然后后缀将查找[电子邮件保护]在 virtual_mailbox_maps
。
不幸的是,在第一种情况下它没有找到它,所以 postfix 会将其退回。当您在virtual_mailbox_maps
postfix 上添加条目时,它会很乐意通过 dovecot LMTP 服务存储它。
参考:
答案2
最后我要提一下,以防有人和我一样感到困惑,为什么当 postfix 将“rcook”更改为“[电子邮件保护]“。发生这种情况是因为在 /etc/dovecot/conf.d/10-mail.conf 中有以下内容:
mail_location = maildir:/var/mail/%n:LAYOUT=fs
删除域名。@masegaloeh 给出了出色的答案后,我就能弄清楚这最后一部分了。