目前,我已将 exim 配置设置为使用外部 SMTP 服务器发送所有电子邮件。所有用户都使用本地密码通过我的 exim 服务器进行身份验证,然后发送的消息通过智能主机中继到远程 SMTP 服务器,该服务器使用的登录名与直接连接到我的 exim 服务器(运行 cPanel)的用户使用的登录名不同。以下是当前配置:
remote_route:
driver = manualroute
domains = !+local_domains
transport = remote_transport
route_list = * remotesmtpserver.com
remote_transport:
driver = smtp
port = 587
hosts_require_auth = <; $host_address
hosts_require_tls = <; $host_address
remote_login:
driver = plaintext
public_name = LOGIN
hide client_send = : remote_username : remote_password
一切都运行良好,符合预期。
问题是我想对选定的一组用户/发件人使用不同的 remote_username 和 remote_password。登录名(对于我的 exim 服务器)是完整的电子邮件地址,因此我已将这些电子邮件地址添加到文件 /etc/differentlogin(即用新行分隔的电子邮件地址列表)。
然后我尝试在 remote_login 部分中进行以下设置:
remote_login:
driver = plaintext
public_name = LOGIN
hide client_send = ${lookup{$authenticated_id}lsearch{/etc/differentlogin}{: different_username : different_passsword}{: remote_username : remote_password}
但是当我尝试发送电子邮件时,出现了以下 EXIM 错误:
== [email protected] R=remote_route T=remote_transport defer (-48): expansion of "${lookup{$authenticated_id}lsearch{/etc/differentlogin}{" failed in mandrill_login authenticator: missing } at end of string
我尝试使用 $sender_address 而不是 $authenticated_id,但是结果仍然相同。
我还尝试用字符串替换要搜索的变量,即:
remote_login:
driver = plaintext
public_name = LOGIN
hide client_send = ${lookup{[email protected]}lsearch{/etc/differentlogin}{: different_username : different_passsword}{: remote_username : remote_password}
但我仍然收到同样的错误。
为了检查我的条件的语法,我尝试将以下内容添加到我的 remote_transport 中:
headers_add = X-SenderTest: ${lookup{$authenticated_id}lsearch{/etc/differentlogin}{different}{normal}}
这会按预期工作,并在从列表 /etc/differentlogin 中列出的地址/登录名发送电子邮件时添加以下标题
X-SenderTest: different
有小费吗?
非常感谢
答案1
出现此问题的原因是 client_send 值是冒号分隔列表中的多个值。因此,解决问题的方法是将值格式化如下:
${lookup{$authenticated_id}lsearch{/etc/differentlogin}{remote_username}{different_username}} : ${lookup{$authenticated_id}lsearch{/etc/differentlogin}{remote_password}{different_passsword}}