POP3 でメールを受信し、添付で送られてきた画像データを抜き出すスクリプトを Perl で書いた。
最初は受信してきたメールを MIME::Parser で解析して添付ファイルを抽出しようと思ってたんだけど、日本語ファイル名が含まれていた時に何か問題あるという話を見つけたので、十年くらい前に自作した Parser を使うことにした。
ちゃんと RFC 見て書いたコードじゃないけど、何年か業務システムで使っていた間に、「OutlookExpress のメールは、Quoted-Printable エンコードなのかよ!」とか、「EdMax の boundary 文字列には、エスケープしないといけない特殊記号がバンバン混ざってるのね」とか、そんなメールソフト毎の微妙なフォーマットの違いや、添付ファイルが多段に展開する HTML メールとか、色々なことに実践的に対応してきたので、大概のメールは問題なく処理出来るようになってるからな・・・と思ってたんだけど・・・
iPhone のメールはまた独特じゃねえ(^^;
結局今回は iPhone 対応が必要じゃった。
iPhone メールで送られてきたメールが他のメールソフトのものと違うところ。
まず一つめ。添付ファイルのヘッダの順番が全然違う。
ほとんどのメールソフトが添付ファイルのスタートを表す boundary 文字列のあと、Content-Type ヘッダが来るんだけど、iPhone(つーか、Apple 製のメールソフトは皆そうなん?)の場合は Content-Disposition ヘッダが来るんだな。
次に、Content-Disposition ヘッダの filename の記述が独特じゃねえ。
普通は(日本語ファイル名なら)
filename="=?ISO-2022-JP?B?GyRCJF4kJCReJCQbKEIxLmpwZw==?="
という形なんだけど、iPhone メールは
filename*=iso-2022-jp''%1B%24B%3CL%3F%3F%1B%28B.jpg
てな形で来るな。
MIME B エンコードじゃなく、URL エンコードしたファイル名が来るんだな。
filename と = の間に * があるのも謎だし。
いや、どっちも致命的な問題じゃなくて、添付ファイルの抜き出しそのものには影響ないんだけど、Content-Type ヘッダをヘッダ情報をログに吐き出す開始トリガーにしてたり、オリジナルのファイル名がセットされているかどうかを正常にヘッダ情報が抜き出せたかの判断材料にしてたりしたので(filename の後ろに * が付いている形は想定してなかったので、オリジナルのファイル名が抜けなかったのだ)、ちょっと変な動きをしてしまった。
まあ、生のメールデータを見れば問題点はすぐわかるので、ささっと対応したが。
こんなこと書くと、「RFC ちゃんと読んでコード書けば問題ないじゃろ」と知ったかぶりに指摘する人がいるんだが、例えば日本のケータイのメールアドレスなんて(天下の NTT DoCoMo からして)RFC なんか無視してるし、実際のデータを解析して対応しないとどうしようもない部分があるんだぜ。
まあ、興味がある人は、色々なメールソフトから送った生のメールデータを見てみると色々楽しいよ。
全てのソフトのデータを問題なく抽出するにはどんな正規表現を書けばいいかとか、パズルみたいで楽しいよお。(笑)
コメントする