Outlook メールの本文は、VBA(マクロ)で書きかえられます。
メール(MailItem
オブジェクト)には、本文の内容を表すプロパティが複数あります。
もくじ
テキスト形式の場合
メールがテキスト形式の場合は、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 形式より複雑な処理になりそうです。