11

在我的 Rails 应用程序中,我试图将发票附加到电子邮件中:

def invoice(invoice)
  attachment :content_disposition => "attachment",
             :body => InvoicePdf.new(invoice),
             :content_type => "application/pdf",
             :filename => 'invoice.pdf'

  mail(:to => @user.email, :subject => "Your Invoice")
end

InvoicePdf一个 Prawn PDF 文档:

class InvoicePdf < Prawn::Document
  def initialize(order, view)
    draw_pdf
  end

  def draw_pdf
    # pdf stuff
  end
end

我在电子邮件中没有收到任何附件。我究竟做错了什么?任何提示都将受到欢迎和赞赏。

编辑:我使用的 Rails 版本是3.0.x

4

2 回答 2

15

查看Action Mailer 指南。您需要调用 attachments 方法来添加附件。

试试这个:

attachments['attachment_filename'] = InvoicePdf.new(invoice)

这是假设调用 InvoicePdf.new(invoice) 会生成一个文件并返回一个表示该文件的 IO 对象。我还注意到您的 InvoicePdf 类初始化程序需要两个参数,但您只传递了一个。

更新: 另请注意,Action Mailer 将获取文件名并计算出 MIME 类型,设置 Content-Type、Content-Disposition、Content-Transfer-Encoding 和 base64 编码附件的内容,因此手动设置它是除非您想覆盖默认值,否则没有必要。

根据您的 pdf 生成方法,这可能会更好:

invoice = InvoicePdf.new(invoice)
attachments["invoice.pdf"] = { :mime_type => 'application/pdf', :content => invoice.render }
mail(:to => @user.email, :subject => "Your Invoice")
于 2012-09-06T07:27:51.383 回答
0

这不只是

attachments["invoice.pdf"] = InvoicePdf.new(invoice)

从 3.0 开始?

于 2012-09-06T07:29:25.003 回答