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