2010-12-30 14 views
0

添付ファイル(1.pdf)を添付してメールを送信していますが、メールには1.pdfが表示されていますが、代わりに "ATT008220.dat"という名前のランダムファイルが表示されます。その理由が起こっ添付ファイルはメールで正しくありません

 @file = File.read('c:/1.pdf') 
     @file.force_encoding('BINARY') 
     attachment "application/octet-stream" do |a| 
      a.body = @file 
     end 

誰もが知っている:

私は、コード使用していますされ、次のRails 3.0 を使用していますか?何か案が?

おかげ&よろしく、

過酷なラバル。

EDIT :: ---- メール送信方法:

def contact(recipient, subject, message, sent_at = Time.now) 
    @subject = subject 
    @recipients = recipient 
    @from = '[email protected]' 
    @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

"application/pdf" i "アプリケーション/オクテットストリーム"のnstead? – Raghuram

+0

はい、私は試しました。 –

答えて

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 

を指定する必要があると私は、PDFファイルの"application/pdf"を使用します。

EDIT:

私は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以降でそれを使用して、ここで私の作品いくつかのコードがある:Railsの3メーラーAPIで

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 

が変更されました。新しいAPIを使用する必要があります。 Btw。私の最初の例がうまくいけば、ブロックの代わりにハッシュを使ってみることもできます。

ANOTHER EDIT:

私はあなたがメールを送信する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を新しいメーラーAPIと組み合わせているため、問題があると思います。 hereを見て、「新しい方法」で段階的にそれを行う方法を見てください。

+0

それはエラーを出します:#のための未定義のメソッド 'filename = ' –

+0

あなたはそれを試しましたか?私たちが読むことができないものである身体の中にコンテンツデータを送ります。それは何も付いていません。 –

+0

@Harsh:私はあなたの質問に答えました。あなたが言ったように動作すれば、添付ファイル部分だけでなく、メーラーから全面的な方法を添付してください。 – klew

0

次のように実行します。actionmailerのに次の

アドオン: -

def send_mail 
    attachments['1.pdf'] = File.read('c:/1.pdf') 
    mail(:to => "[email protected]", :subject => "xyz", :from=>"[email protected]") 
    mail.deliver 
end 

の注意: - この例では(SMTP設定が正しいことと、ファイルがアクションに対応していることを確認してくださいsend_mail.rhtml )は、適切なフォルダの下にあります。

これが役に立ちます。

3

添付ファイルとして.xlsxファイルを含むメールを送信しようとしても同様の問題がありました。

attachments['filename.xlsx'] = { 
    :encoding => 'base64', 
    :content => Base64.encode64(File.read(filename)) 
} 

この

は、メーラーガイドのセクション2.3.2に部分的に言及されています:Railsののよう http://guides.rubyonrails.org/action_mailer_basics.html#complete-list-of-action-mailer-methods

+0

ありがとうございます。これは信じられないほどのバグのようです。ドキュメントは、ライブラリがコンテンツをベース64エンコードすると言います。 – Dogweather

+1

FYIメソッド名が 'Base64.b64encode'から' Base64.encode64'に変更されているようです – yas4891

2

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 
関連する問題