22

我正在尝试使用 ActionMailer 和 wicked_pdf 生成带有呈现 PDF 附件的电子邮件。

在我的网站上,我已经分别使用了 wicked_pdf 和 actionmailer。我可以使用 wicked_pdf 在网络应用程序中提供 pdf,并且可以使用 ActionMailer 发送邮件,但是我无法将呈现的 pdf 内容附加到 ActionMailer(针对内容进行编辑):

class UserMailer < ActionMailer::Base
  default :from => "webadmin@mydomain.com"

  def generate_pdf(invoice)
    render :pdf => "test.pdf",
     :template => 'invoices/show.pdf.erb',
     :layout => 'pdf.html'
  end

  def email_invoice(invoice)
    @invoice = invoice
    attachments["invoice.pdf"] = {:mime_type => 'application/pdf',
                                  :encoding => 'Base64',
                                  :content => generate_pdf(@invoice)}
    mail :subject => "Your Invoice", :to => invoice.customer.email
  end
end

使用 Railscasts 206(Rails 3 中的 Action Mailer)作为指南,我可以发送包含所需丰富内容的电子邮件,前提是我不尝试添加呈现的附件。

如果我尝试添加附件(如上所示),我会得到一个看起来大小合适的附件,只是附件的名称没有按预期出现,也不能作为 pdf 格式阅读。除此之外,我的电子邮件内容丢失了......

在 Rails 3.0 中即时渲染 PDF 时,是否有人有使用 ActionMailer 的经验?

提前致谢! - 担

4

4 回答 4

32

WickedPDF 可以很好地呈现到文件以附加到电子邮件或保存到文件系统。

您上面的方法对您不起作用,因为generate_pdf它是邮件程序上的一种方法,它返回一个邮件对象(不是您想要的 PDF)

此外,如果您尝试在方法本身中调用 render,ActionMailer 中存在一个错误,该错误会导致消息格式错误

http://chopmode.wordpress.com/2011/03/25/render_to_string-causes-subsequent-mail-rendering-to-fail/

https://rails.lighthouseapp.com/projects/8994/tickets/6623-render_to_string-in-mailer-causes-subsequent-render-to-fail

有两种方法可以使这项工作,

第一种是使用上面第一篇文章中描述的hack:

def email_invoice(invoice)
  @invoice = invoice
  attachments["invoice.pdf"] = WickedPdf.new.pdf_from_string(
    render_to_string(:pdf => "invoice",:template => 'documents/show.pdf.erb')
  )
  self.instance_variable_set(:@lookup_context, nil)
  mail :subject => "Your Invoice", :to => invoice.customer.email
end

或者,您可以将附件设置在一个块中,如下所示:

def email_invoice(invoice)
  @invoice = invoice
  mail(:subject => 'Your Invoice', :to => invoice.customer.email) do |format|
    format.text
    format.pdf do
      attachments['invoice.pdf'] = WickedPdf.new.pdf_from_string(
        render_to_string(:pdf => "invoice",:template => 'documents/show.pdf.erb')
      )
    end
  end
end
于 2011-04-02T16:00:50.890 回答
4

我在上面使用了 Unixmonkey 的解决方案,但是当我升级到 rails 3.1.rc4 时,设置 @lookup_context 实例变量不再起作用。也许还有另一种方法可以实现对查找上下文的相同清除,但现在,在邮件块中设置附件可以正常工作,如下所示:

  def results_email(participant, program)
    mail(:to => participant.email,
         :subject => "my subject") do |format|
      format.text
      format.html
      format.pdf do
        attachments['trust_quotient_results.pdf'] = WickedPdf.new.pdf_from_string(
          render_to_string :pdf => "results",
               :template => '/test_sessions/results.pdf.erb',
               :layout => 'pdf.html')
      end
   end
  end
于 2011-06-14T19:07:06.810 回答
0

这是我解决此问题的方法:

  1. 删除了 wicked_pdf
  2. 安装虾(https://github.com/sandal/prawn/wiki/Using-Prawn-in-Rails

虽然 Prawn 在布置文档方面有点麻烦,但它可以轻松地绕过邮件附件......

于 2011-03-30T04:52:00.820 回答
0

最好使用 PDFKit,例如:

class ReportMailer < ApplicationMailer

  def report(users:, amounts:)
    @users = users
    @amounts = amounts

    attachments["proveedores.pdf"] = PDFKit.new(
      render_to_string(
        pdf: 'bcra',
        template: 'reports/users.html.haml',
        layout: false,
        locals: { users: @users }
      )
    ).to_pdf

    mail subject: "Report - #{Date.today}"
  end
end
于 2021-01-25T18:04:42.923 回答