- PR -

Base64のデコード

投稿者投稿内容
ふみ
会議室デビュー日: 2005/12/07
投稿数: 8
投稿日時: 2005-12-08 16:34
いつもこの掲示板には大変お世話になっています。

今回やりたいこととしてはEMLファイルから添付ファイルの
内容を抜きだすという処理を実装したいと考えております。

Base64のデコードの方法に関してはこちらの掲示板に過去ログ
としてみつけられました。
ただその前段階として、emlファイルはメールの内容は通常のS_JISで、
添付ファイルがBASE64でエンコードされているようですが、
どこからがBASE64かという判断はどこでできるものなのでしょうか?

今ちょっとかっこ悪いですが、EMLファイルを見るとBASE64となる
前にヘッダのような情報として
---
Content-Type: application/octet-stream; name="body.txt"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="body.txt"
Content-MD5: GRIMMV1.0

BASE64文字列

---
というような感じになっているので、この文字列の次の行はBASE64
という判断をしています。
フォーマット的に絶対この形で入ってくるのかもわかりませんし、
あまりこのような力技は使用したくありません。

なにか解決手段の助けとなるような知識をお持ちの方はぜひご教授
いただけると助かります。

どうかよろしくお願いします。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-12-08 16:45
MIMEマルチパートについてはRFC2112で規定されています。
http://rfc.net/rfc2112.html

添付ファイルがあるメールはboundary文字列で複数のパートに分けられますので、そのパートごとに区切って処理をします。
まーちん
会議室デビュー日: 2001/12/10
投稿数: 5
投稿日時: 2005-12-08 17:31
emlファイルなら、javax.mail.internet.MimeMessageクラスの
SessionとInputStreamを引数に取るコンストラクタで読み込めますよ。

Sessionはデフォルトセッションで大丈夫です。
ふみ
会議室デビュー日: 2005/12/07
投稿数: 8
投稿日時: 2005-12-08 18:02
びしばしさん早速の回答ありがとうございます。

Content-Type: multipart/mixed; boundary="-"

メールのヘッダにあったので文字列が"-"のもので
パートに分けてみたのですが、
ヘッダ情報のまで取り込んでしまいます。
(で、ヘッダ情報は文字バケします。)

何か自分がおこなっていることが見当違いな気が
するのですが、もう少しヒントをいただけると
助かります。

申し訳ありませんが、よろしくお願いします。
ふみ
会議室デビュー日: 2005/12/07
投稿数: 8
投稿日時: 2005-12-08 18:11
マーチンさんお返事ありがとうございます。

貴重な情報は大変ありがたいのですが、客先の環境に
java mailのjarを取り込むことが許されないようなので
sun.misc を利用させていただきます。

質問しておきながら申し訳ありませんが、ご容赦ください。
自宅で動作確認して知識として覚えておきたいと思います。

わざわざありがとうございました。
まーちん
会議室デビュー日: 2001/12/10
投稿数: 5
投稿日時: 2005-12-09 15:40
JavaMailが使えないとは面倒くさいですね。

Content-Typeのboundary文字列はメッセージパートを区切るものなので、
区切られた中にヘッダも入ります。添付ファイルなら、ファイル名やMIME-TYPE
などの情報をそこから取ることが出来ます。
ヘッダとボディの区切りには空行が必ず入りますので、それで識別できます。

普通のメーラなら、メッセージをemlファイルにエキスポートできますので、
それを見ながらいろいろとやってみてはいかがでしょうか?

なお、メッセージパートはネスト構造をとることが出来ます。パートの中の
Content-Typeにboundary文字列が指定されている場合には、さらにその中が
パートに分かれていることを表すのでご注意を。

ふみ
会議室デビュー日: 2005/12/07
投稿数: 8
投稿日時: 2005-12-09 17:08
まーちんさんお返事ありがとうございました。

EMLファイルをテキストで開いたメールそのままなんですね。

そういう仕様となっているなら安心して使えそうです。
ありがとうございます。

時にもうちょっと前の段階の話なのですが、質問させて
いただいてよろしいでしょうか?

バウンダリでエンコードを分けているのは理解しました。
BASE64からアスキーへの変換する関数もわかります。
では、実際にどうやってBASE64の部分だけをアスキーに
変換すべきでしょうか?

今、2つの方法でやっているのですがうまくいきません。
アドバイスできるようでしたらよろしくお願いします。

1.BufferedReder の readLine()で1行づつ読込みながら
  バウンダリ文字列を探す。
  これだと、文字列を探すのはよいのですが、BASE64を
  readLine()している時点で多分もう間違っていて、
  変換に失敗してしまいます。
  改行していない場所で勝手に改行がはいったりしてます・・・

2.バイナリで読み込むと、バウンダリ文字列の場所が
  特定できません。

というような感じでなかなか報われない苦労をしているの
ですが、うまくいきません。

もしよろしければ、なにかいい方法を教えていただけると
幸いです。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-12-09 17:53
>改行していない場所で勝手に改行がはいったりしてます・・・

メールのフォーマットは改行コードがCRLFですので、そのあたりが悪さ
しているのではないでしょうか。

スキルアップ/キャリアアップ(JOB@IT)