Rails - 使用布局为所有电子邮件使用相同的附件

时间:2011-02-25 02:58:37

标签: ruby-on-rails-3 actionmailer

我可能遗漏了一些显而易见的东西,但我想在我的应用程序发送的所有电子邮件中都包含一个徽标。我有一个主布局,我正在使用所有这些邮件。我假设有一种方法可以保持干燥,而不必在每个邮件程序方法中添加代码行来附加文件。有人能指出我正确的方向或纠正我的思路。

谢谢!

4 个答案:

答案 0 :(得分:7)

未来的Rails版本将支持使用before_filter和after_filter的回调:

http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b

由于它们将使用AbstractController :: Callbacks实现,因此您可以执行以下操作以模拟在Rails 4发布后将在ActionMailer :: Base中出现的功能:

class YourMailer < ActionMailer::Base
  if self.included_modules.include?(AbstractController::Callbacks)
    raise "You've already included AbstractController::Callbacks, remove this line."
  else
    include AbstractController::Callbacks
  end

  before_filter :add_inline_attachments!

  private
  def add_inline_attachments!
    attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
  end
end

这包括将在未来的rails版本中使用的模块,因此可用的回调挂钩将相同以确保将来的兼容性。当您尝试升级到已包含AbstractController :: Callbacks的Rails版本时代码会引发,因此系统会提醒您删除条件逻辑。

答案 1 :(得分:2)

我砍了一些东西,它不太理想,但它有效。

如果您使用

default "SOMEHEADER", Proc.new { set_layout }

然后定义set_layout

def set_layout
  attachments.inline["logo.png"] = File.read("logopath.png")
  attachments.inline["footer.jpg"] = File.read("footerpath.png")
  "SOME HEADER VALUE"
end

然后因为set_layout被调用来设置标题,它还会添加内联附件。它基本上会创建一个用于添加附件的回调。

ActionMailer中的实际回调系统会更好,但这也有效。

我想分享,因为我今天早些时候在这个问题上寻找这个答案。

答案 2 :(得分:1)

您的邮件程序使用的布局文件中的

可以添加以下内容

<%= image_tag('logo.png') %>

我假设发出的邮件是html或multipart。

此外,您还需要在环境文件中进行更改。 ActionMailer没有获得默认的base_url。例如,在environment / development.rb中,我添加了以下内容

config.action_mailer.default_url_options = { :host => "localhost:3000" }

如果你想以dRY方式(以及作为附件)这样做,也许你可以做类似的事情

class MyMailer < ActionMailer::Base
  default :attachment => File.read(File.join(Rails.root,'public','images','logo.png'))
end

答案 3 :(得分:-1)

我知道您已经询问附加内联图片,但这是一种不同的方法,能够以更低的复杂度实现同样的目标。

html布局中使用inline base64 encoded images - 无需附件!

基本上只需将徽标图片的src="..."更改为以下格式:

<img alt="example logo"
   width="32px"
  height="32px"
     src="data:image/png;base64,iVBORw0KGgoAAA....."/>

我使用http://www.base64-image.net上的在线base64编码器/解码器工具生成完整的<img />代码

这种方法有一些好处:
- 没有附件代码,这使得后端服务器代码更清晰,更易于阅读 - 电子邮件大小没有增加 - 内联图片附件无论如何都转换为base64,因此这种方法不会使电子邮件的有效负载更大 - 得到广泛支持 - 如果接收电子邮件客户端显示html,则pretty likely it also supports this method

相关问题