2012-06-14 3 views
1

Я использую функцию ниже, чтобы создать хэш всего содержимого каталога, чтобы я мог отправлять все файлы в виде вложений.Как отправить двоичный файл через Pony?

def get_attachments_from_directory(dir) 
    attachment_to_send = Hash.new 
    Dir[dir.gsub("\\","/")+"/*"].each {|file| 
     file_to_send = File.read(file) 
     #file_to_send = File.read(file, :binmode => true) 
     attachment_to_send[File.basename(file)]=file_to_send 
    } 
    return attachment_to_send 
end 

, а затем я использую ниже функции для отправки вложений из

def email_it(body, subject, to, from, attachment_to_send) 

    $smtp = 'mail.com' 
    $smtp_port = 25 


    Pony.mail(
     :to => to, 
     :from => from, 
     :subject => subject, 
     :body => Nokogiri::HTML(body).text, 
     :html_body => body 
     :attachments => attachment_to_send, 
     :via => :smtp, 
     :via_options => { 
       :address  => $smtp, 
       :port  => $smtp_port, 
       :enable_starttls_auto => false 
     } 
    ) 
end 

Есть два файла в моем каталоге тестирования: .log и .png. Оба они отправляются и принимаются, но .png поврежден. gmail сказал, что файл изображения не может быть отображен, потому что он содержит ошибки. Имя файла .png верное в моей учетной записи gmail. Размер файла неправильный. Гораздо меньше.

Показать оригинал в Gmail дает мне

----==_mimepart_4fd9515347359_fc1e853c88342d 
Date: Thu, 14 Jun 2012 12:49:55 +1000 
Mime-Version: 1.0 
Content-Type: image/png; 
charset=UTF-8; 
filename="error_when_time_out - login at 2012-06-14 12.48.55.png" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; 
filename="error_when_time_out - login at 2012-06-14 12.48.55.png" 
Content-ID: <[email protected]> 

iVBORwq/XNErlnbxOOrmtdDZDYaMWm16lTatQptSpk4t12RW6HNq6IJGvvyB 
sabbUovDe5+loc9U3yPX9Yr1vWJDv9Q4KNcPydUDQnkfV9LNFrTTOc2GrEZd 
Rr0uo06fUUdn1jOZ9RxRnZBZJ2bXG3M4yoTplFqeWJFGFoVBjDanha5JoWOM 
bx3hi0aTQPSQNcikNoMVeYrndSi9YeVl1jxLr07oNrrn11F1kv3AeL9C8Mpi 
bkTrjvku73RaeOP6/KvXVv5yzfC6vfCqHf/H64Y/XNf//obujzf0f7lp+PMt 
... it continues .... 
Xvjq8X//p/Ocdy68s2/DZ//5/Muvf/rvt319XzQf8p9J+7wpSTTguXYPo3Dy 
TYiIaNAvYXs5ir9gv4akEz5MOO6DxGPf150oPfApIe6Yu5SVblRBYgL1TrWq 
QqWsUnFag5rYTagbCD4lJCgO2hYdpGzQteqR9NCgo3ZTmh0= 


----==_mimepart_4fd9515347359_fc1e853c88342d-- 

проверять хэш выходов

{"error_when_time_out - login at 2012-06-14 12.50.12.png"=>"\211PNG\n\277\\\321 
+\226v\3618\352\346\265\320\331\r\206\214Zmz\2256\255B\233R\246N-\327dV\350sj\35 
0\202F\276\374\201\261\246\333R\213\303{\237\245\241\317T\337#\327\365\212\365\2 
75bC\277\3248(\327\017\311\325\003By\037W\322\315\026\264\3239\315\206\254F]F\27 
5.\243N\237QGg\3263\231\365\034Q\235\220Y'f\327\es8\312\204\351\224Z\236X\221F\0 
26\205A\2146\247\205\256I\241c\214o\035\341\213F\[email protected]\364\2205\310\2446\203\025y 

Если я пытаюсь прочитать файл с #file_to_send = File.read(file, :binmode => true) я получаю сообщение об ошибке: TypeError - can't convert Hash into Integer:

  • ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]
  • мим-типа (1,16)
  • пони (1,3)
+0

Префикс '' 'на переменной означает, что он глобальный, и это, вероятно, не то, что вы намеревались здесь. – tadman

+0

Нет префикса '$' для любой переменной, связанной с вложениями ... – Radek

+0

Вы не должны использовать переменные, называемые «$ smtp» или '$ smtp_port', потому что они будут глобальными во всем вашем процессе. Вы не можете так привыкнуть. – tadman

ответ

1

Традиционный способ чтения двоичных данных без перевода CR + LF является:

File.open(file, 'rb').read 

Ruby 1.9 вводит несколько новых способов для этого вы можете непреднамеренно пытаться в своей среде 1.8.7. Второй аргумент read - это количество байтов, которое вы хотите прочитать, а не режим файла.

Обязательно прочтите the documentation по любому способу, с которым вы не знакомы. Иногда вещи не совсем то, что вы ожидаете.

+0

Работает гладко. Спасибо. Я использовал 'File.read (файл)', потому что в образце кода Pony использовалось как приложение. И файл был '.xls', поэтому я думал, что он будет обрабатывать двоичные файлы. – Radek

+0

Некоторые платформы читаются в двоичном формате по умолчанию, а другие - для преобразования. Windows, насколько мне известно, конвертирует по умолчанию. – tadman

Смежные вопросы