问题 Prawn pdf附件在电子邮件中


在我的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的


4662
2017-09-06 07:14


起源

你的应用程序使用什么rails版本? - Kibet Yegon
Rails 3.0.15。立即更新票证 - alexs333


答案:


看看吧 行动梅勒指南。您需要调用附件方法来添加附件。

尝试这个:

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")

14
2017-09-06 07:27



您是否知道如何将PDF对象转换为IO对象? - alexs333
假设你的InvoicePdf类在文件系统上生成一个pdf,说你的rails tmp目录并返回你只需做的文件路径 attachments['invoice.pdf'] = File.read(InvoicePdf.new(invoice)) - Kibet Yegon
是的,这样的事情解决了它: attachments['invoice.pdf'] = File.read(InvoicePdf.new(invoice).render_file("invoice.pdf")) - alexs333
很高兴有效,我也根据您的需求更新了我的答案。 - Kibet Yegon


不仅如此

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

从3.0开始?


0
2017-09-06 07:29



Hihi,kibyegn以1分钟击败我:-) - Atastor