absolute image urls

Hey,

I am sending out html emails. It seems to me that in order for the images to be properly shown in the email, their src needs to be absolute.

More precisely, /images/email/header.gif will not work, but http://localhost:3000/images/email/header.gif will. (If someone can refute me here, I am eager to hear it). So I was looking to use the image_tag helper to get the absolute url for the image source but I could not figure out a solution. So what I am currently doing is this:

class UserMailer < ActionMailer::Base     def setup_email(user)       (...)       url_with_host = url_for(:controller => "home", :action => "index", :only_path => false)       host_pattern = /^(.*:\/\/.+?)\/.*$/       @body[:http_host] = url_with_host[host_pattern, 1]       content_type "text/html"

    end end

(setup_email is then called from the actual mailer methods)

But this is a hack and it supposes that there is a "home" controller. Having the image_tag helper accept the :only_path parameter would be a nice solution. I am curious to find out how others deal with this problem since it does not seem to be so particular.

Thank you, Balint

I am sending out html emails. It seems to me that in order for the images to be properly shown in the email, their src needs to be absolute.

More precisely, /images/email/header.gif will not work, but http://localhost:3000/images/email/header.gif will. (If someone can refute me here, I am eager to hear it).

I can't. That's been my experience. Also, the images have to come from the same domain as the email is from...

So I was looking to use the image_tag helper to get the absolute url for the image source but I could not figure out a solution. So what I am currently doing is this:

class UserMailer < ActionMailer::Base    def setup_email(user)      (...)      url_with_host = url_for(:controller => "home", :action => "index", :only_path => false)      host_pattern = /^(.*:\/\/.+?)\/.*$/      @body[:http_host] = url_with_host[host_pattern, 1]      content_type "text/html"

   end end

(setup_email is then called from the actual mailer methods)

But this is a hack and it supposes that there is a "home" controller. Having the image_tag helper accept the :only_path parameter would be a nice solution. I am curious to find out how others deal with this problem since it does not seem to be so particular.

Consider setting the asset host to the URL. That should turn those image_tags()'s into full URLs. Not sure if there is a way to do that only for email and not the entire site though.

-philip

Hey Philip,

Thanks a lot! Based on your comment, I reread the AssetTagHelper and found a nice(r) solution:

I put the following in development.rb:

ENV['HOST'] = 'http://localhost:3000'

# images in emails have to have absolute urls ActionController::Base.asset_host = Proc.new do |source|   if source.starts_with?('/images/email/')     ENV['HOST']   else     ""   end end

And then it works:

ActionView::Base.new.image_tag('/images/email/header.gif')

=> "<img alt=\"Header\" src=\"http://localhost:3000/images/email/ header.gif?1234982332\" />"

ActionView::Base.new.image_tag('/images/project/header.gif')

=> "<img alt=\"Header\" src=\"/images/project/header.gif\" />"

Although I am not sure this is more robust thatn my prev. solution since the host has to be set explicitly.

Anyway, thank you, Balint