【发布时间】:2017-08-30 07:40:01
【问题描述】:
我需要在 exim 下运行一个 shell 脚本,它可以读取每封收到的电子邮件,可选择重写它们,然后继续发送电子邮件。
理想的解决方案类似于 UNIX 管道:
cat *incoming email* | **some-script.sh** | *back to exim processing*
我希望脚本尽早运行,以便例如更改目标地址。
Exim 可以做到这一点吗?如何实现?
【问题讨论】:
我需要在 exim 下运行一个 shell 脚本,它可以读取每封收到的电子邮件,可选择重写它们,然后继续发送电子邮件。
理想的解决方案类似于 UNIX 管道:
cat *incoming email* | **some-script.sh** | *back to exim processing*
我希望脚本尽早运行,以便例如更改目标地址。
Exim 可以做到这一点吗?如何实现?
【问题讨论】:
您可以使用管道另一侧的脚本创建使用管道传输的路由器:
begin routers
preprocessor:
driver = accept
condition = if{ !eq{$header_X-Preproceeded}{yes}}
transport = myscript
no_more
. . . . .
begin transports
myscript:
driver = pipe
user = scriptowner
command = /path/to/script --opt1 --opt2
如果传入消息没有X-Preproceeded 标头或其值未设置为yes,则消息将传递到myscript 传输。这是通过管道source | script 执行的,所有消息都传递到脚本的stdin。继续后,如果您想将已处理的消息返回给 exim,则应在消息中添加 x-Preproceeded: yes 标头,以防止将其路由到下一圈。然后你必须通过sendmail 命令提交。
#!/bin/sh
. . . .
mandatory_empty_line = ''
cat << ENDOFTEXT | /usr/sbin/sendmail -t
$headers
X_Preproceeded: yes
$mandatory_empty_line
$message_body
ENDOFTEXT
请记住,应通过 exim 的配置将有效的用户运行脚本添加到受信任的用户中,以允许从任意地址发送。否则exim 将用scriptowner@mydomain.tld 替换任何发件人的地址
【讨论】: