Как правильно встроить изображение в электронную почту с помощью Rails?
Как правильно встроить изображение в электронную почту с помощью Rails?
Ответы (6)
Я объединил ответ Оксаны с индивидуальным вспомогательным подходом и получил следующее, чтобы работать довольно хорошо.
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, вам придется использовать старый способ обработки параметров ключевых слов.
attachments.inline[]=
в своем помощнике или почтовой программе для встроенного изображения.
- person Matt; 13.01.2017
ActionMailer::Preview
, вам нужно добавить инициализатор со следующим: ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor)
. Источник: stackoverflow.com/a/35537303/4553162
- person mahi-man; 07.03.2017
attachment[image]
должна быть attachment.inline[image]
в app/helpers/email_helper.rb
, чтобы изображение отображалось как встроенное. (Рельсы 5)
- person unmultimedio; 24.06.2017
РЕЙЛС 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) %>
Дополнение к ответам Оксаны и tdubs
Модуль, написанный tdubs, работает на рабочем столе, но для мобильного клиента Gmail изображения отображались как вложения. Чтобы исправить это, сделайте это для
app/helpers/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.
mime_type: "image/png"
я бы использовал mime_type: "image/#{image.split('.').last}"
- person Tyrone Wilson; 13.01.2017
:encoding
, все будет работать нормально.
- person Matt; 01.02.2017
После долгих исследований я нашел очень чистый способ встроить изображение в электронную почту. Просто добавьте следующую строку в production.rb
и development.rb
config.action_mailer.asset_host = 'YOUR HOST URL'
В вашем представлении вставьте изображение, используя следующий код.
<%= image_tag('My Web Site Logo.png') %>
Примечание. Обязательно обновите ВАШ URL-адрес хоста и My Web Site Logo.png в приведенном выше коде.
Основные сведения об использовании Action Mailer см. в ActionMailer::Base.
Скопировано отсюда
Встроенные вложения
Вы также можете указать, что файл должен отображаться вместе с другим 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 -%>
Поскольку мы используем метод image_tag Action View, вы можете передать любые другие параметры, которые хотите:
<h1>Please Don't Cringe</h1>
<%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>
Я мало что знаю о рельсах, но я работал над проектами на C#, которые создают электронные письма, а затем вставляют их в папку «Входящие» пользователей через API Google. Чтобы создать электронное письмо, мне пришлось сгенерировать строку электронной почты с нуля. Если вы включите multipart для электронной почты, то байты изображения будут включены в составной раздел с использованием кодировки base64.
Вы можете проверить пакеты TMail и RubyMail, чтобы узнать, поддерживают ли они эти действия для вас.