#ruby-on-rails #email #rails-activestorage
#ruby-on-rails #Адрес электронной почты #rails-activestorage
Вопрос:
Я использую Ruby On Rails v.5.2.2, активное хранилище и драгоценный камень ‘mail’.
Я пытаюсь сохранить вложения электронной почты на диск, используя активное хранилище.
Я не могу сохранить непосредственно тело вложения в виде ввода-вывода, и ни сохранить его непосредственно во временный файл…
Ответ №1:
Я нашел решение без временного сохранения вложений. Это выглядит следующим образом:
attachments = mail.attachments.map do |attachment|
{ io: StringIO.new(attachment.decoded), filename: attachment.filename }
end
message.files.attach(attachments)
Ответ №2:
Это решение, которое я принял:
mail = Mail.new(body)
# ...
att = mail.attachments.first
temp_file = Tempfile.new('attachment')
begin
File.open(temp_file.path, 'wb') do |file|
file.write(att.body.decoded)
end
@msg.files.attach(io: File.open(temp_file.path), filename: att.filename)
att.filename)
ensure
temp_file.close
temp_file.unlink
end
Ответ №3:
Мое решение задокументировано здесь: https://where.coraline.codes/blog/processing-email-attachments-with-active-storage /
Фрагмент кода:
def process_attachments
email.attachments.each do |attachment|
next unless VALID_MIME_TYPES.include?(attachment.content_type)
issue.uploads.attach(
io: attachment.to_io,
filename: attachment.original_filename,
content_type: attachment.content_type
)
end
end
В случае MailGun, attachment
является экземпляром ActionDispatch::Http::UploadedFile
. Итак attachment.to_io
, вот ключ.