VB.NET でメールサブジェクトの B デコード

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 マスターの方の「これ、こう書いた方がいいよ」というご指摘・ご指導をお待ちしております(笑)

トラックバック(0)

このブログ記事を参照しているブログ一覧: VB.NET でメールサブジェクトの B デコード

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/3610

コメントする

このブログ記事について

このページは、shinodaが2015年9月19日 11:23に書いたブログ記事です。

ひとつ前のブログ記事は「「武蔵坊」の DEATH ランクの汁なし担々麺は毒(笑)」です。

次のブログ記事は「久しぶりに辰屋の天ぷらうどん」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら