Rails ActionMailer附件显示为乱码文本

时间:2012-02-23 22:02:58

标签: ruby-on-rails actionmailer

我正在尝试在我的某个rails应用程序中发送pdf附件,但附件是以文本形式发送而不是正确的pdf。

我的邮件是这样的:

class Notifications < ActionMailer::Base
  def contact(email_params, sent_at = Time.now)
    subject "" << email_params[:subject]
    recipients "" << email_params[:client]
    from "#{email_params[:name]} <#{email_params[:address]}>"
    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank?
    sent_on sent_at
    body :message => email_params[:body], :sender_name => email_params[:name]
  end
end

我在邮件收件箱中收到的内容:

--
Date: Thu, 23 Feb 2012 13:50:58 -0800
Mime-Version: 1.0
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-ID: <[mailserver]>

Message Body

--
Date: Thu, 23 Feb 2012 13:50:58 -0800
Mime-Version: 1.0
Content-Type: application/pdf;
charset=UTF-8;
filename=invoice.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=invoice.pdf
Content-ID: <[mailserver]>

后跟一串很长的ascii字符

没有任何附件,不会发送该标题信息,我只是在我的收件箱中获得“消息正文”部分。我怀疑mailer.rb中附件行的File.read()部分是某种罪魁祸首,但它指向我服务器上的有效pdf文件,我可以通过浏览器访问该文件。日志只表示邮件是使用正确的参数发送的,但它是以反编译文本的形式发送的,或者如果你在纯文本编辑器中打开pdf的话。

邮件程序视图contact.html.erb只是:<%= @message %>如果有帮助的话。

知道我可能做错了什么吗?

感谢。

更新

显然,我需要contact.erb以及我的views目录中的contact.html.erb。只是复制文件,并重命名它工作。但是,现在邮件正文为空。只显示附件。

4 个答案:

答案 0 :(得分:6)

仅供参考,我有同样的问题,在我的情况下,解决方案是交换附件和邮件行。首先附上,然后打电话给邮件。

<强> WRONG

def pdf_email(email, subject, pdfname, pdfpath)
  mail(:to => email, :subject => subject)
  attachments[pdfname] = File.read(pdfpath)
end

不可

def pdf_email(email, subject, pdfname, pdfpath)
  attachments[pdfname] = File.read(pdfpath)
  mail(:to => email, :subject => subject)
end

答案 1 :(得分:3)

嗯,这终于结束了:

class Notifications < ActionMailer::Base
  def contact(email_params, sent_at = Time.now)
    subject "" << email_params[:subject]
    recipients "" << email_params[:client]
    from "#{email_params[:name]} <#{email_params[:address]}>"

    part "text/plain" do |p|
      p.part :content_type => "text/plain", :body => render("contact.erb")
    end

    @message = email_params[:body]

    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank?   

    sent_on sent_at

    mail(:to => email_params[:client],
         :from => email_params[:address],
         :subject => email_params[:subject]) do |format|
      format.html { render 'contact' }
      format.text { render :text => email_params[:body] }
    end
  end
end

我确信有无关的线条,但它至少可以正常工作。除了已经将该文件复制到contact.html.erb之外,我还将视图文件从contact.erb重命名为contact.text.erb。

我正从我的控制器调用方法:

  def send_mail
    Notifications.deliver_contact(params[:email])
    redirect_to "/mail/success"
    #Notifications.contact(params[:email]).deliver
  end

答案 2 :(得分:2)

是的,我最近遇到了同样的问题,并且在邮件内容正文中放了一些东西之后,就像这样:

    mail(:to => reciever, :subject => "Hello, this is a mail from rails!") do |formate| 
        formate.text {render :text => "mail content body "}
    end.deliver

附件开始正常显示。

答案 3 :(得分:0)

我遇到了同样的问题,但改变附件和邮件递送的顺序对我来说不起作用。

对我有用的是将.pdf扩展名附加到文件名。尽管我的文件名已经有pdf扩展名,但是动作邮件程序根本没有读取扩展名。再次附加它完美无缺。

attachments[file_name + '.pdf'] = File.read(path)