Exim 4 管道从 mysql db 选择命令/脚本

Exim 4 管道从 mysql db 选择命令/脚本

是否有在 exim 的管道驱动程序中运行 mysql 查找的选项?

MYSQL_Q_SCRIPT=SELECT script FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'
command = "${lookup mysql {MYSQL_Q_SCRIPT}{$value}

我总是收到这样的错误:

"Expansion of "${lookup" from command "${lookup mysql {SELECT script FROM emails WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'}{$value}}" in run_script transport failed: missing lookup type"

问题是,完全相同的查询在 appenddriver 中运行良好。所以我没有发现错误。

答案1

在管道传输中的命令选项中,空格的处理方式有所不同。在执行任何扩展之前,命令的内容会用空格分隔,然后依次对每个元素执行扩展。引用 TFM 的话:

扩展将依次应用于每个参数,而不是应用于整行。因此,任何包含空格的字符串扩展项都必须用引号引起来,以便包含在单个参数中。设置如下

command = /some/path ${if eq{$local_part}{postmaster}{xx}{yy}}

不会起作用,因为扩展项会被拆分到多个参数中。你必须写

command = /some/path "${if eq{$local_part}{postmaster}{xx}{yy}}"

以确保所有内容都在一个参数中。扩展以这种方式逐个参数完成,因此参数的数量不会因扩展而改变,并且插入变量中的引号或反斜杠不会与外部引用交互。但是,如果您想从单个扩展生成多个参数(或命令名称加参数),这会导致问题。在这种情况下,最简单的解决方案是使用 shell。例如:

command = /bin/sh -c ${lookup{$local_part}lsearch{/some/file}}

相关内容