Outlook メールの本文を VBA で書きかえる

Outlook メールの本文は、VBA(マクロ)で書きかえられます。

メール(MailItem オブジェクト)には、本文の内容を表すプロパティが複数あります。

  • Body プロパティ:メールが「テキスト形式」の場合
  • HTMLBody プロパティ:メールが 「HTML 形式」の場合
  • RTFBody プロパティ:メールが「リッチテキスト形式」の場合

テキスト形式の場合

メールがテキスト形式の場合は、Body プロパティの値を変更します。

Dim l_mail As Outlook.MailItem
Set l_mail = ... ' メールを取得

l_mail.Body = "テキスト メールでこんにちは"

この時、Body プロパティではなく HTMLBody プロパティを変更すると、メールの形式がテキスト形式から HTML 形式に変更されてしまうため、注意が必要です。

HTML 形式の場合

メールが HTML 形式の場合は、HTMLBody プロパティの値を変更します。

Dim l_mail As Outlook.MailItem
Set l_mail = ... ' メールを取得

l_mail.HTMLBody = "HTML メールでこんばんは"

この時、HTMLBody プロパティではなく Body プロパティを変更すると、メールの書式が失われてしまうため、注意が必要です。また、設定する値に HTML 特殊文字(大なり記号(>)やアンパサンド(&)など)が含まれている場合は、HTML エンコードする必要があります。

プログラム

テキスト形式と HTML 形式の両方に対応したプログラムは次のようになります。本文全体を書きかえるということはあまりないと思うので、本文の一部を書き換えるようにしました。

' メールの本文に含まれる特定の文字列を、指定した文字列に置き換えます。
' <params>
'   p_mail
'       対象のメール。
'   p_find
'       検索する文字列。
'   p_replace
'       置き換える文字列。
Private Sub ReplaceMailBody( _
    ByVal p_mail As Outlook.MailItem, ByVal p_find As String, ByVal p_replace As String)

    Select Case p_mail.BodyFormat
    Case Outlook.OlBodyFormat.olFormatPlain
        p_mail.Body = Replace(p_mail.Body, p_find, p_replace)
    Case Outlook.OlBodyFormat.olFormatHTML
        p_mail.HTMLBody = Replace(p_mail.HTMLBody, HtmlEncode(p_find), HtmlEncode(p_replace))
    Case Else
        ' 必要に応じてランタイム エラーにするなど。
    End Select
End Sub

' 指定した文字列を HTML エンコードします。
' <params>
'   p_expression
'       HTML エンコードを行う対象の文字列。
' <returns>
'   p_expression が HTML エンコードされた文字列。
Private Function HtmlEncode(ByVal p_expression As String) As String
    Dim l_result As String
    l_result = p_expression
    
    ' とりあえず代表的なものだけ対応。必要に応じて作りこむ。
    l_result = Replace(l_result, """", """)
    l_result = Replace(l_result, "&", "&")
    l_result = Replace(l_result, "<", "<")
    l_result = Replace(l_result, ">", ">")

    l_result = Replace(l_result, vbCrLf, "<br />")
    
    HtmlEncode = l_result
End Function

プログラムを呼び出す側は次の通りです。

Dim l_mail As Outlook.MailItem
Set l_mail = ... ' メールを取得

ReplaceMailBody(l_mail, "こんにちは!", "Hello!")

リッチテキスト形式の場合は…?

リッチテキスト形式のメールを作成する機会が無かったため試していませんが、RTFBody プロパティに値を設定すれは良いはずです。ただし、リッチテキストなのでバイナリデータを設定する必要があり、テキスト形式や HTML 形式より複雑な処理になりそうです。

kpdn

お寿司とゲームと動物が好きな、フリーランスのエンジニアです。フロントエンドからインフラまで日々奮闘中です。最近は物忘れがどんどんがひどくなってきました。

コメントを残す