web-dev-qa-db-fra.com

Quelle est la bonne façon d'intégrer une image dans un e-mail à l'aide de Rails?

Quelle est la bonne façon d'incorporer une image dans un e-mail à l'aide de Rails?

58
Alexey Zakharov

J'ai combiné la réponse d'Oksana avec une approche d'aide personnalisée et j'ai obtenu que les éléments suivants fonctionnent très bien.

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

Ensuite, par exemple, où je veux attacher le logo de l'entreprise dans mon fichier de mise en page d'e-mail que j'utiliserais

app/views/layouts/email.html.erb

<%= email_image_tag("company_logo.png") %>


Notez que les options ** rendent la balise plus extensible, mais elle ne fonctionnera qu'en Ruby> = 2. Pour que cela fonctionne en Ruby <2, vous aurez pour utiliser l'ancienne façon de gérer les principales options de Word.

64
Tyrone Wilson

Rails 5

Dans votre méthode de messagerie, ajoutez votre pièce jointe en ligne pointant vers votre image:

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

Ensuite, dans votre courrier html, consultez un image_tag avec l'URL de la pièce jointe:

<%= image_tag(attachments['logo.png'].url) %>
35
Joel

Ajout aux réponses d'Oksana et de tdubs

Le module tdubs a écrit des travaux sur le bureau, mais pour le client mobile gmail, les images sont apparues sous forme de pièces jointes. Pour résoudre ce problème, procédez comme suit pour le

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

Pour le reste, suivez la réponse de tdubs.

21
Pavan Katepalli

Après de nombreuses recherches, j'ai trouvé un moyen très propre d'intégrer l'image dans un e-mail. Ajoutez simplement la ligne suivante dans production.rb et development.rb

config.action_mailer.asset_Host = 'YOUR Host URL'

Dans votre vue, intégrez l'image en utilisant le code suivant.

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

Remarque: assurez-vous de mettre à jour VOTRE URL d'hôte et Mon site Web Logo.png dans le code ci-dessus.

Pour les détails de base de l'utilisation d'Action Mailer, veuillez vous référer à ActionMailer :: Base .

14
Aamir

Copie collée d'ici

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

Pièces jointes en ligne

Vous pouvez également spécifier qu'un fichier doit être affiché en ligne avec un autre HTML. Ceci est utile si vous souhaitez afficher un logo d'entreprise ou une photo.

    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

Et puis pour référencer l'image dans la vue, vous créez un fichier welcome.html.erb et appelez image_tag en transmettant la pièce jointe que vous souhaitez afficher, puis appelez url sur la pièce jointe pour obtenir le chemin d'ID de contenu relatif pour l'image la source:

  <h1>Please Don't Cringe</h1>

  <%= image_tag attachments['photo.png'].url -%>

Comme nous utilisons la méthode image_tag d'Action View, vous pouvez passer toutes les autres options de votre choix:

 <h1>Please Don't Cringe</h1>

 <%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>
5
strohy1210

Je ne connais pas grand-chose à Rails, mais j'ai travaillé sur des projets en C # qui créent des e-mails, puis les insèrent dans la boîte de réception des utilisateurs via les API Google. Pour créer l'e-mail, j'ai dû générer la chaîne d'e-mail à partir de zéro. Si vous activez le multipart pour l'e-mail, alors les octets d'image seront inclus dans une section multipart utilisant le codage base64.

Vous voudrez peut-être consulter les packages TMail et RubyMail pour voir s'ils prennent en charge ces actions pour vous.

0
regex