解析可能是html或各种奇怪编码的原始电子邮件并将其转换为纯文本,松树的方式可能会显示它

问题描述:

我想这样做的原因是为了便于解析出指令通过电子邮件发送给机器人,这是majordomo可能会用来解析订阅和取消订阅等命令的一种方式。事实证明,有很多疯狂的格式和东西需要处理,比如引用文本,区分标题和正文等。解析可能是html或各种奇怪编码的原始电子邮件并将其转换为纯文本,松树的方式可能会显示它

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

不能说我已经完全按照你所说的去做了,但是也许你应该给它一个阅读,因为它听起来像作者正在做你所描述的。

Parsing MIME & HTML

+0

谢谢,确实非常有帮助。注意缺少URL中的最终“l”。 – dreeves 2008-09-25 21:38:54

一些想法: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 
} 

对于与电子邮件相关的模块,您可能会比看CPAN更糟糕。

一,我已经在过去用于打破学科和机构一直Email::Simple

的Python有email

>>> 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将文本移出。