发送带附件的电子邮件

时间:2012-09-09 13:06:35

标签: ruby-on-rails actionmailer email-attachments sendgrid wicked-pdf

我有一个邮件如下:

class Payments::LateNoticesMailer < AsyncMailer
  def notice(payment_id)
    @payment = PaymentDecorator.find(payment_id)
    @invoice = @payment.invoice
    template = "payments/invoices/#{@payment.made_with_type.downcase}/show"

    attachments["#{@payment.invoice_filename}.pdf"] =
      WickedPdf.new.pdf_from_string( render_to_string( pdf:      @payment.invoice_filename,
                                                       formats:  [:pdf],
                                                       template: template,
                                                       layout:   "layouts/pdf.html"))

    mail to:      @payment.payer_email,
         from:    '"RentingSmart" <no-reply@rentingsmart.com>',
         cc:      @payment.landlord_email,
         subject: "*** Your rent payment of #{@payment.amount_due} is overdue ***"
  end
end

我使用SendGrid发送。这是我的问题,如果我通过Gmail打开电子邮件,一切都很好,电子邮件的文本就在那里,并附上附件。但是,如果我使用OSX的Mail.app或我的iPhone打开它,我只需得到以下内容:

  

这是MIME格式的多部分邮件...

有人有任何提示吗?我想我正在遵循Rails指南。

以下是我拨打Payments::LateNoticesMailer.notice(payment.id).deliver

的电话

3 个答案:

答案 0 :(得分:2)

根据ActionMailer::Base的api文档,如果使用多个模板类型,则会渲染所有模板类型,并且mime类型会自动设置为multipart / alternative。

如果添加附件,附件将放置在多部件/混合容器内。

第一个问题:你是否正在渲染其他类型的文本和HTML?我不建议发送只有pdf部分的电子邮件。即使text和html部分只是指示收件人打开附件,它们也应该在那里。理想情况下,text / html部分中会有更多信息。

其次,您是在尝试查看内联的pdf,而不是附件?

您可以查看电子邮件的原始来源并使用您看到的结构更新您的帖子吗?标题中将设置初始mime类型。它看起来像这样:

Mime-Version: 1.0
Content-Type: multipart/mixed;
 boundary="--==_mimepart_50596418be947_c7223fec9d834d3874256";
 charset=UTF-8
Content-Transfer-Encoding: 7bit

这表示要遵循的部分不是相同信息的替代版本,而是指示电子邮件客户端明确地显示它们。

稍后在电子邮件中,您的文本和HTML部分应该按照以下内容继续:

----==_mimepart_50596418be947_c7223fec9d834d3874256
Date: Wed, 19 Sep 2012 06:20:12 +0000
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_50596418be468_c7223fec9d834d38741a5";
 charset=UTF-8
Content-Transfer-Encoding: 7bit

最后,编码的pdf部分应该有一个mime标题,如:

----==_mimepart_50596418be947_c7223fec9d834d3874256
Date: Wed, 19 Sep 2012 06:20:12 +0000
Mime-Version: 1.0
Content-Type: application/pdf;
 charset=UTF-8;
 filename=terms.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename=terms.pdf

通过一个简单的测试电子邮件,我只是发送给自己的文本,HTML部分和大型pdf,我可以在我的iPhone上查看电子邮件。它显示了html部分和一个允许我下载pdf的图标。

答案 1 :(得分:1)

某些电子邮件客户端可能需要电子邮件才能显示纯文本部分才能正确显示。

答案 2 :(得分:0)

我在将Rails应用程序从2.3转换为3.2时遇到此消息。我以为我正确转换了邮件,但旧版本在选项中指定了content_type: "multipart/mixed"。但是,当我删除它时,我收到了附件,HTML和纯文本正确呈现。我认为在那里设置该设置会覆盖Rails在不同类型的内容中所做的任何事情,这不是我想要的。感谢我在这个方向上引导我的原始答案。