Quelle est la bonne façon d'incorporer une image dans un e-mail à l'aide de Rails?
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.
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) %>
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.
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 .
Copie collée d'ici
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' -%>
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.