我已经设置了 exim 来从 sqlite 数据库获取自动回复文本。它可以正常发送自动回复,只是我无法在自动回复中获得新行。
这是运输线路:
text = ${lookup sqlite{SQLDB \
SELECT body FROM autoreply WHERE \
(username='$local_part' AND domain='$domain') \
AND (sender ='$sender_address' or sender ='$reply_address' or sender ='*') \
AND enabled=1 \
AND (valid_from <= strftime('%s', 'now') OR valid_from IS NULL) \
AND (valid_to >= strftime('%s', 'now') OR valid_to IS NULL) \
LIMIT 1\
}\
}
正如我提到的,这返回了正确的文本,电子邮件只包含实际字符 \n,而不是新行。
我尝试过像 \\n 这样的东西,但没有任何效果。
我已经在网上搜索了很长一段时间,却找不到任何关于如何做这件事或任何说不能做这件事的信息。
答案1
我假设您已将换行符作为转义序列存储在数据库中,即字符串“ \n
”而不是实际的换行符。sqlite 查找将返回该字符串,并且 Exim 会很乐意将字符串原封不动地放入自动回复消息中。原因是查找已经是字符串扩展;您可以将其用作另一个字符串的一部分,在这种情况下,Exim 会将其替换为数据库中的内容。Exim 不会再次扩展它。
为了让 Exim 扩展查找结果中的字符文字,您需要通过使用运算符包围整个查找来明确告诉它这样做expand
,如下所示:
text = ${expand:${lookup sqlite{SQLDB \
SELECT body FROM autoreply WHERE \
...
}}}
然后,Exim 将获取查找返回的字符串并对其进行扩展。有关详细信息,请参阅Exim 规范,第十一章,第 6 部分,关于扩展运算符和第九章关于文件和数据库查找。