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

Posted

技术标签:

【中文标题】使用 Rails 将图像嵌入电子邮件的正确方法是啥?【英文标题】:What is the right way to embed image into email using Rails?使用 Rails 将图像嵌入电子邮件的正确方法是什么? 【发布时间】:2011-06-22 13:11:59 【问题描述】:

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

【问题讨论】:

***.com/questions/7520936/… 和 ***.com/questions/472450/… 将提供更多信息。 【参考方案1】:

我将 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

&lt;%= email_image_tag("company_logo.png") %&gt;


注意 **options 使标签更具可扩展性,但它仅适用于 ruby​​ >=2。要在 ruby​​

【讨论】:

有趣的是文件名中带破折号的图片在使用这个方法时会变成下划线 不要以为这是我在那里写的。可能是 rails image_tag helper 中 URL.encode 的结果,但我之前没有经历过。 确保在帮助程序或邮件程序中使用 attachments.inline[]= 来获取内联图像。 在 rails 4.2 中,如果您嵌入图像并希望在您的 ActionMailer::Preview 中看到它们,您需要添加一个带有以下内容的初始化程序:ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor)。来源:***.com/a/35537303/4553162 @Matt 应该得到更多的支持,并且应该编辑答案。行attachment[image] 需要在app/helpers/email_helper.rb 中为attachment.inline[image],才能将图像呈现为内联。 (轨道 5)【参考方案2】:

铁路 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 中查看带有附件 url 的 image_tag

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

【讨论】:

【参考方案3】:

添加到 Oksana 和 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 的回答。

【讨论】:

小心你的代码。您正在指定特定的 mime 类型和编码,但并非所有图像都匹配这两者 我得到一个无效的字节序列 @NateFlink,可能是您没有使用正确的 mime 类型?我认为答案是一个示例,因此您可能需要从图像变量中获取 mime 类型,因此我将使用 mime_type: "image/png" 而不是 mime_type: "image/#image.split('.').last" @NateFlink 我也收到了这个错误,但是如果我删除了:encoding,那么它就可以正常工作了。 在实施您的修复时出现以下错误:UTF-8 中的无效字节序列 提取的源代码(第 4 行附近):def email_image_tag(image, **options) byebug attachments[image] = :data => File.read(Rails.root.join("app/assets/images/emails/# image")), :mime_type => "image/png", :encoding => "base64"跨度> 【参考方案4】:

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

config.action_mailer.asset_host = 'YOUR HOST URL'

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

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

注意:确保更新 YOUR HOST URLMy Web Site Logo.png 以上代码。

关于Action Mailer的基本使用详情,请参考ActionMailer::Base。

【讨论】:

这样做要小心。您将需要永远在该 URL 上托管该图像,否则人们将无法再正确查看电子邮件。嵌入 base64 编码图像效果更好 解决方案简单性的一个可接受的警告。 这与在电子邮件中嵌入图像相反。这是在电子邮件中加载远程图像。【参考方案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' -%>

【讨论】:

【参考方案6】:

在 Rails 6 中,如果您使用 @Tyron 的解决方案,则需要在 BaseMailer 中将 add_template_helper 替换为 helper。于是,就变成了:

class BaseMailer < ActionMailer::Base
  helper(EmailHelper)
end

【讨论】:

【参考方案7】:

我对 Rails 了解不多,但我曾参与过使用 C# 创建电子邮件然后通过 Google API 将其插入用户收件箱的项目。要创建电子邮件,我必须从头开始生成电子邮件字符串。如果您为电子邮件启用 multipart,则图像字节将包含在使用 base64 编码的 multipart 部分中。

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

【讨论】:

以上是关于使用 Rails 将图像嵌入电子邮件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中验证多封电子邮件和处理错误的最佳方法是啥?

用 Rails 3 和 Foundation 4 覆盖 a:visited 的正确方法是啥?

使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?

Rails 6 - 加载自定义 JS 文件的正确方法是啥?

将远程 AngularJS 应用程序嵌入网页的正确方法是啥?

Rails 3:在 Rails 中使用 JSON 响应 REST-ful 操作的正确方法是啥?