Как правильно встроить изображение в электронную почту с помощью Rails?

Как правильно встроить изображение в электронную почту с помощью Rails?


person Alexey Zakharov    schedule 07.02.2011    source источник
comment
stackoverflow.com/questions/7520936 / и stackoverflow.com/questions/472450/ даст больше информации.   -  person Mika    schedule 18.08.2012


Ответы (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, вам придется использовать старый способ обработки параметров ключевых слов.

person Tyrone Wilson    schedule 12.09.2014
comment
что интересно, изображения с тире в имени файла превратятся в символы подчеркивания при использовании этого метода - person Pavan Katepalli; 12.05.2015
comment
Не думайте, что я что-то там написал. Может быть результатом URL.encode в помощнике rails image_tag, но я не сталкивался с этим раньше. - person Tyrone Wilson; 12.05.2015
comment
Эй, tdubs, похоже, это работает, но на мобильном телефоне в gmail все изображения будут прикреплены, а не отображаться в строке. Я думаю, вам нужно указать mime_type и кодировку - person Pavan Katepalli; 13.05.2015
comment
Убедитесь, что вы используете attachments.inline[]= в своем помощнике или почтовой программе для встроенного изображения. - person Matt; 13.01.2017
comment
В rails 4.2, если вы встраиваете изображения в строку и хотите видеть их в своем ActionMailer::Preview, вам нужно добавить инициализатор со следующим: ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor). Источник: stackoverflow.com/a/35537303/4553162 - person mahi-man; 07.03.2017
comment
@Matt должен получить больше голосов, а ответ должен быть отредактирован. Строка attachment[image] должна быть attachment.inline[image] в app/helpers/email_helper.rb, чтобы изображение отображалось как встроенное. (Рельсы 5) - person unmultimedio; 24.06.2017
comment
@unmultimedio, почему бы не предложить редактирование с вашими изменениями, и я уверен, что сообщество одобрит, если это поможет лучше ответить на вопрос. В противном случае присылайте свои мысли в личку, и я подумаю над тем, чтобы добавить их :) - person Tyrone Wilson; 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) %>
person Joel    schedule 26.09.2016
comment
@ImranNaqvi рад, что смог помочь! - person Joel; 17.10.2016

Дополнение к ответам Оксаны и 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.

person Pavan Katepalli    schedule 13.05.2015
comment
Осторожнее со своим кодом. Вы указываете определенный тип пантомимы и кодировку, и есть вероятность, что не все ваши изображения будут соответствовать обоим этим - person Tom Prats; 01.05.2016
comment
Я получаю недопустимую последовательность байтов с этим - person Nate Flink; 12.01.2017
comment
@NateFlink, может быть, вы используете неправильный тип пантомимы? Я думаю, что ответ является примером, поэтому вам, вероятно, потребуется получить тип mime из переменной изображения, поэтому вместо mime_type: "image/png" я бы использовал mime_type: "image/#{image.split('.').last}" - person Tyrone Wilson; 13.01.2017
comment
@NateFlink Я также получаю эту ошибку, но если я удалю :encoding, все будет работать нормально. - person Matt; 01.02.2017
comment
Я получаю следующую ошибку при реализации вашего исправления: неверная последовательность байтов в UTF-8. Извлеченный источник (вокруг строки № 4): Rails.root.join(app/assets/images/emails/# {image})), :mime_type =› изображение/png, :encoding =› base64 - person Constantine; 04.05.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.

person Aamir    schedule 02.02.2016
comment
Будьте осторожны, делая это. Вам нужно будет разместить это изображение по этому URL-адресу навсегда, иначе люди больше не смогут правильно просматривать электронную почту. Гораздо лучше встраивать изображения в кодировке base64. - person Joe Woodward; 12.09.2016
comment
Приемлемая оговорка для простоты решения. - person Mike A; 02.01.2018
comment
Это противоположно встраиванию изображения в электронное письмо. Это загрузка удаленного изображения в электронном письме. - person Barry; 07.10.2019

Скопировано отсюда

http://api.rubyonrails.org/classes/ActionMailer/Base.html#class-ActionMailer::Base-label-Inline+Attachments

Встроенные вложения

Вы также можете указать, что файл должен отображаться вместе с другим 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' -%>
person strohy1210    schedule 23.06.2016

Я мало что знаю о рельсах, но я работал над проектами на C#, которые создают электронные письма, а затем вставляют их в папку «Входящие» пользователей через API Google. Чтобы создать электронное письмо, мне пришлось сгенерировать строку электронной почты с нуля. Если вы включите multipart для электронной почты, то байты изображения будут включены в составной раздел с использованием кодировки base64.

Вы можете проверить пакеты TMail и RubyMail, чтобы узнать, поддерживают ли они эти действия для вас.

person regex    schedule 07.02.2011