使用Rails将图像嵌入电子邮件的正确方法是什么?

时间:2011-02-07 05:51:20

标签: ruby-on-rails actionmailer

使用Rails将图像嵌入电子邮件的正确方法是什么?

6 个答案:

答案 0 :(得分:60)

我将Oksana的答案与自定义助手方法结合起来,并使以下工作得非常好。

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&gt; = 2中使用。为了使这项工作在ruby&lt; 2您将不得不使用旧方法处理关键字选项。

答案 1 :(得分:29)

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附件网址:

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

答案 2 :(得分:21)

添加到Oksana和tdubs&#39;答案

模块tdubs在桌面上编写了作品,但对于移动gmail客户端,图像显示为附件。要解决此问题,请执行

应用程序/助手/ 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的回答。

答案 3 :(得分:14)

经过大量研究后,我发现将图像嵌入电子邮件的方式非常简洁。 只需在production.rbdevelopment.rb

中添加以下行
config.action_mailer.asset_host = 'YOUR HOST URL'

在您的视图中使用以下代码嵌入图像。

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

注意:请务必更新您的主机网址我的网站Logo.png   上面的代码。

有关Action Mailer使用的基本详情,请参阅ActionMailer::Base

答案 4 :(得分:5)

从此处粘贴的复制件

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以获取相对内容ID路径对于图像源:

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

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

由于我们正在使用Action View的image_tag方法,您可以传入您想要的任何其他选项:

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

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

答案 5 :(得分:0)

我对rails知之甚少,但我曾在C#中开展过创建电子邮件的项目,然后通过Google API将它们插入到用户收件箱中。要创建电子邮件,我必须从头开始生成电子邮件字符串。如果为电子邮件启用multipart,则图像字节将使用base64编码包含在多部分中。

您可能需要查看TMail和RubyMail软件包,看看它们是否支持这些操作。