1

以下の関数を使用して、ディレクトリのコンテンツ全体のハッシュを作成し、すべてのファイルを添付ファイルとして送信できるようにします。

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

私のテスト用ディレクトリには 2 つのファイルがあります:.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: <4fd95153648c7_fc1e853c883518@RATionalxp.mail>

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\223@\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 パッチレベル 302) [i386-mingw32]
  • MIME タイプ (1.16)
  • ポニー (1.3)
4

1 に答える 1

1

CR+LF変換なしでバイナリデータを読み取る従来の方法は次のとおりです。

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

Ruby 1.9 では、これを行うためのいくつかの新しい方法が導入されていますが、1.8.7 環境で誤って試してしまう可能性があります。の 2 番目の引数readは、ファイルのモードではなく、読み取るバイト数です。

よくわからない方法については、必ずドキュメントを読んでください。時々、物事はあなたが期待するものとはまったく異なります。

于 2012-06-14T06:06:36.000 に答える