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

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

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


person Community    schedule 25.09.2008    source источник


Ответы (4)


У Python есть электронная почта.

>>> import email
>>> p = email.Parser.Parser()
>>> msg = p.parsestr("From: [email protected]\nSubject: Hello\nDear Sir or Madam...")
>>> msg.get("Subject")
Hello
>>> msg.get_payload()
'Dear Sir or Madam...'

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

person Torsten Marek    schedule 26.09.2008

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

Анализ MIME и HTML

person Shane    schedule 25.09.2008

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

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

person Community    schedule 25.09.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
}
person Community    schedule 25.09.2008