我在使用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
(当我把信寄到我的邮箱时 - 信看起来不错)
我在预览模式下做错了什么?
答案 0 :(得分:12)
对于Rails&gt; = 4.2来预览图像,您应该创建初始值设定项:
# config/initializer/preview_interceptors.rb
ActionMailer::Base.register_preview_interceptor(ActionMailer::InlinePreviewInterceptor)
答案 1 :(得分: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
我将此代码保存到config/initializers/inline_mail_part_urls
。
https://gist.github.com/softcraft-development/2ed70a2a4d6e2c829fac
答案 2 :(得分:1)
你没有做错任何事;它是Rails Mail Previewer设计方式的一个缺点。
合理地,Rails Mailer代码生成引用邮件&#34;部分&#34;的附件的URL。在多部分电子邮件中。 &#34; cid&#34;在您的<img>
标记的网址中引用了&#34;内容ID&#34;特定部分/附件。这就是电子邮件中URL的工作方式。
但是,预览控制器无法在电子邮件客户端的上下文中呈现:它是标准的Web浏览器。没有&#34; cid&#34; URL协议方案,没有多部分电子邮件可供参考(它只是标准的HTML文档)。 Rails::MailersController
目前还不够聪明,无法实现这一点,只是按原样呈现电子邮件。
要使其发挥作用,必须检测对cid:
个网址的所有引用,并将其替换为常规http:
网址,然后返回各种附件的内容。< / p>
有一个open issue on GitHub/rails to do this,但截至目前尚不完整。