我发送带附件的邮件(1.pdf),但是在邮件中它没有显示1.pdf,而是显示一些名为“ATT008220.dat”的随机文件。
我正在使用Rails 3.0 以下是我正在使用的代码:
@file = File.read('c:/1.pdf')
@file.force_encoding('BINARY')
attachment "application/octet-stream" do |a|
a.body = @file
end
有人知道为什么会这样吗?任何想法?
谢谢&的问候,
Harsh Raval。
EDIT :: ---- 邮件发送方式:
def contact(recipient, subject, message, sent_at = Time.now)
@subject = subject
@recipients = recipient
@from = 'harsh@apprika.com'
@sent_on = sent_at
@body = message
#@file = File.read('c:/1.pdf')
#@file.force_encoding('US_ASCII')
#attachment "multipart/alternative" do |a|
# a.body = @file
#end
attachments['1.pdf'] = {:mime_type => 'application/pdf',:content => File.read('c:/1.pdf')}
@headers = {}
end
答案 0 :(得分:3)
尝试使用.xlsx文件作为附件发送邮件时遇到了类似的问题。为了使它工作,我必须做:
attachments['filename.xlsx'] = {
:encoding => 'base64',
:content => Base64.encode64(File.read(filename))
}
部分在“梅勒指南”的第2.3.2节中提及:http://guides.rubyonrails.org/action_mailer_basics.html#complete-list-of-action-mailer-methods
答案 1 :(得分:2)
我认为,您需要指定文件名
@file = File.read('c:/1.pdf')
@file.force_encoding('BINARY')
attachment "application/octet-stream" do |a|
a.body = @file
a.filename = "1.pdf"
end
我会将"application/pdf"
用于pdf文件。
编辑:
我查看了Rails 3指南,我没有看到任何上述语法的示例。相反,他们使用这样的东西:
attachments['1.pdf'] = File.read('c:/1.pdf')
或者有其他选择:
attachments['1.pdf'] = {:mime_type => 'application/octet-stream',
:content => File.read('c:/1.pdf') }
查看here了解更多信息。
编辑2:
我想从评论中回答你的问题。我没有在Rails 3中使用过邮件,但我在Rails 2.3.X中使用它,这里有一些适用于我的代码:
attachment :content_type => "application/msword",
:body => File.read("files/word.doc"),
:filename => "word.doc"
attachment "application/pdf" do |a|
a.body = File.read("files/some_pdf.pdf")
a.filename = "umowa.pdf"
end
在Rails 3中,邮件程序API已更改。你应该使用新的API。顺便说一句。如果我的第一个例子有效,你也可以尝试 - 它使用哈希而不是阻塞。
另一个编辑:
我认为您应该使用mail
对象来发送邮件。以下是Rails指南的示例:
def welcome_email(user)
@user = user
@url = user_url(@user)
mail(:to => user.email,
:subject => "Welcome to My Awesome Site")
end
message
应该在邮件程序视图中呈现。我认为你有问题,因为你正在将旧的邮件程序API与新邮件混合使用。看看here,看看如何以“新方式”逐步完成。
答案 2 :(得分:2)
从Rails 3(x)开始,您的内容处理决定了最终用户接收文件名的方式。
而不是:
attachments['1.pdf'] = {:mime_type => 'application/pdf',:content => File.read('c:/1.pdf')}
使用此:
# I like to rewrite the file name to exclude any whitespaces
safe_name = file_name.gsub(/[^0-9a-z\.]/i,"-")
attachments[safe_name] = {
:content => File.read(file_name),
:content_disposition => "attachment; filename=\"#{safe_name}\""
}
你可以包含mime_type但是除非你解释附件的顺序,否则你可能会得到一些令人讨厌的结果,除非你在你的邮件中指定了类似的东西:
class SampleNotifications < ActionMailer::Base
# my_mailer
:content_type => 'multipart/alternative',
:parts_order => [ "text/plain", "text/enriched", "text/html", "application/octet-stream" ]
def notify
... something like the code above
end
end
答案 3 :(得分:0)
请执行以下操作:
将以下内容添加到actionmailer: -
def send_mail
attachments['1.pdf'] = File.read('c:/1.pdf')
mail(:to => "harsh@xyz.com", :subject => "xyz", :from=>"harsh@xyz.com")
mail.deliver
end
注意: - 确保smtp设置正确,并且相应的操作文件(在此示例中为send_mail.rhtml)存在于相应的文件夹下。
希望这有帮助。