如何在Rails中正确显示提取的电子邮件内容?

时间:2013-08-04 07:40:44

标签: html ruby-on-rails ruby gmail nokogiri

以下是我用于获取电子邮件并将其存储到我的数据库中的代码:

emails = imap.search([fp.filter_type, "#{fp.value}"])

emails.each do |message_id|

  msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
  mail = Mail.read_from_string msg

  Email.create({
    :user_id    => self.id,
    :message_id => message_id.to_s,
    :email_from => mail.from[0], 
    :subject    => mail.subject, 
    :content    => mail.multipart? ? mail.html_part : mail.body.decoded,
    :sent_at    => mail.date
    }) if !Email.find_by_message_id(message_id.to_s)
end

当我呈现电子邮件记录的内容时,它无法正确显示。但是,我的GMail帐户上的电子邮件看起来很棒。我需要一种方法来存储正确的HTML并显示它就像在我的电子邮件帐户中看到的那样。我还需要解析这些电子邮件中的数据,这很困难,因为DOM结构真的搞砸了。

1 个答案:

答案 0 :(得分:0)

以下是工作代码:

emails = imap.search([fp.filter_type, "#{fp.value}"])

emails.each do |message_id|

  msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
  mail = Mail.read_from_string msg
  Email.create({
    :user_id            => self.id,
    :message_id         => message_id.to_s,
    :email_from         => mail.from[0], 
    :subject            => mail.subject, 
    :content            => mail.multipart? ? mail.html_part.body.to_s : mail.body.to_s,
    :merchant_id        => merchant.id,
    :filter_id          => filter.id,
    :filter_property_id => fp.id,
    :sent_at            => mail.date
    }) if !Email.find_by_message_id(message_id.to_s)
end

Email.all.collect {|e| e.run_parsers} if emails.size > 0 # ideally this should be initiated from email model

使用此代码,我可以获得正确的HTML,视图与我的GMail完全相同,或多或少。