解析可能采用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/\ \;/ /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从中获取文本。