IMAP (Ruby): не удается получить / сохранить аудио (.wav) вложение в правильном формате - PullRequest
2 голосов
/ 24 октября 2011

Я использую API-интерфейс IMAP для доступа к своему почтовому ящику и загрузки вложений (аудио-файл WAV), если таковые имеются. После сохранения вложения я ожидаю, что это будет действительный файл .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: <4e9d79bfa830f_7efc3f9579013bfc3648e@vavcafeserver2.mail>

  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

Пожалуйста, дайте мне знать, как получить вложение в правильном формате.

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 января 2013

Следующие работы для меня - проверено с 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 голосов
/ 16 февраля 2012

Я не пробовал, но стоит ли закрывать файл в блоке обеспечения? Вполне может быть, что это необходимо для очистки потока на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...