我有以下场景:
GNU / Linux机器上的SMTP服务器正在接受邮件。接受的邮件正被发送到procmail进行进一步处理。这是我的 .procmailrc :
VERBOSE=yes
LOGFILE=$HOME/procmail.log
SUBJECT=`formail -xSubject: | tr -d '\n' | sed -e 's/^ //' | /usr/bin/perl -MEncode -ne 'print encode ("utf8",decode ("MIME-Header",$_ )) '`
FROM=`formail -rt -xTo:`
DATE=`formail -xDate:`
BODY=`formail -I ""`
:0fbW
* ^From.*some_special_name@special_server.com
| echo "FROM:$FROM" > $HOME/res.txt; \
echo "DATE:$DATE" >> $HOME/res.txt; \
echo "SUB:$SUBJECT" >> $HOME/res.txt; \
echo "BODY:" >> $HOME/res.txt; \
echo $BODY >> $HOME/res.txt; process.py
这个小脚本首先创建一个本地文件 $ HOME / res.txt ,然后启动另一个名为 process.py 的脚本。现在, $ HOME / res.txt 将填充以下条目:
FROM:some_special_name@special_server.com
DATE:Mon, 06 Oct 2014 13:14:32 +0200
SUB:Some subject
BODY:
This is a multi-part message in MIME format. --------------030006020609010705060803 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello, Some kind of long tekst where I cannot see the line feed chars nor any other control chars...
正文包含没有正文原始格式的原始字符串。我的意思是\ n或\ t字符被过滤掉了。 process.py 脚本要求邮件的正文部分维护电子邮件的原始格式。
我怎样才能做到这一点?
答案 0 :(得分:1)
与shell脚本一样,除非特别要求shell对值执行令牌拆分和通配符扩展,否则需要正确地对引用变量进行引用。参见例如this answer有详细解释。
echo "$BODY" >>$HOME/res.txt; \
此外,我不明白为什么要混合多个这样的动作。在这些行之间,我想你的意思是process.py
读取res.txt
而不是标准输入;如果它正在读取标准输入,它将收到正确的,未解码的消息。
如果没有上下文,我会匆匆忙忙地推测f
标志也是错误的。除非process.py
在标准输出上打印一条新消息,该消息应替换Procmail配方文件剩余部分的传入消息,否则您应该将其取出。
此处还存在竞争条件:如果多个消息几乎同时到达(如果您的系统负载很重,“同一时间”可能是一个相当宽的窗口),它们将覆盖res.txt
和以不可预测的方式践踏彼此的结果。通常的解决方案是使用本地锁文件;但是,非常优越的解决方案是删除对临时文件的需求,并更改process.py
以使其读取标准输入。
因为你无论如何都在使用Python,我会在Python中进行所有头部解析,可能除了formail -rtzxTo:
,这对于重新实现来说相当复杂;这将显着简化您的Procmail配方,并可能改进process.py
(或您创建的包装器,如果您无法修改它)。