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 マスターの方の「これ、こう書いた方がいいよ」というご指摘・ご指導をお待ちしております(笑)
電気ウナギ的○○
About Backコメント(0)
電気ウナギ的○○