Rails 2.3.11当电子邮件附件时,ActionMailer不呈现html

时间:2011-06-09 21:04:47

标签: ruby-on-rails attachment actionmailer

我使用的是Rails 2.3.11。我用以下方法创建了一个UserMailer:

     def rsvp_created(user, rsvp, pdf_file)
        setup_email(user)
        content_type "multipart/mixed"
        @subject << "Your RSVP for #{rsvp.ticket.holiday.title}"
        @body[:rsvp] = rsvp

        attachment :content_type => 'application/pdf', 
                   :body => File.read(pdf_file), 
                   :filename => "#{rsvp.confirmation_number}.pdf"
      end

      def rsvp_cancelled(user, rsvp)
        setup_email(user)
        content_type "text/html"
        @subject << "Cancelled RSVP for #{rsvp.ticket.holiday.title}"
        @body[:rsvp] = rsvp
        @body[:holiday_url] = APP_CONFIG['site_url'] + holiday_path(rsvp.ticket.holiday)
      end

protected
  def setup_email(user)
    @recipients = "#{user.email}"
    @from = APP_CONFIG['admin_email']
    @subject = "[#{APP_CONFIG['site_name']}] "
    @sent_on = Time.now
    @body[:user] = user
  end

rsvp_cancelled工作正常并正确发送电子邮件。但是具有附件的rsvp_created电子邮件无法正常工作。它发送带有附件的电子邮件但不呈现任何文本。任何人之前都遇到过这个问题,或者知道如何解决它?

由于

3 个答案:

答案 0 :(得分:2)

使用Rails 2.x,出于某种原因,您需要定义HTML的所有部分。

def rsvp_created(user, rsvp, pdf_file)
  setup_email(user)
  content_type "multipart/mixed"
  @subject << "Your RSVP for #{rsvp.ticket.holiday.title}"

  part :content_type => 'multipart/alternative' do |copy|
    copy.part :content_type => 'text/html' do |html|
      html.body = render( :file => "rsvp_created.text.html.erb", 
                          :body => { :rsvp => rsvp } )
    end
  end

  attachment :content_type => 'application/pdf', 
             :body => File.read(pdf_file), 
             :filename => "#{rsvp.confirmation_number}.pdf"

end

值得庆幸的是,Rails 3.x中的情况并非如此。

答案 1 :(得分:0)

我试图做同样的事情,但遵循道格拉斯上面的回答,不断受到损坏的PDF附件。我终于能够通过以二进制模式读取pdf文件来解决问题:

attachment :content_type => 'application/pdf', 
           :body => File.open(pdf_file, 'rb') {|f| f.read} 
           :filename => "#{rsvp.confirmation_number}.pdf" 

答案 2 :(得分:0)

我能够使用道格拉斯的答案,但也能让它在一条线上工作。我使用的是模板,但这也适用于将“rsvp”替换为render_message方法。

part :content_type => "text/html", 
     :body => render_message("template_name", { :symbol => value } )