我看过类似的帖子,主要涉及通过创建视图和控制器来发送附件,例如:
电子邮件中的 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_preview
gem,它将电子邮件呈现到开发中的新选项卡。在生产中,这会简单易懂地打印详细信息和可能的 base64 编码文件,因此问题仍然存在。