如何使用 Mail gem 在转发中查找原始电子邮件

How to find the original email in a forward using the Mail gem

如何使用 Ruby 的邮件 gem 从邮​​件中提取 原始邮件 HTML content/text 内容转发 电子邮件?

到目前为止,我看到的所有示例都与从回复(而不是转发)中提取内容有关,这变得容易得多,因为您只需在消息中键入 --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....

这是我过去所做的,只是递归地寻找最大的 HTML 体。这可能会打破多级前向,但在我们的例子中,它只需要 1 级前向深度,到目前为止效果很好。

不幸的是,由于愚蠢的投票结束了每一个问题,这几天 Stack Overflow 的状态是 IMO 是合法的。人们真的希望您将 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