在铁路邮件中附件不合适

时间:2010-12-30 07:42:39

标签: ruby-on-rails email attachment

我发送带附件的邮件(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

4 个答案:

答案 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)存在于相应的文件夹下。

希望这有帮助。