Rails ActionMailer 附件显示为乱码文本

4

我正在尝试在我的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中的attachment行的File.read()部分可能是罪魁祸首,但它指向了我服务器上的一个有效pdf文件,我可以通过浏览器访问它。日志仅显示使用了正确的参数发送了邮件,但它被发送为看起来像反编译文本或像在纯文本编辑器中打开pdf一样的东西。

mailer视图contact.html.erb只有:<%= @message %> 如果这有帮助。

您有什么想法我可能做错了什么吗?

谢谢。

更新:

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

4个回答

6
仅供参考,我曾经也遇到过同样的问题,在我的情况下解决方案是交换附件和邮件行的顺序。先添加附件,然后调用邮件发送。 错误示范
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

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.erb重命名为contact.text.erb,并已经将该文件复制到了contact.html.erb中。

我在控制器中使用以下代码调用该方法:

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

这可能会对你有所帮助。https://dev59.com/SVPTa4cB1Zd3GeqPgifC#w67lnYgBc1ULPQZFqNIm - Deepak Lamichhane

2

最近我也遇到了同样的问题。在邮件内容正文中,我写下了如下内容:

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

附件开始正常显示。

0

我遇到了同样的问题,但是改变附件和邮件发送的顺序对我没有起作用。

对我有用的是在文件名后添加 .pdf 扩展名。即使我的文件名已经有了 pdf 扩展名,但是 action mailer 简单地没有读取扩展名。再次添加它就完美解决了。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接