0

如何使用 Ruby 的 Mail gem从转发的电子邮件中提取原始消息HTML 内容/文本内容?

到目前为止,我看到的所有示例都与从回复(而不是转发)中提取内容有关,这变得容易得多,因为您只需在--reply above this line--消息中键入即可。

但就我而言,我让人们向我转发确认电子邮件,例如 TripIt 如何解析来自许多不同航空公司电子邮件的航班行程。

问题是“部分”以及包含其他部分的部分有一个复杂的层次结构,我试图想出一种万无一失的方法来找到原始 HTML 源,以便我可以解析它,并从转发的电子邮件原始来源。

m = Mail.read('raw.txt')

m.parts
m.parts.first.parts
m.parts.last.parts.first.parts # never ending....
4

1 回答 1

3

这是我过去所做的,它只是递归地查找最大的 HTML 正文。这可能会因多级前锋而中断,但在我们的例子中,它只需要 1 级前锋深度并且到目前为止效果很好。

由于愚蠢的投票结束了每一个问题,IMO 是合法的,这些天 Stack Overflow 的状态令人遗憾。人们真的希望您将 5000 行 HTML 转储到您的问题中吗,很明显您在问什么

module EmailProcessor
  class Parser
    def initialize(email)
      @email = email
      raise 'must be initialized with type InboundEmail' unless @email.instance_of?(InboundEmail)
    end

    def execute
      mail = Mail.read_from_string(@email.postmark_raw['RawEmail'])
      html = find_original_html(mail)
    end

    private

    def find_original_html(mail)
      bodies = recurse_parts(mail.parts)
      sorted = bodies.sort_by{|b| -b.size}
      puts "PARSED #{sorted.size} BODIES: #{sorted.map{|b| b.size}}"
      sorted.first
    end

    def recurse_parts(parts)
      bodies = []
      parts.each do |part|
        if part.multipart?
          bodies += recurse_parts(part.parts)
        elsif part.content_type =~ /text\/html/
          bodies << part.body.decoded
        end
      end
      bodies
    end
  end
end
于 2019-10-23T01:00:56.527 回答