2011-10-24 6 views
2

IMAP APIを使用してメールボックスにアクセスし、添付ファイル(.wavオーディオファイル)があればダウンロードします。添付ファイルを保存した後、私はそれが私が再生できる有効な.wavファイルであると思っていますが、それは私に無効なファイルを与えます。IMAP(Ruby):正しいフォーマットでオーディオ(.wav)添付ファイルを取得/保存できません。

私は(mail.attachments.first.decoded)をデコードした後、添付ファイルを保存すると、それは以下の内容があります。

X-MCPBodyContent: --- 
    duration: 5 
    internal_codec: alaw 
    external_codec: wav 
    type: 1 
    filename: /9/04/04/04/05/m_88888_56b07809-1fe6-4cf7-8328-8e9bb0bd7716 
    $$$$$ 

それは(mail.attachments.first)であると私は添付ファイルを保存する場合は、それは次のようにあります。ここでは

Date: Tue, 18 Oct 2011 09:06:07 -0400 
    Mime-Version: 1.0 
    Content-Type: audio/wav; 
    charset=UTF-8 
    Content-Transfer-Encoding: base64 
    Content-Disposition: attachment; 
    filename=m_88888_56b07809-1fe6-4cf7-8328-8e9bb0bd7716.wav 
    Content-ID: <[email protected]> 

    WC1NQ1BCb2R5Q29udGVudDogLS0tIApkdXJhdGlvbjogNQppbnRlcm5hbF9j 
    b2RlYzogYWxhdwpleHRlcm5hbF9jb2RlYzogd2F2CnR5cGU6IDEKZmlsZW5h 
    bWU6IC85LzA0LzA0LzA0LzA1L21fODg4ODhfNTZiMDc4MDktMWZlNi00Y2Y3 
    LTgzMjgtOGU5YmIwYmQ3NzE2CiQkJCQk 

は、コードスニペットです:

require 'net/imap' 
imap = Net::IMAP.new('the_url', 143, false, nil, false) 
imap.login('username', 'password') 
imap.select('Inbox') 
# All msgs in a folder 
msgs = imap.uid_search(["ALL"]) 

# Read each message 
msgs.each do |uid| 
    _body = imap.uid_fetch(uid, "RFC822")[0].attr["RFC822"] 

    require 'mail' 
    mail = Mail.new(_body) 

    attachment = mail.attachments.first 
    fn = attachment.filename 
    begin 
    File.open(fn, "w+b", 0644) { |f| f.write attachment.decoded} 
    rescue Exception => e 
    puts "Error : Unable to save data for #{fn} because #{e.message}" 
    end 
end 
imap.logout 

私が時間を教えてください正確な形式で添付ファイルを取得するためにow。

ご協力いただけると助かります。

おかげ

答えて

0

私はそれを試していないが、それは価値が確実にブロック内のファイルを閉じていますか?これはストリームをディスクにフラッシュするために必要なことかもしれません。

+2

File.openブロックは自動的にファイルを閉じます。 http://stackoverflow.com/a/4795782/226255 – Abdo

3

私のために次の作品 - mp3、jpg、pdfファイルでテストされています。

new_mail = imap.search(["ALL"]).each do |uid| 
    body = imap.fetch(uid, "BODY[]")[0].attr["BODY[]"] 
    mail = Mail.new(body) 
    mail.attachments.each do |a| 
     File.open("/home/vknoll/Downloads/imap/#{a.filename}", 'wb') do |file| 
     file.write(a.body.decoded) 
     end 
    end 
end 
+0

どのメールクラスを使用しましたか?あなたはそれにメール宝石を使いましたか? – Abdo

+1

nvm ..私のために働くメール宝石=) – Abdo

関連する問題