Rails 4/5 发送动态 ActionMailer::Base.mail 电子邮件,附件标记为 Noname

2024-05-07

我看过类似的帖子,主要涉及通过创建视图和控制器来发送附件,例如:

电子邮件中的 PDF 附件称为“Noname” https://stackoverflow.com/questions/12816042/pdf-attachment-in-email-is-called-noname

但我有一个在后台动态生成文件的进程,需要使用 ActionMailer::Base.mail 将其附加到收件人列表。下面是代码:

def send_email(connection)
    email = ActionMailer::Base.mail(to: connection['to'], from: connection['from'], subject: 'Sample File', body: "<p>Hello,</p><p>Your data is ready</p>", content_type: 'multipart/mixed')
    email.cc = connection['cc'] if connection['cc'].present?
    email.bcc = connection['bcc'] if connection['bcc'].present?
    @files.each do |file|
      report_file_name = "#{@start_time.strftime('%Y%M%dT%I%m%s')}_#{file[0]}.xlsx"
      file_location = "#{Rails.root}/tmp/#{report_file_name}"
      email.attachments[report_file_name] = File.open(file_location, 'rb'){|f| f.read}
    end
    email.deliver if email
  end

我可以在日志中看到它正在发送内容,但假设它以 Noname 形式发送,因为它找不到视图。有什么办法可以让它成功工作吗?

以下是示例输出:

已发送邮件至[电子邮件受保护] /cdn-cgi/l/email-protection(383.9 毫秒)日期: 2016 年 10 月 13 日星期四 08:47:30 -0400 来自: 样本 至: 收件人消息 ID: [电子邮件受保护]> 主题:样本文件 Mime 版本:1.0 内容类型:多部分/混合;字符集=UTF-8 内容传输编码:7bit

-- 内容类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; 文件名=20161012T08101476259208_Data.xlsx 内容传输编码:base64 内容处置:附件; 文件名=20161012T08101476259208_Data.xlsx 内容 ID: [电子邮件受保护]>

UEsDBBQAAAAIAO.. ... ...ADUFQAAAAA=

Update- 我注意到如果我使用 email.content_type = 'text/plain' - 附件会成功通过。对我来说,这是可行的,尽管我希望以后能够使用 HTML 来设计我的电子邮件

我认为这是有效的,因为它阻止了 Rails 通常的收集/自动解释过程。我当然希望看到多部分/混合或 html 兼容版本在这里工作。

Update 2这只是人为地解决了这个问题rails_email_previewgem,它将电子邮件呈现到开发中的新选项卡。在生产中,这会简单易懂地打印详细信息和可能的 base64 编码文件,因此问题仍然存在。


我也遇到了这个问题,经过一番调查,似乎在Rails 4中,你不能调用附件调用后的方法mail方法,否则邮件消息对象的 content_type 将没有边界信息,从而导致接收到的电子邮件中的附件部分无法正确解析。

我认为深入研究 actionmailer 源代码,您应该能够找到解决方案,或者通过覆盖默认值mail方法或手动设置正确的边界信息。

但为了快速解决这个问题,我通过使用元编程想出了一个不太优雅的解决方法:定义一个继承ActionMailer::Base的委托类。

class AnyMailer < ActionMailer::Base
  # a delegation mailer class used to eval dynamic mail action
end

然后通过定义任意方法来评估此类来执行电子邮件发送。

def send_email(connection, files)
  AnyMailer.class_eval do
    def any_mailer(connection, files)
      files.each do |file|
        report_file_name = :foo
        file_location = :bar
        attachments[report_file_name] = File.open(file_location, 'rb'){|f| f.read}
      end
      mail(to: connection['to'], from: connection['from'], subject: 'Sample File', body: "<p>Hello,</p><p>Your data is ready</p>")
    end
  end

  AnyMailer.any_mailer(connection, files).deliver_now
end

注意,您不需要将 content_type 指定为“multipart/mixed”,ActionMailer 会正确处理它。我试图明确指定它,但结果却弄乱了电子邮件内容。

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

Rails 4/5 发送动态 ActionMailer::Base.mail 电子邮件,附件标记为 Noname 的相关文章

随机推荐

  • 更新插入不适用于 updateOnebulkWrite v3.4

    我正在尝试批量写入一些更新 除了更新插入之外的所有内容都正常 我的代码完美地更新了所有项目 并且没有给出任何错误 这里的问题是批量插入updateOne没有更新插入 这是我的代码的未经测试和缩短的示例 因此您可能会发现一些语法错误 希望您明
  • 使用 GenericRecord 在 Avro 中填充嵌套记录的问题

    假设我有以下架构 name Profile type record fields name firstName type string name address type type record name AddressUSRecord f
  • 将数据从 Excel 导出到 Outlook

    我已经用 Excel 起草了一封电子邮件 其中填充了数据表中的信息 单元格 A1 到 A4 包含 嗨 希望你做得好 和消息 等等 A5到H10有一个包含信息的表格 A11到A30有类似 期待您的回复 的电子邮件内容 我只想复制 A1 A4
  • 在 Firebase 群组消息应用中实现已读回执功能

    我想在我的 Firebase 群组消息应用中实现 Seen 功能 您能否建议采取最好 最有效的方法 工作代码将不胜感激 例如 应用程序会显示 已被 6 人看过 or 15 人看过 在群组消息中 这是我的项目 https github com
  • Cesium - 为什么 scene.pickPositionSupported 为 false

    我最终试图在我的房子顶部画一个多边形 我能做到 问题是 在缩小 放大和旋转 或相机移动 时 多边形不会粘在我房子的顶部 我得到了很大的帮助这个答案 https stackoverflow com a 35992537 1735836 所以
  • 有人请解释 Calendar.get(cal.DAY_OF_WEEK) 如何给出正确的输出,而 cal.DAY_OF_WEEK 是默认且未修改的? [复制]

    这个问题在这里已经有答案了 我想知道约会的日子 当我在 cal set year month 1 day 中设置日期时 设置日历字段YEAR MONTH DAY OF MONTH HOUR OF DAY 和 MINUTE 的值 其他字段的先
  • Cloud Functions for Firebase - 创建新用户时写入数据库

    我对 Firebase 和 javascript 语言的 Cloud Functions 非常陌生 我试图在每次创建用户写入数据库时 添加一个函数 这是我的代码 const functions require firebase functi
  • 重绘不会更新屏幕

    我想重新粉刷我的屏幕 到目前为止 它所做的只是在第一个屏幕上显示一个点 即头部应该在的位置 这很好 但是我在代码中写道 我希望每秒将头部向下移动 10 像素 我正在打印头部应该在的位置 并且在命令提示符中显示 y 值确实在增加 然而在我的屏
  • C 中类似函数的宏定义

    我想定义一个像 MACRO 这样的函数 IE define foo x if x gt 32 x else 2 x endif 那是 if x gt 32 then foo x present x else foo x present 2
  • Netbeans 中的方法必须调用 super() 错误

    最近我做了一个 Netbeans 项目 并使用 SVN 来配合它 我看到重复的类错误 并在控制台中显示 java lang VerifyError class pie chart explorer PieChartExplorer meth
  • 将可为空的数字转换为字符串

    我想将可为空的数字转换为字符串维持空值 这就是我正在做的 int i null string s i null null i ToString 有更短的吗 您可以编写一些扩展方法 public static string ToNullStr
  • 如何连接flutter到localhost mysql数据库

    我想将本地主机 mysql 数据库连接到 flutter 但我没有这样做 我尝试了 mysql1 与这些连接 ConnectionSettings host 10 0 2 2 port 3306 user root password roo
  • 如何将 HTML 表格导出到 Chrome 和 IE 支持的 Excel?

    在我的 MVC 项目中 我有一个与 Knockout 绑定的 HTML 表 我正在尝试将表格导出到 Excel 我在客户端尝试使用 JavaScript self exportToExcel function javascript wind
  • 用户在 Rails 中选择 CSS 样式表

    我正在 Rails 中开发一个网站 我希望用户能够将 CSS 样式表更改为浅色或深色主题 我认为这样我就可以为样式表使用变量 我尝试通过在我的视图中添加一个链接来更改该变量 如下所示 在我的控制器中调用此函数 class ProjectsC
  • Firefox 渲染出错 - 看到一些非常奇怪的东西

    我的以下情况真的很奇怪 基本上 当我查看页面的源代码时 一切看起来都很好 但页面看起来完全错误 所以我决定使用 firebug 查看源代码 而 firebug 显示了一个非常不同的故事 但是 如果我刷新页面 页面看起来很好 并且源和萤火虫匹
  • 如何让 XSLT 在 Java 中返回 UTF-8

    我正在尝试让我的 XSL 脚本使用 UTF 8 编码 像 和希腊字符这样的字符就像垃圾一样出现 让它工作的唯一方法是将结果写入文件 如果我将它写入输出流 它只会返回垃圾 System out 有效 但这可能是因为它被重定向到文件 结果需要从
  • 初始化顺序是否有保证

    我正在使用类似以下代码段的内容来进行一些初始化 我知道初始化p
  • 使用 gatttool 或 bluepy BLE 订阅通知

    我正在使用 bluepy 编写一个程序 用于监听蓝牙设备发送的特征 我还可以使用任何库或语言 唯一的限制是在 Linux 上运行 而不是在移动环境中运行 似乎仅在移动设备中广泛使用 没有人在桌面上使用 BLE 使用 bluepy 我注册了委
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • Rails 4/5 发送动态 ActionMailer::Base.mail 电子邮件,附件标记为 Noname

    我看过类似的帖子 主要涉及通过创建视图和控制器来发送附件 例如 电子邮件中的 PDF 附件称为 Noname https stackoverflow com questions 12816042 pdf attachment in emai