ruby-on-rails - 带有内联附件的 Rails 邮件程序错误

标签 ruby-on-rails ruby ruby-on-rails-3 email

我在 Action Mailer 中有一个非常罕见的行为,我在 5 个月前实现了一个邮件程序操作并且它工作正常,但昨天,由于一些奇怪的原因,它崩溃了。

问题

我有一个邮件布局,为了在我所有的电子邮件中使用它,我在其中渲染了一张之前由前置过滤器附加的图像

Layout = app/views/layouts/email.html.erb

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Visionamos</title>
    <link rel="stylesheet" type="text/css" href=<%="/assets/email.css" %>>
  </head>
  <body>
   <table>
    <tr>
     <td id="head">
      <table>
       <tr class="image">
         <td><%= image_tag(attachments['visionamos.png'].url) %></td>
...
..
.

用户邮件程序 = app/mailers/users.rb

class UsuariosMailer < ActionMailer::Base
  include AbstractController::Callbacks # include controller callbacks
  default :from => "monitoreo@visionamos.com"
  layout "mail" #Set email layout 
  before_filter :add_inline_attachments! # Add image header for all actions

  def otp_password(user, otp_key)
    @usuario = user
    @code = otp_key
    email_with_name = "#{@usuario.nombre} <#{@usuario.email}>"
    mail(:to => email_with_name, :subject => "One time password, Plataforma Visionamos")
  end

  private
   def add_inline_attachments!
   attachments.inline['visionamos.png'] = File.read("#{Rails.root}/app/assets/images/visionamos.png")
  end
end

现在,当我尝试发送电子邮件时,收到此错误

NoMethodError - undefined method `match' for nil:NilClass:
mail (2.5.4) lib/mail/utilities.rb:112:in `unbracket'
mail (2.5.4) lib/mail/part.rb:29:in `cid'
mail (2.5.4) lib/mail/part.rb:33:in `url'
app/views/layouts/mail.html.erb:13:in     `_app_views_layouts_mail_html_erb__573848672563180413_70191451095440'
<td><%= image_tag(attachments['visionamos.png'].url) %></td>

但是图片附在邮件中

>> attachments['visionamos.png']
=> #<Mail::Part:70191451538040, Multipart: false, Headers: <Content-Type: image/png;   filename="visionamos.png">, <Content-Transfer-Encoding: binary>, <Content-Disposition: inline; filename="visionamos.png">, <content-id: >>

我的开发环境

Mac 与 Maverics ruby 2.0 + Rails 3.2.16

加上

  • 电子邮件在我的同事环境(ubuntu 和 mac)中的 amazon ec2 实例中工作
  • 如果我删除布局中的 image_tag 方法,将发送电子邮件并将图像显示为附件,无内联

更新!!!

我已经尝试过@Gene 解决方案,但即使发送了电子邮件,图像也是正常附件,没有内联,所以深入观察,我发现了这个

>> attachments.inline['visionamos.png'].header
=> #<Mail::Header:0x00000106cf6870 @errors=[], @charset=nil, @raw_source="", @fields=[#<Mail::Field:0x00000106cf60c8 @field=#<Mail::ContentTypeField:0x00000106cf5fd8 @charset=nil, @main_type="image", @sub_type="png", @parameters={"filename"=>"visionamos.png"}, @name="Content-Type", @length=nil, @tree=nil, @element=#<Mail::ContentTypeElement:0x00000106cf5d30 @main_type="image", @sub_type="png", @parameters=[{"filename"=>"visionamos.png"}]>, @value="image/png; filename=\"visionamos.png\"", @filename="visionamos.png">, @field_order_id=23>, #<Mail::Field:0x00000106d17390 @field=#<Mail::ContentTransferEncodingField:0x00000106d172a0 @charset=nil, @name="Content-Transfer-Encoding", @length=nil, @tree=nil, @element=#<Mail::ContentTransferEncodingElement:0x00000106d16ff8 @encoding="binary">, @value="binary">, @field_order_id=24>, #<Mail::Field:0x00000106d14a78 @field=#<Mail::ContentDispositionField:0x00000106d14960 @charset=nil, @name="Content-Disposition", @length=nil, @tree=nil, @element=#<Mail::ContentDispositionElement:0x00000106d145c8 @disposition_type="inline", @parameters=[{"filename"=>"visionamos.png"}]>, @value="inline; filename=\"visionamos.png\"", @parameters={"filename"=>"visionamos.png"}, @filename="visionamos.png">, @field_order_id=26>, #<Mail::Field:0x00000106d3e8f0 @field=#<Mail::UnstructuredField:0x00000106d5ef60 @errors=[["content-id", nil, #<Mail::Field::ParseError: Mail::MessageIdsElement can not parse |<52fe636fae8a6_686085098c087130@MacBook Pro de Ruben.mail>|

原因是:应为 !、#、$、%、&、'、*、+、-、/、=、?、^、_、`、{、|、}、~、@、。 , ", > 在 <52fe636fae8a6_686085098c087130@MacBook>]] 之后的第 1 行第 40 列(字节 40)],@charset=#,@name="content-id",@length=nil,@tree=nil,@element=无,@value="">,@field_order_id=100>]>

有趣的是

 #<Mail::Field::ParseError: Mail::MessageIdsElement can not parse |<52fe636fae8a6_686085098c087130@MacBook Pro de Ruben.mail>|

 Reason was: Expected one of !, #, $, %, &, ', *, +, -, /, =, ?, ^, _, `, {, |, }, ~, @, ., ", > at line 1, column 40 (byte 40) after <52fe636fae8a6_686085098c087130@MacBook>]],

Error

最佳答案

我查看了 mail 来源。

只有当内容 id 字段为 nil 时才会发生此错误。但是,调用 .url 应该将内容 ID 设置为空字符串,除非 has_content_id? 返回 true,这意味着多部分 header 中已经有一个内容 ID 字段。

这并没有发生,所以我们一定遇到了一个奇怪的情况,其中 header 对象报告 has_content_id? true 但返回的 content_idnil.

尝试在设置图形后显式设置内容 ID 字段。

attachments['visionamos.png'].header['content-id'] = 'logo.graphic'

如果这行得通,那么为什么需要这样做仍然是个谜。您是否对邮件程序配置或代码进行了任何其他更改?你有没有升级任何 gem ?

添加响应问题编辑

header 解析器似乎失败了,因为 id ...@MacBook Pro de Ruben.mail 中有空格。尝试重新命名计算机,不带空格!我想这构成了 mail 中的错误。空格应被删除或替换为合法字符。

我的猜测是这也将解决原来的问题,您将不再需要手动设置 content-id。因此另一种猜测:您更改了机器名称或将开发转移到新机器上。这就是错误出现的时候!

关于ruby-on-rails - 带有内联附件的 Rails 邮件程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21580578/

相关文章:

sql - 如何根据组和顺序查询记录?

ruby-on-rails - Rails 俄罗斯娃娃缓存和 N+1

ruby - 当变量改变时调用钩子(Hook)

ruby-on-rails - 用于站点内消息传递的 Ruby Gem? (想想 LinkedIn、Facebook 等)

ruby-on-rails - rake 任务已中止,Thinking Sphinx的未定义方法 'indexes'?

ruby-on-rails - 缺少模板 rails

ruby-on-rails - Rails 模型测试

javascript - Rails 4 - 在单击事件上引导多个处理程序不起作用

ruby-on-rails - 运行 "bundle"时的 Bundler 警告 - Ruby on Rails

Ruby 序列化游戏类