Procmail - 将正文传递给bash脚本

时间:2016-01-23 11:42:40

标签: bash procmail

我有一封希望从procmail发送到bash脚本的衬垫邮件。我只希望身体被发送,没有别的。

目前我的.procmailrc看起来像这样:

:0
  *^ Subject.*Xecute Command$
   {
    :0 bf
    | /bin/bash /path/to/script
   }

我的Bash脚本很简单:

#!/bin/bash
echo -e "\rLT 4>$0\r\r" > /dev/ttyS1

我无法从任何地方获得任何输入或输出。

任何指针?

3 个答案:

答案 0 :(得分:1)

如果打算在电子邮件中添加一些装饰并将其打印到串口(?),请尝试使用

之类的配方
:0b
*^ Subject.*Xecute Command$
| ( printf '\rLT 4>'; cat -; printf '\r\r' ) > /dev/ttyS1

如果条件匹配,b标志适用于操作行,因此您不需要大括号和新的无条件配方; the f flag makes no sense at all in this context。 (虽然如果要保留消息以进行进一步处理,您需要添加c标记。)

此外,对于记录,Bash中的$0是当前正在运行的脚本的名称(如果没有运行脚本,则为bash本身),$@是列表命令行参数。但是当Procmail将消息传递给脚本时,它不会使用其中任何一个;它只是在标准输入上提供。

如果你想在外部脚本中执行操作,那当然也没关系;但是像这样的简单动作可能更好地内联编写。如果脚本文件是可执行的并且具有适当的shebang,则您不希望或不需要明确指定bash;有一个shebang的原因是让脚本自成一体。

在回复评论时,这是一个简单的Perl脚本,用于提取第一个身体部位的第一行,并执行替换。

 perl -nle 'next if 1../^$/;
    s/\<foo\>/bar/g;
    print "\rLT 4>$_\r\r"; exit(0)'

如果您sed了解sed\r也不难做到这一点。

答案 1 :(得分:0)

写下你的脚本:

{
echo -e "\rLT 4>"
cat
echo -e "\r\r"
} > /dev/ttyS1

答案 2 :(得分:0)

formail是你的朋友! 将消息传递到:

:0
*^ Subject.*Xecute Command$
| formail -I "" | your-bash-script