Ruby on rails 附件在mail-in-rails中不正确

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 = @

我正在发送一封带有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
        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