MODx の eForm から eform2db のような手法で直接 DB

に入れようと思っていたが、ビジネス上の都合で叶わず、メールで受け取ることになった。まあ、そんなにアンケートに答えてくれる人がいるわけじゃないから、いいでしょ。と思っていたら大量のメールが送られていた。あら~。



<p>仕方がないので、メールを読み取って DB に格納することにした。</p>

<pre class="prettyprint">#!/usr/bin/ruby

# ■ 使い方
#
# 引数にメールファイル名を渡す。1メール1ファイル。
# ruby ./mail2db.rb mail/*
#
# すると、DB に格納される。
#
# ■ メール本文の形式
#
# —– ここから —–
# アンケートへの回答がありました♪
#
# 日時: 15-05-2009 14:07:27
# おなまえ:xxxx
# メールアドレス:xxxxx@xxx.com
# 参加可能日時:0523_1000, 0530_1000
# 利用頻度:8-19
# きっかけ:きっかけきっかけきっかけきっかけきっかけきっかけきっかけ
# きっかけきっかけきっかけきっかけきっかけきっかけきっかけきっかけ。
# 要望:ようぼうようぼうようぼうようぼうようぼうようぼうようぼうようぼう。
# —– ここまで —–
#

require ‘date’
require ‘parsedate’
require ‘rubygems’
require ‘tmail’
require ‘dbi’

def process_files(files, dbh)
converter = Iconv.new(‘SHIFT_JIS’, ‘UTF-8’)
files.each { |file|
raw_email = File.open(file, ‘r’) { |f| @mail = f.read }
email = TMail::Mail.parse(raw_email)
enquete = parse(email.body)
save(enquete, dbh)
puts enquete[:postdate]
}
end

def parse(body)
result = {}

# 改行されている項目をつなげる
lines = []
item = nil
body.each_line { |line|
line.chomp!
if (line.index(“:”))
if item
lines « item # 前の項目があるなら lines に保存する
end
item = line # 新しい項目をみつけた
else
if item
item « line # この行は前の項目の続き
end
end
}
lines « item # 最後の項目
lines.each { |line|
elements = line.split(‘:’)
if elements.size == 2
value = elements[1]
case elements[0]
when ‘日時’
result[:postdate] = value
when ‘おなまえ’
result[:nickname] = value
when ‘メールアドレス’
result[:email] = value
when ‘参加可能日時’
result[:candidate_dates] = value
when ‘利用頻度’
result[:frequency] = “’” + value # ‘ はエクセル対策
when ‘きっかけ’
result[:kikkake] = value
when ‘要望’
result[:youbou] = value
end
end
}
return result
end

def save(enquete, dbh) dbh.do(«EOF, enquete[:postdate],
enquete[:nickname], enquete[:email], enquete[:candidate_dates],
enquete[:frequency], enquete[:kikkake], enquete[:youbou])
insert into
test.enquetes(
postdate,
nickname,
email,
candidate_dates,
frequency,
kikkake,
youbou
)
values(?, ?, ?, ?, ?, ?, ?)
EOF
end

files = ARGVdbh =
DBI.connect(‘dbi:Mysql:database=test;host=localhost;mysql_read_default_file=/etc/my.cnf’,
‘test’, ‘passwd’)
process_files(files, dbh)
</pre>