2012-02-23 17 views
4

私は自分のレールアプリケーションの1つでpdf添付ファイルを送信しようとしていますが、添付ファイルは適切なpdfファイルではなくテキストとして提供されます。Rails ActionMailerの添付ファイルが文字化けして表示される

class Notifications < ActionMailer::Base 
    def contact(email_params, sent_at = Time.now) 
    subject "" << email_params[:subject] 
    recipients "" << email_params[:client] 
    from "#{email_params[:name]} <#{email_params[:address]}>" 
    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank? 
    sent_on sent_at 
    body :message => email_params[:body], :sender_name => email_params[:name] 
    end 
end 

そして、私は私のメールの受信トレイに取得:

私のメーラーは、このようになります任意の添付ファイルなしのASCII文字

の非常に長い文字列が続く

-- 
Date: Thu, 23 Feb 2012 13:50:58 -0800 
Mime-Version: 1.0 
Content-Type: text/plain; 
charset=UTF-8 
Content-Transfer-Encoding: 7bit 
Content-ID: <[mailserver]> 

Message Body 

-- 
Date: Thu, 23 Feb 2012 13:50:58 -0800 
Mime-Version: 1.0 
Content-Type: application/pdf; 
charset=UTF-8; 
filename=invoice.pdf 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; 
filename=invoice.pdf 
Content-ID: <[mailserver]> 

、そのヘッダー情報は送信されません。受信トレイに「メッセージ本文」の部分が表示されます。私はmailer.rb内の添付ファイル行のFile.read()部分が何らかの原因であると思われますが、私のブラウザからアクセスできる私のサーバー上の有効なpdfファイルを指しています。ログでは、メールが正しいパラメータで送信されたとしか言いませんが、プレーンテキストエディタでPDFを開いた場合、デコンパイルされたテキストのように表示されます。

メールプログラムビューcontact.html.erbは、単純に:<%= @message %>です。

私は間違っていると思いますか?

ありがとうございました。

更新:

どうやら、私はcontact.erbだけでなく、私の見解ディレクトリ内contact.html.erbの両方を必要としていました。ファイルをコピーして名前を変更するだけです。ただし、メッセージ本文は空白になりました。添付ファイルのみが表示されます。

答えて

3

まあ、これは最終的に働くことになった:

class Notifications < ActionMailer::Base 
    def contact(email_params, sent_at = Time.now) 
    subject "" << email_params[:subject] 
    recipients "" << email_params[:client] 
    from "#{email_params[:name]} <#{email_params[:address]}>" 

    part "text/plain" do |p| 
     p.part :content_type => "text/plain", :body => render("contact.erb") 
    end 

    @message = email_params[:body] 

    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank? 

    sent_on sent_at 

    mail(:to => email_params[:client], 
     :from => email_params[:address], 
     :subject => email_params[:subject]) do |format| 
     format.html { render 'contact' } 
     format.text { render :text => email_params[:body] } 
    end 
    end 
end 

私は余分な行があると確信しているが、少なくともあるとして働いています。私はcontact.html.erbに既にそのファイルをコピーしていたことに加えて、contact.erbからview.text.erbへビューファイルの名前を変更しました。

そして、私は私のコントローラからメソッドを呼び出しています:ちょうど参考のために、私は同じ問題を抱えていたし、私の場合には解決策は、添付ファイルやメールラインを交換することでした

def send_mail 
    Notifications.deliver_contact(params[:email]) 
    redirect_to "/mail/success" 
    #Notifications.contact(params[:email]).deliver 
    end 
+0

これは役に立ちます。 http://stackoverflow.com/questions/4610689/email-attachments#comment42373470_4610864 –

6

。最初に添付してからメールしてください。

WRONG

def pdf_email(email, subject, pdfname, pdfpath) 
    mail(:to => email, :subject => subject) 
    attachments[pdfname] = File.read(pdfpath) 
end 

GOOD

def pdf_email(email, subject, pdfname, pdfpath) 
    attachments[pdfname] = File.read(pdfpath) 
    mail(:to => email, :subject => subject) 
end 
2

うん、私は最近、同じ問題に遭遇し、メール内容体で何かを下に置く後、のようなもの:

mail(:to => reciever, :subject => "Hello, this is a mail from rails!") do |formate| 
     formate.text {render :text => "mail content body "} 
    end.deliver 

添付ファイルが正常に表示され始めます。

0

私は同じ問題に直面しましたが、添付ファイルとメール配信の順序を変更することはできませんでした。

私にとっては、ファイル名に.pdf拡張子を追加しています。私のファイル名にはすでにpdf拡張子が付いていましたが、アクションメーラは単に拡張子を読まなかっただけです。それをもう一度付け加えると、完璧に働いた

attachments[file_name + '.pdf'] = File.read(path) 
関連する問題