Mail Gem:在浏览器中渲染收到的电子邮件/完整解析html部分

时间:2013-12-02 18:45:34

标签: ruby-on-rails ruby ruby-on-rails-4 mail-gem

我正在使用Mail Gem在我的Rails 4应用程序中接收电子邮件。邮件每隔10分钟从邮箱通过POP抓取,通过宝石。

我需要渲染这些电子邮件 - 主要是HTML格式 - 并且无法在HTML中保存正文,更不用说处理嵌入式图像等内容了。我可能在这里遗漏了一些东西 - 看着StackOverflow,但还没有找到相关问题的答案。

我一直在使用

message.body.decoded

还查看了html_part v.text_part - 但我没有看到一个方法来获取所附的HTML。看起来我需要剥离邮件宝石似乎留在身体中的标题 - 然后还处理任何内联附件。当然必须有一个宝石......?或者一种方法......?你的建议很有价值。

我确实找到了Mailcatcher Gem - 但这确实是它自己的Sinatra应用程序。我可能只是尝试调整这个宝石,但这似乎是很多工作。当然其他人已经处理过这个问题..?

我还会重视关于如何在MySQL中最好地存储邮件正文的建议 - 我想的是大文本或blob类型。

谢谢!

2 个答案:

答案 0 :(得分:0)

我使用letter opener 它工作正常......如果你使用vagrant作为主要的开发机器,你可以使用它 Letter opener web

答案 1 :(得分:0)

我在最后几天工作,我认为我找到了解决方案。

首先,你必须找出邮件是否是多部分,

mail.multipart?

如果邮件不是多部分,你可以得到这样的身体,

mail.body.decoded

如果邮件是多部分,则必须选择是否要存储html或文本部分。但是当然你可以存储这两个部分,它就在你身上。

#for html part

html_decoded_body = nil

mail.parts.each do |part|
  if part.content_type.include?('html')
    html_decoded_body = part.body.decoded
  end
end

 #for text part

 text_decoded_body = nil

 mail.parts.each do |part|
  if part.content_type.include?('text')
    text_decoded_body = part.body.decoded
  end
end

然后,您需要在将此正文保存到数据库之前强制进行编码。

(html_decoded_body || text_decoded_body).force_encoding('UTF-8')

此时您已准备好在您的数据库中保存电子邮件正文,但稍后,当您尝试呈现此HTML时,您会发现您仍然可以看到一些奇怪的内容和您的链接和图片无法正常工作。原因很简单。电子邮件正在使用一些奇怪的编码(阅读本文以获取更多信息https://en.wikipedia.org/wiki/Quoted-printable)并且您已经再次对其身体进行解码。我正在使用这个JS库:https://github.com/mathiasbynens/quoted-printable

所以最后的代码是javascript。

quotedPrintable.decode(email_body)

和wuaala。