【问题标题】:Rails ActionMailer attachments show up as garbled textRails ActionMailer 附件显示为乱码
【发布时间】:2012-02-23 22:02:57
【问题描述】:

我正在尝试在我的一个 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 很简单:&lt;%= @message %&gt; 如果有帮助的话。

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

谢谢。

更新:

显然,我的视图目录中同时需要contact.erb 和contact.html.erb。只需复制文件并重命名即可。但是,现在消息正文是空白的。仅显示附件。

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    仅供参考,我遇到了同样的问题,就我而言,解决方案是交换附件和邮件行。先附加,再调用邮件。

    错误

    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
    

    【讨论】:

      【解决方案2】:

      好吧,这终于成功了:

      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
      

      【讨论】:

      【解决方案3】:

      是的,我最近遇到了同样的问题,在邮件内容正文中放了一些东西后,类似:

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

      附件开始正常显示。

      【讨论】:

        【解决方案4】:

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

        对我有用的是将 .pdf 扩展名附加到文件名。即使我的文件名已经具有 pdf 扩展名,但操作邮件程序根本没有读取扩展名。再次添加它效果很好。

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

        【讨论】:

          猜你喜欢
          • 2011-07-01
          • 2013-04-09
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 1970-01-01
          • 2019-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多