Rails 4,Mailer预览,预览附加图像

the*_*her 7 ruby-on-rails actionmailer ruby-on-rails-4

我有rails 4.1.6邮件程序预览的问题.

我希望在预览模式下看到附加的图像,但它不起作用.我认为这是不正确的

有我的代码:

邮件文件

class AppMailer < ActionMailer::Base
  default from: "robot@mysite.com"

  # AppMailer.test_mail.deliver
  def test_mail
    attachments.inline['rails.png'] = File.read(Rails.root.join('app', 'assets', 'images', 'rails.png'))

    mail(
      to: 'my-email@gmail.com',
      subject: "test letter",
      template_path: "mailers",
      template_name: "test"
    )
  end
end
Run Code Online (Sandbox Code Playgroud)

预览文件

class MailerPreview < ActionMailer::Preview
  def app_mailer
    AppMailer.test_mail
  end
end
Run Code Online (Sandbox Code Playgroud)

模板文件

%p Hello, World!
%p= image_tag attachments['rails.png'].url
Run Code Online (Sandbox Code Playgroud)

当我去

/rails/mailers/mailer/app_mailer
Run Code Online (Sandbox Code Playgroud)

我看到预览页面,但图像不起作用.结果是html代码

<p>Hello, World!</p>
<p><img src="cid:544d1354a8aa0_fda8082dbf8258ca@admins-air.mail"></p>
Run Code Online (Sandbox Code Playgroud)

所以.我想,我应该找到一种方法来获取路径/到/文件而不是预览模式下的CID

(当我把信寄到我的邮箱时 - 信看起来不错)

我在预览模式下做错了什么?

Lev*_*sky 13

对于Rails> = 4.2来预览图像,您应该创建初始化程序:

# config/initializer/preview_interceptors.rb
ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor)
Run Code Online (Sandbox Code Playgroud)


Cra*_*ker 5

在Rails邮件预览器得到增强以支持附件查看之前,我正在使用此(hack-ish)增强功能Mail::Part#url将附件数据嵌入到URL本身中.这样可以在预览器中查看我的内嵌图像(假设我已INLINE_MAIL_PART_URLS打开),同时在适当的设置中保留原始行为.

module InlineMailPartUrls
  def url
    if ENV["INLINE_MAIL_PART_URLS"] == "true"
      "data:#{mime_type};base64,#{Base64.encode64(body.decoded)}"
    else
      super
    end
  end
end

class Mail::Part
  prepend InlineMailPartUrls
end
Run Code Online (Sandbox Code Playgroud)

我将此代码保存到config/initializers/inline_mail_part_urls.

https://gist.github.com/softcraft-development/2ed70a2a4d6e2c829fac


Cra*_*ker 2

你没有做错任何事;这是 Rails Mail Previewer 设计方式中的一个缺点。

Rails Mailer 代码合理地为引用多部分电子邮件中的邮件“部分”的附件生成 URL。标签 URL 中的“cid”<img>是指特定部分/附件的“内容 ID”。这就是电子邮件中 ​​URL 的工作原理。

但是,预览器控制器不会在电子邮件客户端的上下文中呈现:它是标准的 Web 浏览器。没有“cid”URL 协议方案,也没有可供参考的多部分电子邮件(这只是标准 HTML 文档)。Rails::MailersController目前还不够聪明,无法意识到这一点,只是按原样呈现电子邮件。

为了实现这一点,它必须检测所有对cid:URL 的引用,并将它们替换为常规http:URL 回自身,然后返回各种附件的内容。

GitHub/rails 上有一个悬而未决的问题可以做到这一点,但到目前为止它还没有完成。