Ruby on rails 附件在mail-in-rails中不正确
我正在发送一封带有attachment1.pdf的邮件,但邮件中没有显示1.pdf,而是显示了一些名为ATT008220.dat的随机文件 我正在使用Rails 3.0 以下是我正在使用的代码:Ruby on rails 附件在mail-in-rails中不正确,ruby-on-rails,email,attachment,Ruby On Rails,Email,Attachment,我正在发送一封带有attachment1.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 = File.read('c:/1.pdf')
@file.force_encoding('BINARY')
attachment "application/octet-stream" do |a|
a.body = @file
end
有人知道为什么会这样吗?有什么想法吗
谢谢和问候
严酷的拉瓦尔
编辑::--
邮件发送方法:
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
我认为,您需要指定文件名
@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文件
编辑:
我查看了Rails3指南,没有看到任何具有上述语法的示例。相反,他们使用的是这样的东西:
attachments['1.pdf'] = File.read('c:/1.pdf')
或具有其他选项:
attachments['1.pdf'] = {:mime_type => 'application/octet-stream',
:content => File.read('c:/1.pdf') }
查看更多信息
编辑2:
我想从评论中回答你们的问题。我没有在Rails 3中使用mailer,但我在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中,mailer API已更改。你应该使用新的API。顺便说一句,如果我的第一个例子有效,你也可以试试——它使用散列而不是块
另一编辑:
我认为你应该使用邮件对象来发送邮件。以下是Rails指南中的示例:
def welcome_email(user)
@user = user
@url = user_url(@user)
mail(:to => user.email,
:subject => "Welcome to My Awesome Site")
end
消息应该在邮件视图中呈现。我认为您在使用它时遇到了问题,因为您将旧的MailerAPI与新的API混合在一起。请看一看如何以新的方式一步一步地完成这项工作。按以下步骤操作:
将以下内容添加到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位于适当的文件夹下
希望这能有所帮助。我在发送带有.xlsx文件作为附件的邮件时遇到了类似的问题。为了让它发挥作用,我必须:
attachments['filename.xlsx'] = {
:encoding => 'base64',
:content => Base64.encode64(File.read(filename))
}
《邮件指南》第2.3.2节部分提到了这一点:从Rails 3x开始,您的内容配置决定了最终用户接收文件名的方式
而不是:
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_类型,但除非您解释附件应包含的顺序,否则最终可能会出现一些令人不快的结果,除非您在邮件中指定如下内容:
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
您是否尝试指定application/pdf而不是application/octet stream?它给出了错误:未定义的方法`filename=',因为我已经尝试过了,所以您是否尝试过它。它在体内发送的内容数据是我们无法读取的。它没有附加任何内容。@Harsh:我在回答中回答了你的问题。如果它如您所说的那样工作,那么请附上来自mailer的整个方法,而不仅仅是附件部分。@klew:您可以在我的问题中看到我的方法。@klew:是的,我已经看到了您的答案并正在处理它。我一收到输出就会回复您。谢谢。这看起来像一个不可思议的错误。文档说库将对内容进行base64编码。仅供参考,方法名称似乎已从base64.b64encode更改为base64.encode64