我已经使用 MySQL 配置了 Postfix 和 Dovecot,并且可以使用 Thunderbird(或其他应用程序)成功发送和接收电子邮件,但我必须使用手动设置进行配置,而不是使用自动配置。
下面的示例显示了尝试使用自动配置将帐户添加到 Thunderbird。用户名字段没有域组件,如您在图中看到的。我创建了一个测试用户,当我尝试连接时,Dovecot 日志仅显示使用测试而不是完整电子邮件地址的 mysql 查找。
我有像这样配置的 dovecot-sql.conf.ext 文件
password_query = SELECT username,domain,password FROM mailbox WHERE username='%u';
dovecot 10-auth.conf 文件配置了 %u
auth_username_format = %u
在某个地方,域名被删除了,而我无法确定在哪里。
以下是来自 dovecot 调试日志的文本示例
Sep 01 20:00:59 auth: Debug: sql(test,[IP Address],<fheTBDemh3aZpZ2C>): Performing passdb lookup
Sep 01 20:00:59 auth-worker(14793): Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Sep 01 20:00:59 auth-worker(14793): Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so
Sep 01 20:00:59 auth-worker(14793): Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so
Sep 01 20:00:59 auth-worker(14793): Debug: sqlpool(mysql): Creating new connection
Sep 01 20:00:59 auth-worker(14793): Debug: mysql(localhost): Connecting
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): Server accepted connection (fd=14)
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): Sending version handshake
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): auth-worker<1>: Handling PASSV request
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): auth-worker<1>: sql(test,[IP Address],<fheTBDemh3aZpZ2C>): Performing passdb lookup
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): auth-worker<1>: sql(test,[IP Address],<fheTBDemh3aZpZ2C>): query: SELECT username AS user,password FROM mailbox WHERE username = 'test' AND active$
Sep 01 20:00:59 auth-worker(14793): Debug: mysql(localhost): Finished query 'SELECT username AS user,password FROM mailbox WHERE username = 'test' AND active='1'' in 0 msecs
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): auth-worker<1>: sql(test,[IP Address],<fheTBDemh3aZpZ2C>): Finished passdb lookup
Sep 01 20:00:59 auth-worker(14793): Debug: conn unix:auth-worker (pid=14792,uid=115): auth-worker<1>: Finished: user_unknown
Sep 01 20:00:59 auth: Debug: sql(test,[IP Address],<fheTBDemh3aZpZ2C>): Finished passdb lookup
Sep 01 20:00:59 auth: Debug: auth(test,[IP Address],<fheTBDemh3aZpZ2C>): Auth request finished
Sep 01 20:01:01 auth: Debug: client passdb out: FAIL 1 user=test
您可以看到它在没有域组件的情况下执行查找,结果失败。手动添加帐户后,您可以在同一个调试日志中看到使用完整电子邮件地址执行查找并成功通过。
答案1
电子邮件客户端的自动配置是一个很棘手的问题。
RFC 6186是/曾经尝试定义一组 DNS SRV 记录,以允许客户端查找如何以及在何处连接,但适应性似乎有所欠缺。
该标准要求:
IMAP, POP3, and SMTP (submission) servers SHOULD be configured to allow authentication with email addresses or email local-parts. In the former case, the email addresses MUST NOT conflict with other forms of permitted user login name.
你已经这样做了,所以这应该很好。
大多数电子邮件客户端(也)使用其他形式的自动发现来从用户输入的电子邮件地址中获取电子邮件客户端设置。
如果用户输入[电子邮件保护],根据客户的不同,通常涉及以下任一方面:
_autodiscover._tcp.example.com.
MS Exchange 和 Outlook 使用的 SRV记录autoconfig.example.com.
使用 A 记录和 web 服务调用的实际主机。在“中央数据库”中查找来自许多大型 ISP 的设置
有根据的猜测
当所有配置都失败时 - 恢复为手动配置
对于您的域名来说“有根据的猜测” 找到正确的收发邮件服务器但无法猜出正确的登录名格式。
正如您在屏幕截图中看到的那样,Thunderbird 使用“测试”而不是“[电子邮件保护]“。
这就是您需要解决的问题,dovecot 中没有配置错误。
您可以通过设置 autoconfig.example.com 网站为电子邮件客户端提供正确的设置来获得更好的自动配置。