Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
[DMY] [VB] [VB6] [Python] [C#] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [CE] [LTSA]
[自動化] [Qt] [OCaml] [3Dプリンタ] [TOOLS] [RAA] [Forge]
  [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [EA] [マクロ]

2007-12-13

Tmailで受信した添付ファイルをファイル名付きで保存する方法

17:46 | Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 を含むブックマーク はてなブックマーク - Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 のブックマークコメント

これですね。 Index: lib/tmail/textutils.rb =================================================================== --- lib/tmail/textutils.rb (revision 3674) +++ lib/tmail/textutils.rb (working copy) @@ -199,8 +199,7 @@ def decode_RFC2231(str) m = RFC2231_ENCODED.match(str) or return str - NKF.nkf(NKF_FLAGS[$KCODE], - m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr }) + to_kcode(m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr }) end end いまのところ次のバージョンをリリースする目途がたってないので、 申し訳ありませんがとりあえずローカルパッチでしのいでください。

[ruby-list:43320

lib/tmail/textutils.rbに上記変更をして

190行目より

    def decode_RFC2231(str)
      m = RFC2231_ENCODED.match(str) or return str
#      NKF.nkf(NKF_FLAGS[$KCODE],
#              m.post_match.gsub(/%[\da-f]{2}/in) {|s| s[1,2].hex.chr })
      to_kcode(m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr })
    end

extract-attachments.rbに「$KCODE="SJIS" 」「 file = m.disposition_param('filename')」を入れるとTmailで添付ファイル名をきれいに変換してくれました(^-^)

使い方 extract-attachments.rb (上記「POP3によるメール受信」の pop.rbで受信したファイル名)

extract-attachments.rb

#
# extract-attachments.rb  -- Extracts attachment(s) from the message.
#
# Usage: ruby extract-attachments.rb mail mail...
#

require 'tmail'

$KCODE="SJIS" 

def main
  idx = 1
  ARGV.each do |fname|
    email=TMail::Mail.load(fname)
    email.parts.each do |m|
      m.base64_decode
      file =  m.disposition_param('filename')
      file = "#{idx}.#{ext(m)}" if file.nil?
      
      File.open(file, 'wb') {|f|
        f.write m.body
      }
      idx += 1
    end
  end
end

CTYPE_TO_EXT = {
  'image/jpeg' => 'jpeg',
  'image/gif'  => 'gif',
  'image/png'  => 'png',
  'image/tiff' => 'tiff',
  'application/vnd.ms-excel' => 'xls',
  'application/msword' => 'doc'
}

def ext( mail )
  CTYPE_TO_EXT[mail.content_type] || 'txt'
end

main
トラックバック - http://ruby.g.hatena.ne.jp/garyo/20071213