![Postfix 向 unix 用户而不是虚拟用户发送](https://linux22.com/image/629116/Postfix%20%E5%90%91%20unix%20%E7%94%A8%E6%88%B7%E8%80%8C%E4%B8%8D%E6%98%AF%E8%99%9A%E6%8B%9F%E7%94%A8%E6%88%B7%E5%8F%91%E9%80%81.png)
我已经设置 postfix 来使用虚拟用户来收发入站电子邮件,并从 mysql 读取配置。
但是,当我尝试使用 之类的方法在本地发送邮件时,sendmail root@localhost < testmail
查询正在执行,但邮件并未发送到虚拟用户目录。而是创建了
目录。/var/mail/root
Mysql 配置似乎正确,因为执行了以下查询:
SELECT destination FROM aliases WHERE mail='root@localhost' and enabled = 1
+----------------+
| destination |
+----------------+
| root@localhost |
+----------------+
SELECT destination FROM aliases WHERE mail='localhost' and enabled = 1;
Empty set (0.00 sec)
SELECT domain FROM domains WHERE domain='localhost' and enabled = 1;
+-----------+
| domain |
+-----------+
| localhost |
+-----------+
但它们似乎被忽略了。
尝试通过 Courier IMAP 登录时,结果如下:
1 login root@localhost <password>
* BYE [ALERT] Fatal error: No such file or directory: No such file or directory
因为 Postfix 创建的文件夹不是为用户在 DB 中设置的文件夹。
配置
(主要灵感来自指引):
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mynetworks_style = host
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
# working relayhost config here
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, permit
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_sender_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
virtual_uid_maps = static:5000
答案1
为了确定 Postfix 是否确实将邮件投递到虚拟邮箱,您可以检查relay
中的值/var/log/mail.log
。
尝试:
tail -100 /var/log/mail.log | grep relay=
您最有可能看到的是relay=local
,而您想要的relay=virtual
。
发生这种情况是因为 postfix 正在向 发送local_recipient_maps
。
此问题的一个迹象是,您可以在日志中看到
warning: do not list domain example.com in BOTH mydestination and virtual_mailbox_domains
您可以通过以下方式解决此问题使用空值覆盖 mydestination:
#/etc/postfix/main.cf
mydestination =
或者强制 Postfix 使用虚拟传输,即使对于本地邮箱也是如此:
#/etc/postfix/main.cf
local_transport = virtual
local_recipient_maps = $alias_maps $virtual_mailbox_maps
第一个选择更好,因为它解决了根本问题,而不是在安静的角落里解决它。
答案2
IMAP 服务器是否应该直接获取邮件,而不是从 maildir 或 /var/mail/foo 获取?
我使用 dovecot,并且设置了 lmtp 转发套接字,dovecot 会监听该套接字。当新邮件到达时,postfix 会将其发送到 dovecot 套接字。目录等均由 dovecot 管理。