VB.NET でメールサブジェクトの B デコード[プログラミング]
(2015-09-19 11:23:01) by shinoda


VB.NET でメールサブジェクトをデコード(Bエンコードされたものだけ)したいんで、こんな感じで組んでみたけど、何か今ひとつだな。

ちなみに前処理で、

Subject: =?UTF-8?B?5pyA5paw44Gu44OK44Kk44Kt44Ki44Kk44OG44Og44KS44K344Or?=
 =?UTF-8?B?44OQ44O844Km44Kj44O844Kv44Gu44GK5L6b44Gr?=

みたいに長いサブジェクトが複数行に渡るものは、

=?UTF-8?B?5pyA5paw44Gu44OK44Kk44Kt44Ki44Kk44OG44Og44KS44K344Or?==?UTF-8?B?44OQ44O844Km44Kj44O844Kv44Gu44GK5L6b44Gr?=

のように、一行のテキストにまとめてある。

で、該当処理をまとめた Function がこれ。

    Private Function decodeMailSubject(ByVal subject As String) As String

        Dim tmp As String = subject
        Dim pattern As New System.Text.RegularExpressions.Regex("^(.*?)(\=+\?.+?\?\=)(.*)$") ' エンコード部分全体にマッチ
        Dim pattern2 As New System.Text.RegularExpressions.Regex("^\=+\?(.+?)\?B\?(.+?)\?\=$", System.Text.RegularExpressions.RegexOptions.IgnoreCase) ' エンコードされた本文部分にマッチ

        subject = String.Empty

        Do Until tmp = String.Empty

            Dim m As System.Text.RegularExpressions.Match = pattern.Match(tmp)

            If m.Success Then ' マッチした

                subject &= m.Groups.Item(1).Value

                ' =?〜?=部分の要素分解
                Dim m2 As System.Text.RegularExpressions.Match = pattern2.Match(m.Groups.Item(2).Value)
                If m2.Groups(1).Value <> String.Empty Then
                    ' デコード
                    Dim b() As Byte = System.Convert.FromBase64String(m2.Groups(2).Value)
                    subject &= System.Text.Encoding.GetEncoding(m2.Groups(1).Value).GetString(b)
                Else
                    subject &= m.Groups.Item(2).Value
                End If

                tmp = m.Groups.Item(3).Value

            Else
                ' マッチしなかったらもう終わり
                subject &= tmp
                tmp = String.Empty
            End If

        Loop

        Return subject

    End Function

テスト結果は良好だけど、コードとしての美しさに欠けるな(^^; ま、VB.NET をそんなに使い込んでないから仕方ないか(^^;

是非とも VB.NET マスターの方の「これ、こう書いた方がいいよ」というご指摘・ご指導をお待ちしております(笑)

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8