Rails - Используйте одно и то же вложение для всех писем, используя макет - PullRequest
7 голосов
/ 25 февраля 2011

Я, наверное, упускаю что-то очевидное, но у меня есть логотип, который я хотел бы включить во все письма, которые я отправляю из своего приложения.У меня есть мастер-макет, который я использую для всех этих почтовиков.Я предполагаю, что есть способ сохранить это СУХОЙ и не добавлять строку кода, чтобы прикрепить файл в каждом методе почтовой программы.Может ли кто-то указать мне правильное направление или исправить мою точку зрения.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 12 марта 2012

Обратные вызовы с использованием before_filter и after_filter будут поддерживаться в будущем выпуске Rails:

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

Поскольку они будут реализованы с использованием AbstractController :: Callbacks, вы можете сделать следующее, чтобы имитировать функциональность, которая будет присутствовать в ActionMailer :: Base после выпуска Rails 4:

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, поэтому вам будет предложено удалить условную логику.

2 голосов
/ 03 августа 2011

Я кое-что взломал, это не идеально, но работает.

Если вы используете

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 была бы предпочтительнее, но это тоже работает.

Мысль, которой я хотел бы поделиться, так как я искал этот ответ на этот вопрос ранее сегодня.

1 голос
/ 17 марта 2011

в файле макета, который использует ваш почтовик, вы можете добавить следующее

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

Я предполагаю, что отправляемое письмо является html или составным.

Также вам нужно будет внести изменения в файлы среды. ActionMailer не получает base_url по умолчанию. Например, в environment / development.rb я добавил следующее

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

Если вы хотите сделать это сухим способом (и в качестве вложения), возможно, вы могли бы сделать что-то вроде

class MyMailer < ActionMailer::Base
  default :attachment => File.read(File.join(Rails.root,'public','images','logo.png'))
end
0 голосов
/ 24 апреля 2015

Я знаю, что вы спрашивали о прикреплении встроенных изображений, но вот другой подход, который позволяет достичь того же результата с меньшей сложностью.

Использование встроенных изображений в кодировке base64 в макете html - никаких вложений не требуется!

В основном просто измените src="..." вашего изображения логотипа на формат:

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

Iиспользуйте онлайновый инструмент кодирования / декодирования base64 по адресу http://www.base64 -image.net для генерации полного тега <img />

Этот подход имеет несколько преимуществ:
- без кода вложения , что делает код внутреннего сервера более понятным и более легким для чтения
- без увеличения размера электронного письма - встроенные вложения изображений в любом случае преобразуются в base64, поэтомуПодход не увеличивает полезную нагрузку электронной почты
- , он широко поддерживается - если клиент получателя электронной почты показывает html, вполне вероятно, что также поддерживает этот метод

...