procmail处理后的电子邮件正文格式

时间:2014-10-06 12:26:28

标签: linux procmail

我有以下场景:

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 脚本要求邮件的正文部分维护电子邮件的原始格式。

我怎样才能做到这一点?

1 个答案:

答案 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(或您创建的包装器,如果您无法修改它)。