6

我有一个邮件,如下:

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

4

3 回答 3

2

根据ActionMailer::Base的 api 文档,如果使用了多种模板类型,则它们都会被渲染,并且 mime-type 会自动设置为 multipart/alternative。

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

第一个问题:你是在渲染其他类型,比如text和html吗?我不建议发送仅包含 pdf 部分的电子邮件。即使文本和 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 的图标。

于 2012-09-19T06:36:37.933 回答
1

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

于 2012-09-19T05:58:21.053 回答
0

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

于 2013-07-26T22:57:11.750 回答