Как правильно встраивать изображение в электронную почту с помощью Rails? - PullRequest
57 голосов
/ 07 февраля 2011

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

Ответы [ 6 ]

62 голосов
/ 12 сентября 2014

Я объединил ответ Оксаны с пользовательским подходом помощника и получил следующее, чтобы работать хорошо:

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

32 голосов
/ 26 сентября 2016

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) %>
21 голосов
/ 13 мая 2015

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

14 голосов
/ 02 февраля 2016

После долгих исследований я нашел очень чистый способ встраивания изображения в электронную почту. Просто добавьте следующую строку в production.rb и development.rb

config.action_mailer.asset_host = 'YOUR HOST URL'

По вашему мнению, вставьте изображение, используя следующий код.

<%= image_tag('My Web Site Logo.png') %>

Примечание. Обязательно обновите URL ВАШЕГО ХОЗЯИНА и Мой веб-сайт Logo.png in код выше.

Основные сведения об использовании Action Mailer см. В ActionMailer :: Base .

.
5 голосов
/ 24 июня 2016

Копия вставлена ​​отсюда

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' -%>
0 голосов
/ 07 февраля 2011

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

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

...