【问题标题】:How to find the original email in a forward using the Mail gem如何使用 Mail gem 在转发中查找原始电子邮件
【发布时间】:2020-02-19 03:07:36
【问题描述】:

如何使用 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....

【问题讨论】:

  • 请阅读“mcve”。我们需要您提供最少的代码来测试问题。这也意味着最少的输入数据和预期的输出。否则,您是在要求我们为您设计一个测试套件,它可能会也可能不会解决您遇到的问题。换句话说,我们会猜测并浪费我们的时间,因此我们需要您帮助我们缩小情况范围。

标签: ruby-on-rails ruby email email-attachments mail-gem


【解决方案1】:

这是我过去所做的,它只是递归地查找最大的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2016-08-21
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多