Фильтровать тело входящей почты в 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
,