Фильтровать тело входящей почты в procmail

Я столкнулся с некоторой проблемой при настройке моей машины Linux.

Мы настраиваем fetchmail и procmail для получения электронной почты от внешнего почтового сервера. Проблема начинается, когда мы хотим получить основное содержимое письма, используя команду "pipe" в рецепте procmail.

: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 <newbie.my@gmail.com>
To: qaf azmi <qafazmi@gmail.com>
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))

Этот скрипт читает сообщение из стандартного ввода и выводит тело на стандартный вывод. Чтобы использовать его, сохраните содержимое в файле, таком как ~/bin/output-body.py и сделать его исполняемым. Затем просто отправьте сообщения, например cat /tmp/sample.eml | ~/bin/output-body.py,

Другие вопросы по тегам