【问题标题】:E-Mail's body format after procmail processingprocmail 处理后的电子邮件正文格式
【发布时间】:2014-11-30 17:04:59
【问题描述】:

我有以下场景:

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

我怎样才能做到这一点?

【问题讨论】:

  • 您可以使用formail -zxSubject: 使sed 部分变得不必要。

标签: linux procmail


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

【讨论】:

  • 谢谢!这正是我一直在寻找的。坦率地说,我曾经在编写脚本时经常使用“”技巧,但这次我的记忆显然让我失望了。顺便说一句,我删除了 f 标志,一切仍然正常!
  • 呃,这不是“技巧”,它是 shell 的基本特性。
  • 你是对的!回答您的问题:是的,process.py 读取 res.txt 以进行进一步分析。不错的猜测 ;-) 很可能我需要更详细地说明它以将其发送到远程服务器,最终版本的 process.py 将处理该文件。现在它处于开发的早期阶段。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多