我有一个带有 Postfix 和 Dovecot 的 Debian 服务器。最近,我在 Dovecot 上安装了 Sieve,并配置 Postfix 使用 LMTP 传送电子邮件。从那时起,纯用户名不能与分隔符一起使用。分隔符似乎只有在涉及 aliases-db 时才能解决。日志说:
User doesn't exist: [email protected] (in reply to RCPT TO command)
这是基本设置和一些示例
username: doe
delimiter: -
[email protected] -> works
[email protected] -> works
[email protected] -> unknown user
[email protected] -> works
/etc/aliases
:
john.doe: doe
/etc/postfix/main.cf
:
recipient_delimiter = -
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mailbox_transport = lmtp:unix:private/dovecot-lmtp
# All options: propagate_unmatched_extensions = canonical, virtual, alias, forward, include
propagate_unmatched_extensions =
答案1
这里的问题不在于 Postfix,而在于 Dovecot。由于 Dovecot 不知道 Postfix,recipient_delimiter
它必须假设用户查询[电子邮件受保护]实际上的意思是“在域“example.com”上查找用户“doe-test””。
幸运的是,这个解决方案很简单,告诉 Dovecot 你告诉 Postfix 的话:
- 打开
/etc/dovecot/conf.d/15-lda.conf
- 取消注释包含的行
#recipient_delimiter = +
并将其替换+
为任何内容(-
在您的情况下) - 利润!
关于 Postfix 地址传递和 /etc/aliases:
在您的设置中起作用的原因[email protected]
是因为别名查找是由 Postfix 本身完成的前决定消息是否将被传送(即:LMTP 在这个阶段根本不相关)。
那么发生的事情是这样的:
[email protected]
Postfix 接收使用其守护进程的消息smtpd
并将其放入消息队列中- postfix
qmgr
守护进程安排消息处理 qmgr
使用解析消息目的地trivial-rewrite
命令- 这是执行地址解析和查找的地方,因此第一次使用收件人分隔符。
- 特别是 Postfix 将在别名表上执行以下查找:
[email protected]
和john.doe-test
(原始地址)[email protected]
和john.doe
(不带地址扩展名的地址)- (可能还有其他一些,具体取决于所使用的地址和配置。)
- 如果查找成功,它将返回新的目标地址,并且消息将再次放入队列中。
- 最终,消息将(以某种方式)被标记为准备好传递(即使它被退回,这只是一种特殊类型的传递......),并将
qmgr
安排适当的命令来执行该传递(例如lmtp
) – 将消息及其最终递送地址传递给它(在我们的例子中[email protected]
)- 如果使用 Postfix
lmtp
进行投递,则会建立与实际 LMTP 守护进程 (Dovecot) 的连接,并且将使用 LMTP 协议传递消息(带有最终投递地址)。
- 如果使用 Postfix
- Dovecot 的 LMTP 守护进程对整个重写过程一无所知,只会尝试根据
[email protected]
它收到的最终传递地址 ( ) 传递消息。
现在,如果我们考虑这种情况,[email protected]
我们会发现该地址的别名表查找永远不会成功,因此传递地址永远不会被重写。因此,Postfix 最终将尝试[email protected]
使用 LMTP 来传递消息。
Postfix 不应该在尝试使用 LMTP 进行传送之前丢弃地址扩展吗?
或许, 但不是丢弃它会带来巨大的好处:Dovecot 将能够知道关于地址扩展。这可能看起来不是很有用,但是在 Dovecot 端处理地址扩展可以实现一些很酷的事情,例如使用 Sieve 自动将邮件放入 IMAP 子文件夹中。