CSS изображения в электронной почте с Rails 3 - PullRequest
4 голосов
/ 23 сентября 2011

Я пытаюсь отправить электронное письмо с Rails 3 и Action Mailer. Письмо отправляется нормально, но я хочу, чтобы оно было отформатировано в HTML с некоторыми базовыми стилями, которые включают фоновые изображения. Я понимаю, что изображения могут блокироваться до тех пор, пока пользователь не разрешит их показ, но я все же думаю, что было бы лучше сделать ссылку на изображения на моем веб-сервере.

Шаблон электронной почты с именем registration_confirmation.html.erb начинается следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<style type="text/css">
body {
    background: url(/images/mainbg_repeat.jpg) top repeat-x #cfcfcf;
    margin: 0px 0px 0px 0px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: #565656;
}

Каков наилучший способ получить ссылку на фоновое изображение, чтобы включить полный хост, чтобы фон отображался в электронном письме?

Ответы [ 3 ]

16 голосов
/ 23 сентября 2011

В ответ на мой другой ответ, @Kevin написал:

Спасибо за ответ, я действительно думал о том, чтобы сделать что-то подобное, но я не думаю, что это возможно при моем способенастроить.Вызов почтовой программы происходит в вызове after_create в модели, а не в контроллере, поэтому я не думаю, что у меня есть доступ к объекту запроса, как вы упомянули (или я ошибаюсь).У меня есть это в моем инициализаторе почтовой программы: ActionMailer :: Base.default_url_options [: host] = "localhost: 3000" Могу ли я как-то использовать этот параметр hos в своей почтовой программе, чтобы он работал?

ответ да.Все помощники построения рельсов должны использовать эти defualt_url_options.В дополнение к установке :host, вы также должны заставить его использовать абсолютные URL, установив эту опцию:

ActionMailer::Base.default_url_options[:only_path] = false

Кроме того, установите хост ресурса следующим образом:

config.action_mailer.asset_host = 'http://localhost:3000'

Затем просто используйте помощник image_path вместо того, чтобы писать вручную URL-адрес, например:

<style type="text/css">
body {
    background: url(<%= image_path('mainbg_repeat.jpg') %>) top repeat-x #cfcfcf;
}
</style>

ПРИМЕЧАНИЕ. Установка параметров default_url_options напрямую считается устаревшей.Вот новый способ сделать это:

config.action_mailer.default_url_options = {
    :host => 'localhost:3000',
    :only_path => false
}
2 голосов
/ 23 сентября 2011

Передайте хост запроса в качестве параметра методу почтового модуля, а затем передайте его из метода в представление. Так, например, ваш почтовый метод может выглядеть следующим образом (пример взят из rails docs и изменен здесь):

class UserMailer < ActionMailer::Base
  default :from => "notifications@example.com"

  def registration_confirmation(user, host)
    @user = user
    @host = host
    mail(:to => user.email, :subject => "Welcome to My Awesome Site")
  end
end

Вы бы назвали это так:

def some_action
    UserMailer.registration_confirmation(@user, request.host).deliver
end

Тогда, на ваш взгляд, вы просто используете @host:

<style type="text/css">
body {
    background: url(http://<%= @host %>/images/mainbg_repeat.jpg) top repeat-x #cfcfcf;
}
</style>

Все это при условии, что сервер изображений совпадает с сервером, выполняющим запрос. Если сервер изображений находится в другом месте, вы должны вывести здесь константу. Вы можете поместить что-то вроде этого в lib / settings.rb:

module Settings
  IMAGE_HOST = 'superawesome.images.com'
end

Тогда, на ваш взгляд, вы бы просто вывели константу, например, так:

<style type="text/css">
body {
    background: url(http://<%= Settings::IMAGE_HOST %>/images/mainbg_repeat.jpg) top repeat-x #cfcfcf;
}
</style>
0 голосов
/ 01 июля 2013

Если вы не заботитесь о производительности, roadie gem может обрабатывать ссылки в таблицах стилей для вас.

...