在传出 smtp 连接的身份验证器中我有以下内容:
remote_login:
driver = plaintext
public_name = LOGIN
client_send = : user : password
并且效果很好。
如果我将密码替换为:
${extract{auth_pass}{${lookup{$sender_address_domain}wildlsearch{/etc/exim/smtp_auths}{$value}fail}}}
使用 ./smtp_auths
example.com: auth_pass=password
这仍然有效。
使用 mysql 查找切换:
${lookup mysql{SELECT users.remote_secret as secret FROM users WHERE users.domain='${quote_mysql:$sender_address_domain}'}{$value}}
发送时我在日志中收到以下错误。
延迟(-48):临时内部错误
但使用调试:
[ec2-user@ip-172-31-16-5 exim]$ sudo exim -be -Mset <message-id>
> ${extract{auth_pass}{${lookup{$sender_address_domain}wildlsearch{/etc/exim/smtp_auths}{$value}fail}}}
password
> ${lookup mysql{SELECT users.remote_secret as secret FROM users WHERE users.domain='${quote_mysql:$sender_address_domain}'}{$value}}
password
>
看起来确实应该可以工作。有人见过这个问题吗?
如果我换掉
${quote_mysql:$sender_address_domain}
和
example.com
它起作用了。所以我知道 mysql 正在运行。
我究竟做错了什么?
答案1
根据此邮件列表帖子,因为client_send
的值是一个列表,所以:
在进行任何扩展之前,这些字符用于拆分列表,这意味着 exim 正在尝试处理
${lookup mysql{SELECT users.remote_secret as secret FROM users WHERE users.domain='${quote_mysql`
作为一个字符串和
$sender_address_domain}'}{$value}}
作为第二支球队。
您需要将:
字符加倍才能将其转义,并将整个命令视为单个字符串:
${quote_mysql::$sender_address_domain}