发送带有附件的电子邮件

2024-02-22

我有一个邮件程序如下:

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" <[email protected] /cdn-cgi/l/email-protection>',
         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


根据 api 文档ActionMailer::基础 http://api.rubyonrails.org/classes/ActionMailer/Base.html,如果使用多个模板类型,则所有模板类型都会被渲染,并且 mime-type 会自动设置为 multipart/alternative。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送带有附件的电子邮件 的相关文章

随机推荐

  • 一对多关系删除

    我有一对多的关系 class GameSystem Object dynamic var gameSystemName class games Object dynamic var gameSystemName gameSystemName
  • 有没有办法将“if case”语句编写为表达式?

    考虑这段代码 enum Type case Foo Int case Bar Int var isBar Bool if case Bar self return true else return false 真恶心 我想写这样的东西 en
  • 两个 beta 分布的乘积

    假设我有两个随机变量 X 1 1 Y 2 2 我想计算 Z XY 的分布 随机变量的乘积 With scipy 我可以通过以下方式获取单个 Beta 版的 pdf from scipy stats import beta rv beta a
  • “完成”按钮未触发 Xamarin Entry 上的“完成”事件

    我添加后iOS 上的 完成 按钮 https developer xamarin com recipes cross platform xamarin forms ios add done to keyboard 在 Xamarin For
  • 跨版本序列化和反序列化 .net 对象的最佳实践

    使用 NET XML 序列化程序将对象序列化到数据库 该对象可能会随着时间的推移而发生变化 因此数据库中同时存在多个版本 有关构建代码的最佳方法的任何建议 以便您仍然可以将此对象反序列化为最新版本 界面 地图 手动序列化等 序列化对象中有一
  • 如何在Linux中设置CLASSPATH让java找到jar文件?

    在Linux下我尝试运行一个jar文件 如下所示 java jar plantuml jar testdot 当有CLASSPATH设置为以下任意一项 文件位于 home user plantuml jar export CLASSPATH
  • LabelPropagation - 如何避免被零除?

    使用时标签传播 http scikit learn org stable modules generated sklearn semi supervised LabelPropagation html 我经常遇到这个警告 恕我直言 这应该是
  • 在 flutter 中使用 new 关键字[重复]

    这个问题在这里已经有答案了 最近开始关注flutter优达学城课程 https classroom udacity com courses ud905在尝试创建基本应用程序时 我遇到了一些我不清楚的事情 添加小部件时 我注意到同时执行这两项
  • Jquery:将ajax调用的值返回给调用者函数?

    我试图从函数返回 ajax 调用返回的值 但它只返回 未定义 如果 ajax 调用发出警报 响应 它将返回正确的值 这是代码 我做错了什么 insertCandidate live click function e var ids this
  • 复杂的SQL查询建议请

    我有三个表 其架构如下 Table Apps ID bigint USERID Bigint START TIME datetime 1 13 2013 05 03 04 42 55 2 13 2013 05 12 06 22 45 3 1
  • 在python中检测并删除锁定的文件

    我想在 Unix 上使用 python 检测文件是否被锁定 删除该文件是可以的 假设它有助于检测该文件是否被锁定 该文件最初可能是由另一个进程独占打开的 文档似乎表明 如果文件被锁定 os unlink 不一定会返回错误 Ideas 检查文
  • 调用栈和反汇编疑问

    三大疑点 1 假设我得到如下调用堆栈 user32 dll InternalCallWinProc 20 0x28 bytes user32 dll UserCallWinProcCheckWow 32 0xb7 bytes user32
  • C++11 异步仅使用一个核心

    我正在尝试在 C 中并行化一个长时间运行的函数 并使用 std async 它只使用一个核心 并不是函数的运行时间太短 因为我目前使用的测试数据大约需要 10 分钟才能运行 根据我的逻辑 我创建了 NThreads 的 Futures 每个
  • 在个人网站上使用 Google Chrome 的 OmniBox [TAB] 功能?

    我认为标题解释了一切 但无论如何我都会更深入地探讨我的问题 如何在我的网站上使用 Chrome 的多功能框 TAB 功能 由于许多用户要求我在网站上实现该功能 我对 OpenSearchDescription 进行了研究 并且在 FireF
  • Scope_Identity()、Identity()、@@Identity 和 Ident_Current() 之间有什么区别?

    I know Scope Identity Identity Identity and Ident Current 所有人都获得身份列的值 但我很想知道其中的区别 我遇到的部分争议是 应用于上述这些函数的范围是什么意思 我还想要一个使用它们
  • 使用 AngularJs 处理 Play scala 发送的分块数据

    I send chunked data with Play Scala 2 2像这样的客户端 Ok chunked data 我想在客户端可用后立即使用它们 如果我只是获取数据并将其打印出来 success 它们同时打印 即收到最后一个数据
  • python:tkinter树视图颜色没有更新

    这是我的第一篇文章 如果格式有误 请原谅 如果需要 我很乐意更改 我正在使用 Tkinter 创建一个用于科学数据分析的界面 对于分子列表 可以在单独的图中表示四个分子 另一方面 我使用树视图显示有关所有分子的一些数字 不仅仅是显示的 当树
  • 在 Cartopy、Robinson 投影中绘制直线

    我正在玩 cartopy 试图了解它是如何工作的 我尝试的第一件事与中的示例非常相似the docs https scitools org uk cartopy docs v0 16 matplotlib intro html在 将数据添加
  • 如何防止点击子表单导致主表单更新

    我的预订系统中有一个表单 其中包含一个子表单 该子表单是 Access 2010 不再具有的旧 ActiveX 日历控件的复制品 一个特殊用途是创建新预订 这意味着该表单 位于 新记录上 但是 在我确定所有数据都经过正确验证之前 我不希望写
  • 发送带有附件的电子邮件

    我有一个邮件程序如下 class Payments LateNoticesMailer lt AsyncMailer def notice payment id payment PaymentDecorator find payment i