【问题标题】:Rails 4, Mailer preview, preview attached imagesRails 4,Mailer 预览,预览附加图像
【发布时间】:2014-12-21 21:05:44
【问题描述】:

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

预览文件

class MailerPreview < ActionMailer::Preview
  def app_mailer
    AppMailer.test_mail
  end
end

模板文件

%p Hello, World!
%p= image_tag attachments['rails.png'].url

当我去

/rails/mailers/mailer/app_mailer

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

<p>Hello, World!</p>
<p><img src="cid:544d1354a8aa0_fda8082dbf8258ca@admins-air.mail"></p>

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

(当我将信发送到我的邮箱时 - 信看起来不错)

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 actionmailer


    【解决方案1】:

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

    # config/initializer/preview_interceptors.rb
    ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor)
    

    【讨论】:

      【解决方案2】:

      在 Rails 邮件预览器得到增强以支持附件查看之前,我一直在使用 Mail::Part#url 的这种(hack-ish)增强功能将附件数据嵌入到 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
      

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

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

      【讨论】:

      • 我将此代码放入我的 MailerPreview 类中。而且我有预览和邮件工作。谢谢。
      【解决方案3】:

      你没有做错任何事;这是 Rails 邮件预览器设计方式的一个缺点。

      Rails Mailer 代码合理地为在多部分电子邮件中引用邮件“部分”的附件生成 URL。 &lt;img&gt; 标签的 URL 中的“cid”是指特定部分/附件的“内容 ID”。这就是电子邮件中的 URL 的工作方式。

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

      要完成这项工作,它必须检测对cid: URL 的所有引用,并将它们替换为常规的http: URL,然后返回各种附件的内容。

      有一个open issue on GitHub/rails to do this,但目前还不完整。

      【讨论】:

        猜你喜欢
        • 2015-11-14
        • 2011-10-01
        • 2018-06-12
        • 2020-05-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多