【发布时间】:2019-08-18 08:19:06
【问题描述】:
我正在尝试实现一项功能,我需要解析来自 s3 的电子邮件并将其附件提取到载波上传器中:我需要将 Mail::Part 保存为载波附件。
我正在阅读存储在 s3 中的电子邮件,并使用 mailer gem 对其进行解析,所以我基本上以多部分电子邮件结束。到目前为止,我已经完成了 body 的解析,但现在我需要处理电子邮件附件。
我在这里:
s3 = ::Aws::S3::Encryption::Client.new(
region: 'eu-west-1',
kms_key_id: 'my-key',
)
object = s3.get_object(
bucket: bucket,
key: key,
)
s3_email = object.body.read
mail = ::Mail.new(s3_email) # Mail::Message
mail.attachments
# => [#<Mail::Part:70154514749400, Multipart: true, Headers: <Content-Type: multipart/alternative; boundary="------------0739BEA5795DFFE28DCBAECD">>, #<Mail::Part:70154514744360, Multipart: false, Headers: <Content-Type: application/pdf; x-mac-type="0"; x-mac-creator="0"; name="my_attachment.pdf">, <Content-Transfer-Encoding: base64>, <Content-Disposition: attachment; filename="my_attachment.pdf">>]
我需要将其存储为载波上传器
class Message
include Mongoid::Document
mount_uploader :attachment, ::AttachmentUploader
end
# Message.new(attachment: mail.attachments.first) ==> I want to do something like this
我不确定如何将其作为 Carrierwave 附件传输。
另外,我知道 Griddler,但这个 gem 似乎不包含我正在寻找的代码(或者我可能错过了)
编辑
我正在尝试使用临时文件按照此处 https://github.com/mikel/mail#testing-and-extracting-attachments 的说明进行操作,但事情并没有按计划进行
tempfile = Tempfile.new(filename)
tempfile.write(attachment.decoded)
# => *** Encoding::UndefinedConversionError Exception: "\xFF" from ASCII-8BIT to UTF-8
【问题讨论】:
-
你能做到吗?
mail.attachments.filename #=> 'test.png'按文件名或索引返回附件。然后您可以将该响应包装在Message.new(attachment: File.open('test.png''))?还是那行不通? -
我已经编辑了我的问题。我正在阅读来自 AWS S3 文件的多部分电子邮件,所以我所拥有的只是“原始”多部分文件和邮件程序 gem 中的解析版本。我不知道如何将附件多部分版本提取到文件中,这就是我想要做的 ^^ 类似
email.attachments.first.to_file的东西,除了这不起作用
标签: ruby-on-rails email ruby-on-rails-5 carrierwave email-attachments