メールファイル(.eml)の本文を取得するには?

解決


つる  2006-03-14 02:54:13  No: 94566

OutlookExpressの受信メールをエクスプローラにドロップすると作成される拡張子がemlのファイルをVB上で読み込むアプリを作成しようとしています。

メールヘッダー部の
Subject: =?iso-2022-jp?B?SFRNTBskQiVhITwlayU1JXMlVyVrISFFOklVJVUlISUkJWskSiQ3GyhC?=
等のbase64&JISコード部分はBASP21で変換するので問題ないのですが、
本文を日本語化できずに悩んでおります。

本文部分を
「Content-Type: text/plain;
  charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit」で始まり、
「------=_NextPart_」で終わる文字列と考えれば良いことは
分かっているのですが、
その間の文字列をVB上で日本語表示するにはどうすれば良いのでしょうか?
JISコードの文字列をUnicodeで表示しているので文字化けするのだとは
思うのですが。

最終的にやりたいことは、VB上への表示ではなくMySQLのDBへの書き込みです。ですが、その前段階としてVB上での日本語表示ができれば前進するのではないかと思っております。

皆様のお知恵をお貸し下されば幸いです。

よろしくお願いします。


魔界の仮面弁士  2006-03-14 03:53:41  No: 94567

VB.NET なら、System.Text.Encoding で、.GetEncoding("iso-2022-jp")。
VB6 なら、ADODB.Stream で、.Charset = "iso-2022-jp" 。

……を使ってデコードすれば、通常の文字列として扱えるようになるかと。


つる  2006-03-14 04:20:54  No: 94568

ご回答ありがとうございます。
魔界の仮面弁士さんの過去の回答を参考にして、
以下のような形で一行ずつデコードできるかと
思ったのですが、ダメでした。
iso-2022-jpの文字列を読み込み、Shift_JISに変換する必要が
あるのかと思い、書いてみたのですがまるで検討違いだったようです。

    Open File1.Path & "\" & File1.List(i - 1) For Input As #Fn
        Do Until EOF(Fn)
            Line Input #Fn, linetext
            msgbox Conv_Text(linetext)
        Loop
    Close #Fn

Function Conv_Text(str)
    'JISコードのストリームを作成
    Set Stm = New ADODB.Stream
    Stm.Open
    Stm.Type = adTypeText
    Stm.Charset = "iso-2022-jp" 'あるいは"Shift_JIS"や"EUC-JP"とか
    Stm.WriteText str

    'JISコードのバイナリとして取得
    Stm.Position = 0
    Stm.Type = adTypeBinary
    B = Stm.Read()
    Stm.Close
    Set Stm = Nothing

    'JISコードのストリームを作成
    Set Stm = New ADODB.Stream
    Stm.Open
    Stm.Type = adTypeBinary
    Stm.Write B
    Stm.Position = 0
    Stm.Type = adTypeText
    Stm.Charset = "Shift_JIS" 'あるいは"Shift_JIS"や"EUC-JP"とか
    Conv_Text = Stm.ReadText()

end function

が、ファイルからの読み込み、書き出しもできるとの
書き込み、今回の回答から以下のように書いてみたら
あっさり出来てしまいました。ありがとうございました。

    Dim objStream
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Open
    objStream.Charset = "iso-2022-jp"
    objStream.LoadFromFile ファイルパス
    デコード後文字列 = objStream.ReadText()
    objStream.Close

まだまだ試せることが残っている段階で質問してしまったことを
反省しております。
ただ、一行ずつデコードできないことについては、これはこれで
ぜひ解決したい問題でもあります。
ひとまず解決ではありますが、この件についてもお知恵を拝借できれば
幸いです。

よろしくお願いします。


魔界の仮面弁士  2006-03-14 04:31:08  No: 94569

> 一行ずつデコードできないことについては

一行ずつ読み取る機能もありますよ、ADODB.Stream には。
ヘルプで確認してみてください。


つる  2006-03-14 20:20:50  No: 94570

ヘルプで探してみたいと思います。

魔界の仮面弁士さん、どうもありがとうございました。

当初の目的は達成できましたので
解決とさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加