Chienomi

携帯万能の「送信メールが取り込めない」問題をなんとかする

書き捨てユーティリティコード

  • TOP
  • Old Archives
  • 携帯万能の「送信メールが取り込めない」問題をなんとかする

私はWILLCOMのW11Kを使っているのだが、このメールデータを取り込むのに、「携帯万能」以外の道がない。

そのため、Amazonで携帯万能を購入して使っているのだが(昨日のエントリの通り)、これがまた曲者で、対応するドライバがWindows 2000/XP/Vista/7の32bitのみという。

Windows 8でもWindows 7 64bitでもダメというのは、今時相当きつい。 うちではWindows XPマシンが1台あるだけだ。

さて、Windows XPはトリスターサポートの「まっさらにしろ」という指示により苦労しつつも初期化したのだが、取り込んだところ結局同じ問題だ。 送信メールが正常に取り込めない。

トリスターの人は、Outlookがどうとか、全く違うところに話を持って行ってしまうのだが、明らかに「アップデータでバグを埋め込んだ」話だ。

で、エクスポートしたCSVを実際に見てみた。

lvで見てみると、ある時期を境に文字化けが分かれている。これはまぁ、わかる。 そして、Mousepadで開こうとすると、不正なシーケンスがあるとして開けない。

Shift-JISならShift-JISで開けるソフトなので、これは恐らく違う文字エンコーディングがバイト列をそのままに吐き出している、ということだろう。 だとしたら、まだ手はある。

試しに、headtailcutで文字化けしているところとしていないところだけを切り出してnkf -gしてみると

$ tail send-text.csv | cut -f 5 -d "," | nkf -g
Shift_JIS
$ head send-text.csv | tail -n 9 | cut -f 5 -d "," | nkf -g
UTF-8
$ head send-text.csv | cut -f 4 -d "," | nkf -g
Shift_JIS

やっぱり

  • 以前は全てShift-JISだった
  • 現在は、Subjectまでの4フィールドはShift-JISだが、本文だけUTF-8である

ということが分かった。

さすがにこの混在はきついので、分離する。

$ head -n 3825 send-text.csv >| sendmail-UTF8sec.csv
$ head -n+3826 send-text.csv >| sendmail-SJISsec.csv

通常は後半部分は考えなくていいはずだ。 後半部分は単に結合すれば良いように変換しておく。

$ nkf -w -Lu sendmail-SJISsec.csv sendmail-SJISsec.utf8.csv

で、困ったことにこの状態だとRubyでCSVを切り出すことができない。RegExpが使えないために、CSVライブラリも使えないのだ。

Perlで試したところ

  • perl -nなら黙っていてもできる
  • while (<>)だとuse utf8の必要あり

というわけで、結局こういうコードになった。

#!/usr/bin/zsh

head -n1 "$1" | nkf -w -Lu >| out.csv

tail -n+2 "$1" | perl -n -e 'if ($_ =~ /"(?:[^"]*|"")*"\s*$/) { print STDOUT $&; print STDERR $`; print STDERR "\n" }' >| out.l 2>| out.f
nkf -w -Lu out.l > out.lu
nkf -w -Lu out.f > out.fu

ruby -e 'File.foreach(ARGV[0]).zip(File.foreach(ARGV[1])) {|i,j| puts(i.chomp + "," + j) }' out.fu out.lu | sort -u >> out.csv

単純に,で区切るとエンベロープやSubjectに入っている可能性があるため、せめてこうした。多分これでいけるはずだ。

一時ファイルなしでいきたかったが、そうするとnkfから1行ずつ読む必要があり、ちょっと面倒だった。

ちなみに、これ

  • 1行目はCSVヘッダーでShift-JIS
  • sortしている関係で日付順になる。sort -ruにすればオリジナルと同じ配列

この状態だとまともなCSVなので、MHやemlに変換するのも、それほど難しくない。

ほんとにひどい品質のソフトだと思う。