我正在尝试在我的某个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。只是复制文件,并重命名它工作。但是,现在邮件正文为空。只显示附件。
答案 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)