Mail Gem: визуализация полученного письма в браузере / полный анализ html-частей

Я работаю с Mail Gem для получения писем в моем приложении на Rails 4. Почта захватывается через POP из почтового ящика, каждые 10 минут или около того, через Gem.

Мне нужно визуализировать эти электронные письма - в основном в формате HTML - и у меня возникают проблемы с сохранением тела в HTML, не говоря уже о работе с такими вещами, как встроенные изображения. Я, наверное, что-то здесь упускаю - просмотрел весь Stackru, но пока не видел ответа на похожие вопросы.

Я работал с

message.body.decoded

и также посмотрел на html_part v. text_part - но я не вижу метода, чтобы добраться только до вложенного HTML. Похоже, мне нужно удалить заголовки, которые Mail Gem оставляет в теле, а затем работать с любыми встроенными вложениями. Конечно, жемчужина для этого должна существовать..? Или подход...? Ваш совет ценится.

Я нашел http://mailcatcher.me/ - но это действительно его собственное приложение Sinatra. Я мог бы просто попытаться адаптировать этот драгоценный камень, но это, кажется, большая работа. Конечно, кто-то еще уже имел дело с этой проблемой..?

Я также оценил бы предложение о том, как лучше всего хранить тело сообщения в MySQL - я думаю о крупном тексте или типе BLOB-объектов.

Спасибо!

2 ответа

Я работал над этим в последние дни, и я думаю, что нашел решение.

Во-первых, вы должны выяснить, является ли почта составной,

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)

И ууаала.

Я использую средство для открывания писем. Оно отлично работает... И если вы используете vagrant в качестве основной машины для разработки, вы можете использовать это средство для открывания писем.

Другие вопросы по тегам