Каков правильный способ встраивания изображения в электронную почту с помощью Rails?
Каков правильный способ встраивания изображений в электронную почту с помощью Rails?
Ответ 1
Я объединил ответ от Oksana с пользовательским вспомогательным подходом и получил следующее, чтобы работать довольно хорошо.
app/helpers/email_helper.rb
module EmailHelper
def email_image_tag(image, **options)
attachments[image] = File.read(Rails.root.join("app/assets/images/#{image}"))
image_tag attachments[image].url, **options
end
end
app/mailers/base_mailer.rb
class BaseMailer < ActionMailer::Base
add_template_helper(EmailHelper)
end
app/mailers/my_mailer.rb
class MyMailer < BaseMailer
def send_my_mail(email)
mail to: email, subject: "My Subject"
end
end
Тогда, например, если я хочу добавить логотип компании в свой файл макета электронной почты, я бы использовал
app/views/layouts/email.html.erb
<%= email_image_tag("company_logo.png") %>
Обратите внимание, что опции ** делают тег более расширяемым, но он работает только в ruby >= 2. Чтобы сделать эту работу в ruby < 2 вам придется использовать более старый способ обработки ключевых слов.
Ответ 2
Добавление на ответы Oksana и tdubs
Модуль tdubs пишет работы на рабочем столе, но для мобильного gmail-клиента изображения отображаются как вложения. Чтобы исправить это, сделайте это для
Приложение/хелперы/email_helper.rb
module EmailHelper
def email_image_tag(image, **options)
attachments[image] = {
:data => File.read(Rails.root.join("app/assets/images/emails/#{image}")),
:mime_type => "image/png",
:encoding => "base64"
}
image_tag attachments[image].url, **options
end
end
В остальном следуйте ответам на tdubs.
Ответ 3
RAILS 5
В вашем почтовом методе добавьте встроенное вложение, указывающее на ваше изображение:
class ConfirmationMailer < ActionMailer::Base
def confirmation_email
attachments.inline["logo.png"] = File.read("#{Rails.root}/app/assets/images/logo.png")
mail(to: email, subject: 'test subject')
end
end
Затем в вашей почте html просмотрите image_tag
с URL-адресом приложения:
<%= image_tag(attachments['logo.png'].url) %>
Ответ 4
После многих исследований я нашел очень чистый способ встраивания изображений в электронную почту.
Просто добавьте следующую строку в production.rb
и development.rb
config.action_mailer.asset_host = 'YOUR HOST URL'
По вашему мнению вставьте изображение, используя следующий код.
<%= image_tag('My Web Site Logo.png') %>
Примечание. Обязательно обновите ВАШ ХОСТ-URL и Мой веб-сайт Logo.png в над кодом.
Подробные сведения об использовании Action Mailer см. в ActionMailer:: Base.
Ответ 5
Копия, вставленная здесь
Встроенные вложения
Вы также можете указать, что файл должен отображаться в строке с другим HTML. Это полезно, если вы хотите отображать корпоративный логотип или фотографию.
class Notifier < ApplicationMailer
def welcome(recipient)
attachments.inline['photo.png'] = File.read('path/to/photo.png')
mail(to: recipient, subject: "Here is what we look like")
end
end
Затем, чтобы ссылаться на изображение в представлении, вы создаете файл welcome.html.erb и делаете вызов image_tag, проходящего во вложении, которое хотите отобразить, а затем вызываете url на вложении, чтобы получить путь относительного содержания для источника изображения:
<h1>Please Don't Cringe</h1>
<%= image_tag attachments['photo.png'].url -%>
Поскольку мы используем метод Action View image_tag, вы можете передать любые другие параметры, которые вы хотите:
<h1>Please Don't Cringe</h1>
<%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>
Ответ 6
Я не знаю много о рельсах, но я работал над проектами на С#, которые создают электронные письма, а затем вставляют их в почтовый ящик пользователей через API Google. Чтобы создать письмо, мне пришлось сгенерировать строку с нуля. Если вы включите multipart для электронной почты, тогда байты изображения будут включены в многостраничный раздел с использованием кодировки base64.
Вы можете проверить пакеты TMail и RubyMail, чтобы узнать, поддерживают ли они эти действия для вас.