The project of U-WA-
http://uwa.potetihouse.com/
戻る
TKMP.DLL   プログラミングTips

分割メールを解析する

 分割メールの解析についてはRFC2046に定義されているので詳細は省略しますが、簡単に説明すると、 Content-Typeヘッダーがmessage/partialの時、それに続くデータをもとに解析することになります。
(例)
Content-Type: Message/Partial; number=2; total=3;
              id="xxxxxyyyyzzzz"
 この場合は断片の場所2(number),分割総数3(total),識別子xxxxxyyyyzzzz(id)となります。 処理方法は同一の識別子(id)を集めて、断片の場所(number)で整列します。
 このとき注意する点は分割総数(total)は最後の断片以外付ける必要がないことです。
 分割メールがすべて揃ったら、次にデータの結合を行います。 通常TKMP.Reader.MailReaderクラスで処理する場合と違い、 各メールのデータをバイナリとして読み出して結合する必要があります。
 結合後のデータは分割する前の本来のメールデータとなるので、 それをもう一度、TKMP.Reader.MailReaderクラスで解析する必要があります。
 サンプルプログラムでは、各分割メールのをTKMP.Reader.MailReaderクラスのMainDataプロパティから バイト配列として読み出し、それをつなげた新しいSystem.IO.Streamクラスを作成しています。
 元のメール内容を読むにはもう一度TKMP.Reader.MailReaderクラスで処理する必要があります。
C#.NET
//分割メールのストリームから結合したメールデータを取り出す
private System.IO.Stream GetMailStream(System.IO.Stream[] MailDatas)
{
    //結合データを格納するためのストリームクラスを作成します
    System.IO.MemoryStream ms = new System.IO.MemoryStream();

    foreach(System.IO.Stream stream in MailDatas)
    {
        //各メールの解析を行います
        TKMP.Reader.MailReader reader = new TKMP.Reader.MailReader(stream , false);
        //メールの内容をバイト配列として読み出しストリームに格納します
        byte[] data = reader.MainData;
        ms.Write(data, 0 , data.Length);
    }
    ms.Position = 0;
    //結合データをもう一度解析クラスに渡します
    return ms ;
}
VB.NET
'分割メールのストリームから結合したメールデータを取り出す
Private Function GetMailStream(ByVal MailDatas() As System.IO.Stream) As System.IO.Stream
    '結合データを格納するためのストリームクラスを作成します
    Dim ms As New System.IO.MemoryStream

    Dim stream As System.IO.Stream
    For Each stream In MailDatas
        '各メールの解析を行います
        Dim reader As New TKMP.Reader.MailReader(stream, False)
        'メールの内容をバイト配列として読み出しストリームに格納します
        Dim data As Byte() = reader.MainData
        ms.Write(data, 0, data.Length)
    Next stream
    ms.Position = 0
    '結合データをもう一度解析クラスに渡します
    Return ms
End Function

 次のサンプルはTKMP.Reader.Header.ContentTypeクラスのPartialNumberプロパティを使用して 分割メールの集合を自動的に整列して解析を行っています。 本来はこれ以外の処理として、「メールの総数が足りているか?」「分割メールのIDが一致しているか?」 をチェックする必要があります。
C#.NET
//分割メールのストリームから順番を整理して結合したメールデータを取り出す
private System.IO.Stream GetMailStream2(System.IO.Stream[] MailDatas)
{
    //リーダーの一時格納用配列
    TKMP.Reader.MailReader[] readers = new TKMP.Reader.MailReader[ MailDatas.Length ]; 
    
    foreach(System.IO.Stream stream in MailDatas)
    {
        //分割メールを解析して分割順に配列に格納する
        TKMP.Reader.MailReader reader1 = new TKMP.Reader.MailReader(stream , false);
        readers[reader1.ContentType.PartialNumber - 1] = reader1;
    }

    //結合データを格納するためのストリームクラスを作成します
    System.IO.MemoryStream ms = new System.IO.MemoryStream();

    foreach(TKMP.Reader.MailReader reader2 in readers)
    {
        //メールの内容をバイト配列として読み出しストリームに格納します
        byte[] data = reader2.MainData;
        ms.Write(data, 0 , data.Length);
    }
    ms.Position = 0;
    //結合データをもう一度解析クラスに渡します
    return ms ;
}
VB.NET
'分割メールのストリームから順番を整理して結合したメールデータを取り出す
Private Function GetMailStream2(ByVal MailDatas() As System.IO.Stream) As System.IO.Stream
    'リーダーの一時格納用配列
    Dim readers(MailDatas.Length - 1) As TKMP.Reader.MailReader

    Dim stream As System.IO.Stream
    For Each stream In MailDatas
        '分割メールを解析して分割順に配列に格納する
        Dim reader1 As New TKMP.Reader.MailReader(stream, False)
        readers(reader1.ContentType.PartialNumber - 1) = reader1
    Next stream

    '結合データを格納するためのストリームクラスを作成します
    Dim ms As New System.IO.MemoryStream

    Dim reader2 As TKMP.Reader.MailReader
    For Each reader2 In readers
        'メールの内容をバイト配列として読み出しストリームに格納します
        Dim data As Byte() = reader2.MainData
        ms.Write(data, 0, data.Length)
    Next reader2
    ms.Position = 0
    '結合データをもう一度解析クラスに渡します
    Return ms
End Function
VB.NETのコードはC#.NETを元に「C#.NET to VB.NET Translator」によって作成したものです

トップページへ移動
The project of U-WA-
http://uwa.potetihouse.com/