使用Rails 3的电子邮件中的CSS图像

我正在尝试发送一封包含Rails 3和Action Mailer的电子邮件。 电子邮件很好,但我希望它是HTML格式的一些基本样式,包括背景图像。 我知道图像可能会被阻止,直到用户允许它们显示,但我仍然认为最好链接到我的Web服务器上的图像。

名为registration_confirmation.html.erb的电子邮件模板如下所示:

    Untitled Document  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; } 

获取背景图像的url链接以包含完整主机以使背景显示在电子邮件中的最佳方法是什么?

在回答我的另一个答案时,@ Kevin写道:

谢谢你的答案,我确实想过做类似的事情,但我不认为我的设置方式是可行的。 邮件调用发生在模型而不是控制器中的after_create调用中,所以我认为我没有像你提到的那样访问请求对象(或者我错了)。 我在我的邮件程序初始化程序中有这个:ActionMailer :: Base.default_url_options [:host] =“localhost:3000”我可以以某种方式在我的邮件程序中使用该hos参数使其工作吗?

答案是肯定的。 所有rails url-construction助手都应该使用这些defualt_url_options。 除了设置:host ,您还应该通过设置此选项强制它使用绝对URL:

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

另外,像这样设置资产主机:

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

然后只需使用image_path助手而不是手写url,如下所示:

  

注意:不推荐直接设置default_url_options。 这是新方法:

 config.action_mailer.default_url_options = { :host => 'localhost:3000', :only_path => false } 

将请求主机作为参数传递给邮件程序方法,然后将其从方法传递给视图。 因此,例如,您的邮件程序方法可能如下所示(示例从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:

  

这都假设图像服务器与运行请求的服务器相同。 如果图像服务器托管在其他地方,则必须在此处输出常量。 你可以在lib / settings.rb中输入这样的东西:

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

然后在你的视图中,你只需在那里输出常量,如下所示:

  

如果您不关心性能,那么roadie gem可以为您提供样式表中的URL。