解析可能采用html或者各种奇怪编码的原始电子邮件并将其转换为纯文本,例如pine可能会显示它

时间:2020-03-06 14:45:05  来源:igfitidea点击:

我想要这样做的原因是使解析发送给机器人的指令变得容易,而majordomo可能会解析诸如订阅和取消订阅之类的命令。事实证明,有很多疯狂的格式和要处理的事情,例如带引号的文本,区分标题和正文等。

一个perl模块可以做到这一点,但是欢迎使用任何语言的解决方案。

解决方案

不能说我已经完全按照意思做了,但是也许我们应该读一读,因为听起来作者在做我们所描述的事情。

解析MIME和HTML

一些想法: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\n/gs;

  return $email
}

我们可能会比考虑与电子邮件相关的模块的CPAN还要糟糕。

我过去用来突破主题和机构的一种是Email :: Simple

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从中获取文本。