使用 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
<%= email_image_tag("company_logo.png") %>
注意 **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.rb
和development.rb
中添加以下行
config.action_mailer.asset_host = 'YOUR HOST URL'
使用以下代码在您的视图中嵌入图像。
<%= image_tag('My Web Site Logo.png') %>
注意:确保更新 YOUR HOST URL 和 My 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 应用程序中处理电子邮件异常的最佳方法是啥?