Rubyでメールを受信。

ヘッダー情報等、一切切らずにかつテキストで保存したとか思って書いてみた。
ruby


なんとなくファイル名はcpop
CUIPOP3メールとかそんなだった気がする。
どうでもいいのですでに忘却。

#!/usr/bin/env ruby

#設定ファイル名
rcfile=".cpoprc"

require 'net/pop'
require 'yaml'
require 'readline'
require 'openssl'

#暗号化
def encrypt(text, key)
	enc = OpenSSL::Cipher::Cipher.new('aes256')
	enc.encrypt
	enc.pkcs5_keyivgen(key)
	((enc.update(text) + enc.final).unpack("H*")).to_s
rescue
	false
end

#復号化
def decrypt(text, key)
	dec = OpenSSL::Cipher::Cipher.new('aes256')
	dec.decrypt
	dec.pkcs5_keyivgen(key)
	(dec.update(Array.new([text]).pack("H*")) + dec.final)
rescue
	false
end

#こっから本体。
#マスターパスワードの入力
begin
	#パスワード入力のためローカルエコーを切る
	system "stty -echo"
	master = Readline.readline( "master password: ", false )
	#ローカルエコーを戻す
	system "stty echo"
	print "\n"
rescue Interrupt
	#途中でInterruptされた場合も戻さないと悲惨なことに...
	system "stty echo"
	print "\n"
	exit
end

#設定ファイルを読み込む
if File.exist?( "#{ENV['HOME']}/#{rcfile}" ) then
	settings = YAML.load( File.open( "#{ENV['HOME']}/#{rcfile}" ).read )
	settings.each { |name,hash|
		#各種設定
		#パスワードだけ暗号化されてる。
		server = hash[ 'server' ]
		username = hash[ 'username' ]
		password = decrypt( hash[ 'password' ], master )
		savedir = hash[ 'savedir' ]
		port = hash[ 'port' ]

		#改行がこなくても進捗が表示される用にsyncる
		STDOUT.sync = true
		print "connecting #{server} ... "
		begin
			Net::POP3.start( server, port, username, password ) { |pop|
				puts "done"
				tmp=0
				pop.mails.each { |m|
					#ユニークID、通し番号を取得
					uniq,num = m.unique_id.split( '.', 2 )
					print "recieving mail ##{num} ... "
					if not File.exist?( "#{savedir}/#{num}" ) then
						#未受信
						File.open( "#{savedir}/#{num}", 'w' ) { |f|
							m.pop f
							f.chmod 0444
							print "done : "
							#Fromフィールを抜き出す。
							puts /^From: (.*)$/.match( m.header )[1]
						}
					else
						puts "exist"
					end
				}
			}
		rescue
			puts "failed"
		end
	}
end


設定ファイルはyamlで。

hoge:
 server: pop3.hoge.jp
 username: foo
 password: 83bf330ad53eed4beab559f65e253b63
 savedir: /home/alice/inbox/hoge
 port: 110

fuga:
 server: pop3.fuga.ne.jp
 username: bar
 password: ce8e403cf9f3b1d1cb16ec89254ebb88
 saverdir: /home/alice/inbox/fuga
 port: 110

こんな感じで複数かけます。
パスワードは暗号化されてるのですが、それ用のウィザードを作ってないので

  1. ↑のソースコードからrequireと暗号化の部分をコピー
  2. irb起動
  3. 貼り付け
  4. encrypt( "pop3Password", "masterPassword" )

の様にやって出てきた文字列の中身を張り付けてやってください。
スターパスワードを使うので、複数アカウントで別パスを使ってても安心(何が?
というかむしろセキュリティは無い、と思ってもらった方がいいです。はい。


これでも使ってvimメーラでも作ってみようかな(w