我在其他地方找不到一个奇怪的情况。 当我将邮件发送到本地机器上的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]
已经满足了这些条件
那么后缀将在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给出了他的优秀答案,我能够弄清楚这个最后一块。