-->

发送邮件带有附件(Sending email with attachments)

2019-09-22 06:21发布

我有一个邮件是如下:

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

Answer 1:

根据API文档的ActionMailer ::基地 ,如果使用多个模板类型,所有的人都提供,而该mime类型被自动设置为multipart /替代。

如果添加附件时,附件被放置在多部分/混合容器的内部。

第一个问题:你是渲染其他类型,比如文本和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格式的图标。



Answer 2:

某些电子邮件客户端可能需要一个电子邮件,以便正确地显示它有一个纯文本的一部分。



Answer 3:

我刚遇到了这个消息,同时从2.3转换Rails应用至3.2。 我想我正确地转换我的邮件,但旧版本规定content_type: "multipart/mixed"的选项。 然而,当我删除,我收到的附件和HTML和纯文本正确呈现。 我认为有在那里压倒一切的Rails该设置确实把不同类型的内容,这是不是我想要的东西。 由于原来的答案带领我在那个方向。



文章来源: Sending email with attachments