procmail中传入电子邮件的过滤器正文

procmail中传入电子邮件的过滤器正文

我在配置我的 Linux 机器时遇到了一些问题。

我们正在配置 fetchmail 和 procmail 以便从外部邮件服务器接收电子邮件。当我们想通过使用 procmail 配方中的“pipe”命令获取电子邮件的正文内容时,问题就开始了。

:0fbw
| head -10

我们发现无法将电子邮件的 MIME 部分与电子邮件的正文内容分开。部分输出将显示如下:

Received: by 10.52.155.193 with SMTP id vy1mr1915645vdb.123.1337929665158;
Fri, 25 May 2012 00:07:45 -0700 (PDT)
Received: by 10.52.34.75 with HTTP; Fri, 25 May 2012 00:07:45 -0700 (PDT)
Date: Fri, 25 May 2012 15:07:45 +0800
Message-ID: <CAE1Fe-oWCcM=K9+Nzx1c8kpDd80X3NXmf7XT_8L_KphGVczS=Q@mail.gmail.com>
Subject: test procmail
From: newbie my <[email protected]>
To: qaf azmi <[email protected]>
Content-Type: multipart/alternative; boundary=bcaec53ae9ee6d1da904c0d706c2

--bcaec53ae9ee6d1da904c0d706c2
Content-Type: text/plain; charset=ISO-8859-1

hi there.this is for testing only.

--bcaec53ae9ee6d1da904c0d706c2
Content-Type: text/html; charset=ISO-8859-1

hi there.this is for testing only.<br>

--bcaec53ae9ee6d1da904c0d706c2--

我们只需要正文的内容。所以我们想办法将这封电子邮件转换为纯文本。然后我们将尝试通过在 AWK 中定义内容行来提取内容。当不同类型的电子邮件(例如:gmail、yahoo 等)有自己的格式时,这是一个大问题。因此逐行读取似乎是不可能的,因为我们不知道要读取传入电子邮件的哪一行。有人能解释一下吗?或者我们可以采取不同的解决方案来解决这个问题?谢谢。

答案1

您可以尝试使用文本处理工具来解决这个问题,但最好的选择是使用一些可以将其解析为 MIME 消息的工具。Python 的电子邮件模块可以做到这一点,因此您可以使用类似下面的内容来输出消息文本。(这确实假设 MIME 消息中存在文本/纯文本表示 - 如果情况并非总是如此,您将必须进行一些 HTML 渲染。)

#!/usr/bin/env python

from email.Parser import Parser
from sys import stdin, stdout

message = Parser().parse(stdin)
if not message.is_multipart():
    stdout.write(message.get_payload(decode=True))
else:
    for part in message.get_payload():
        if part.get_content_type() == 'text/plain':
            stdout.write(part.get_payload(decode=True))

此脚本从 stdin 读取消息并将正文输出到 stdout。要使用它,请将内容保存在文件中,例如~/bin/output-body.py并使其可执行。然后只需将消息导入其中,例如cat /tmp/sample.eml | ~/bin/output-body.py

相关内容