2012-12-09 72 views
3

我有一個ActionMailer安裝程序發送電子郵件與附件從S3。我這樣做是這樣的:附加遠程URL文件作爲附件在行動郵件程序

def job_apply(current_tenant, applicant) 
    @current_tenant = current_tenant 
    @applicant = applicant 

    file = open(applicant.resume.url).read 
    attachments[applicant.resume] = file 

    email_with_name = "#{@current_tenant.name} <#{@current_tenant.help_email}>" 
    mail(from: email_with_name, to: applicant.job.apply_email, subject: "New Job Application") 
end 

的applicant.resume.url返回,我可以在瀏覽器中打開,並檢索與該文件一個正確的網址,但我收到以下錯誤:

Message undefined method `ascii_only?' for #<ApplicantResumeUploader:0x007fe6bc5c28a8> 
File /Users/cmalpeli/.rvm/gems/[email protected]_board/gems/mail-2.4.4/lib/mail/encodings.rb 
Line 103 

這是encodings.rb代碼:

98  def Encodings.decode_encode(str, output_type) 
99  case 
100  when output_type == :decode 
101   Encodings.value_decode(str) 
102  else 
103   if str.ascii_only? 
104   str 
105   else 
106   Encodings.b_value_encode(str, find_encoding(str)) 
107   end 
108  end 

我在一個小的損失在何處何去何從的...

任何幫助,將不勝感激...

+0

如果你註釋掉'attachments [applicant.resume] = ...'這行是否正確發送電子郵件?如果是這樣,「applicant.resume」的內容是什麼?它應該是一個像'resume.pdf'或'resume.doc'這樣的文件名字符串。 – mccannf

+0

是的 - 如果我發表評論,它會發送正確的信息。 「applicant.resume」的價值就像「resume.doc」。 'applicant.resume.url'的值就像'something.cloudfront.net/uploads/applicant/resume/10/resume.doc'。在瀏覽器中打開路徑啓動文件的下載。 – cman77

+0

您的問題回答了我正面臨的一個問題:)謝謝!我正在使用'open(...)'而不是'open(...)。read'。我希望你也能得到答案 – Cristian

回答

4

問題是你的applicant.resume字符串在attachments[applicant.resume]。如果這不是一個字符串(如JavaScript對象),並且不是可以表示您附加到電子郵件的文件的文件名,那麼這會給ActionMailer帶來問題。

確認applicant.resume字符串的確是像foo.pdfresume.doc這樣的文件名,然後再繼續。

+0

感謝您的幫助 - 但那導致了相同的錯誤.... – cman77

+0

這可能是'applicant.resume'字符串裏面有一些奇怪的字符嗎?作爲一個測試,如果你只是將'attachments [applicant.resume] = ...'這一行更改爲'attachments ['foo.doc'] = ...'它有效嗎? – mccannf

+1

這讓我走上了正確的道路!似乎問題在於'applicant.resume'不是一個字符串,而是我的Carrierwave上傳器對象。將其更改爲'applicant.resume.file_name'通過w/an附件發送電子郵件 - 但附件是一個空文件。當我回到我的機器時,我會查看是否將其更改回'open(applicant.resume.url).read'。 – cman77