1

我正在使用 Action Mailbox 在我的 Rails 应用程序中接收电子邮件。当电子邮件包含图像时,我不确定如何将电子邮件保存在数据库中,对其进行解码,然后将其显示给用户,以便可以像我们在 gmail 中查看电子邮件的方式一样显示它。

我用过这个代码-

  class MyMailbox < ApplicationMailbox
    def process
     mail_content = mail.body.decoded
     post = Post.new(title: mail.subject, content: mail_content)
     post.save
    end
   end

这适用于没有任何图像等的电子邮件。但我想要一种方法来保存带有图像的电子邮件。这显然是通过使用多部分电子邮件的不同部分来完成的,但我不确定如何继续。

最后,我想以原始外观显示这些电子邮件。让我知道如何在这里进行。谢谢。

4

1 回答 1

0

在尝试处理电子邮件正文中的图像之前,您应该首先检查电子邮件正文是否是多部分的:

# handle multipart message
body = mail.parts.present? ? mail.parts[0].body.decoded : mail.decoded

多部分电子邮件是什么样的?像这样的东西:

MIME-Version: 1.0
Date: Mon, 8 Nov 2021 19:43:58 +0100
References: <....mail>
In-Reply-To: <....mail>
Message-ID: <...@mail.gmail.com>
Subject: Re: Howdy
From: You <you@example.com>
To: Me <me@example.com>
Content-Type: multipart/alternative; boundary="000000000000376c4305d04b60e2"

--000000000000376c4305d04b60e2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Here is my reply to an original message.

--000000000000376c4305d04b60e2
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div>
  <img src=3D"https://placeholder.img" />
  <img src=3D"https://placeholder.img" />
</div>

--000000000000376c4305d04b60e2--

请注意,电子邮件的 Content-Type 标头包含用于分隔电子邮件部分的边界。既然您可以看到每个部分如何成为不同的内容类型,那么您就有了正确的上下文来了解如何解析每个部分。

https://github.com/mikel/mail#reading-a-multipart-email

Rails 使用mailgem,所以你应该参考他们的文档来了解完整的功能。但简而言之,您可以执行以下操作:

if mail.parts.present? && mail.parts[0].content_type == 'text/html'
  sanitized = Rails::Html::WhiteListSanitizer.new.sanitize(mail.parts[0], tags: ['img'])
  # => "\n    <img src=\"https://placeholder.img\">\n    <img src=\"https://placeholder.img\">\n\n"
  html_doc = Nokogiri::HTML(sanitized)
  html_doc.to_s
  # => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<img src=\"https://placeholder.img\">\n  <img src=\"https://placeholder.img\">\n</body></html>\n"
end

要显示消息的原始内容,只需完整保存该部分即可。您必须推断内容类型将其与数据库中的消息一起存储。

假设您正在保存 HTML 消息,您可以使用 Rails 附带的 Nokogiri 来生成 HTML 文档。

于 2021-11-09T09:23:10.930 回答