Анализ необработанного сообщения электронной почты, которое может быть в формате html или различных странных кодировок, и преобразование его в простой текст, как, например, в pine может отображать его - PullRequest
3 голосов
/ 26 сентября 2008

Причина, по которой я хочу это сделать, состоит в том, чтобы упростить синтаксический анализ инструкций, отправляемых боту по электронной почте, и то, что majordomo может сделать для анализа команд, таких как подписка и отписка. Оказывается, есть много сумасшедших форматов и вещей, с которыми приходится иметь дело, таких как цитируемый текст, различение заголовка и тела и т. Д.

Для этого идеально подойдет модуль perl, но приветствуются решения на любом языке.

Ответы [ 4 ]

4 голосов
/ 26 сентября 2008

Python имеет адрес электронной почты .

>>> import email
>>> p = email.Parser.Parser()
>>> msg = p.parsestr("From: me@example.com\nSubject: Hello\nDear Sir or Madam...")
>>> msg.get("Subject")
Hello
>>> msg.get_payload()
'Dear Sir or Madam...'

Он поддерживает MIME и почти все кодировки, которые включены в Python. HTML будет просто текстом для него, но вы можете использовать BeautifulSoup или Tidy + ElementTree, чтобы извлечь из него текст.

2 голосов
/ 26 сентября 2008

Не могу сказать, что я все сделал именно то, о чем вы говорите, но, возможно, вам следует прочитать это, как будто автор делает то, что вы описываете.

Парсинг MIME & HTML

0 голосов
/ 26 сентября 2008

Вы могли бы сделать хуже, чем посмотреть CPAN для модулей, связанных с электронной почтой.

Тот, который я использовал в прошлом для разбивания предметов и тел, был Email :: Simple

0 голосов
/ 26 сентября 2008

Некоторые идеи: http://news.ycombinator.com/item?id=666607

Вот мое неполное решение, которое на самом деле работает для моих целей (парсинг команд по электронной почте боту). Я держу это здесь для справки, пока не будет окончательно лучшего ответа.

# Take an email as a big string and turn it into a plain ascii equivalent.
# TODO: leave any html tags inside of quotes alone.
sub plainify {
  my($email) = @_;

  # translate quoted-printable or whatever this crap is to plain text.
  $email =~ s/\=0D\=0A/\n/gs;
  $email =~ s/\=0A/\n/gs;
  $email =~ s/\=A0/ /gs;
  $email =~ s/\=2E/\./gs;
  $email =~ s/\=20/\ /gs;
  $email =~ s/\=([\n\r]|\n\r|\r\n)//gs;

  # translate html to plain text (or enough of it to parse commands).
  $email =~ s/\&nbsp\;/ /gs;
  $email =~ s/\<br\>/\n/gis;
  $email =~ s/(\<[^\>]+\>)/\n$1\n/gs;

  return $email
}
...