OUTLOOK　VBA HTMLのメールにHTML+開封通知付きで返信するのは追撃ピストンタグ撃ち込みでできる

# もともとHTML型にするのはAccessにある
極端に言うとテキストファイルを一つ作って

```html:test.html
<html>
aaaa
</html>
```

これでOK。
##　ただ改行だけがおかしくなる
このため１行目を除き、改行するときに`<p>`を用いる。

```html:test.html
<html>
aaaa
<p>bbb</p>
<p>ccc</p>
<p>ddd</p>
</html>
```

という形になる。

```text
aaaa
bbb
ccc
ddd
```

単純なhtmlであれば、テキストとは`<html>`と`<p>`だけ知っていればいい。

# メールの内容の型は返り値がある
[MailItem.HTMLBody プロパティ (Outlook) | Microsoft Learn (https://learn.microsoft.com/ja-jp/office/vba/api/outlook.mailitem.htmlbody)

ということで、返信は
返信したいメールをActiveInspectorを直起動。
replyでメールを立ち上げ、
型を判定、
型にあったメールの内容を文字列を代入。

## 開封通知をつけるのはそれ。
[MailItem.ReadReceiptRequested プロパティ (Outlook) | Microsoft Learn]( https://learn.microsoft.com/ja-jp/office/vba/api/outlook.mailitem.readreceiptrequested)

## テキスト型なら簡単でもHTML型なら？
メールの内容をいったん取得して、それに返信をかぶせればOK
HTML型なら、タグを取得して解析する必要があるのか？

### 一切無視してそのまま入れる
つまり冒頭のこのパターンに`<body>`を加えて返信内容を作り、

```html:test.html
<html>
<body>
aaaa
<p>bbb</p>
<p>ccc</p>
<p>ddd</p>
</body>
</html>
```

そのまま追撃的かつ強制的に撃ち込み（代入）する。
これまでのタグなど一切無視して打ち込む。
これでうまくいく（ことが多い）
この雑な方法が成功するのは、Word.Editorで検証して訂正しているか、頑張って表示しているためらしい。
## 改行は`<p>`タグ 項目は`<br>`
[HTMLのbrタグとは？記述例やpタグとの使い分け方・注意点を解説 | WEB集客ラボ byGMO（GMO TECH）](https://gmotech.jp/semlabo/seo/blog/html-br/)
なお、この場合、表示する画面の大きさが可変することを考えると`<p>`タグを使用したほうが良いと思われる。

## 代入するのはbodyではなく、MailItem.HTMLBody
Bodyではなく、HTMLBodyに入れる
bodyにするとテキストメールになってしまい、レイアウトが崩れるらしい。

## それ以外の注意点
 - InspectorがきたらCurrentItem
 - この方法は崩れる可能性もある
 - 可能性があるのは不等号、アンパサンドなどのHTMLエンコードが必要な特殊文字
 - 今回のコードは`<head>`の上に文字を入れている
 - 公式のコード

 
### InspectorがきたらCurrentItem
[Inspector.CurrentItem プロパティ (Outlook) | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/vba/api/outlook.inspector.currentitem)
`Set mItem = Ain.CurrentItem ’ActiveInspector CurrentItemからメールを取得`
Inspectorはメモ、予定、アドレスなどすべて個別に表示している窓がInspectorなので、いったんCurrentItemで取得しないと、何を表示させているのかがわからないというのがOutlook VBAのロジック。
ついでにApplication.Parentを使って存在するフォルダを取得するが、このApplication.Parentもめったに使わない。
### この方法は崩れる可能性もある
[Outlook オブジェクト モデルを使用して Outlook アイテムの HtmlBody プロパティを編集するときに書式設定が失われる](https://learn.microsoft.com/ja-jp/outlook/troubleshoot/user-interface/formatting-lost-when-editing-the-htmlbody-property)
>Microsoft Outlook では、エディターとして Microsoft Word が使用されます。 項目の送信時に HTML ソースが Word HTML エンジンによって検証されると、書式設定が失われる可能性があります。

このC#のコードは
[Inspector.WordEditor プロパティ (Outlook) | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/vba/api/outlook.inspector.wordeditor)
これを使っている。

### 可能性があるのは不等号、アンパサンドなどのHTMLエンコードが必要な特殊文字
エンコードが必要。&yen;&and;
[Outlook メールの本文を VBA で書きかえる – Tk2 と kpdn の廻る日常](https://wiki.tk2kpdn.com/outlook-edit-plain-or-text-format-mail-body-by-macro/)

### 今回のコードは`<head>`の上に文字を入れている
[HTML 形式の本文に文字列を追加する方法 | Outlook 研究所](https://outlooklab.wordpress.com/2017/05/13/html-%E5%BD%A2%E5%BC%8F%E3%81%AE%E6%9C%AC%E6%96%87%E3%81%AB%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
丁寧に行う場合はこちら。
ただ、図入りのメールに返信するのは当方の環境では考えられない。メールが重くなってしまう。
それはさておき、この記事から考えても、`<head>`の上にもう一度Bodyを書いている。これも安定しない理由である。
あくまでも簡易に返信を作成する場合のであること留意していただきたい。本来はOutlook研究所のようにBodyにエンコードしてから書くというのが正しい。


## 公式のコード
[MailItem.HTMLBody プロパティ (Outlook)](https://learn.microsoft.com/ja-jp/office/vba/api/outlook.mailitem.htmlbody)
当方のCodeは公式の新規作成の例を返信に採用しているということになる。

```vb
 Set objMail = Application.CreateItem(olMailItem) 
 With objMail 
 'Set body format to HTML 
 .BodyFormat = olFormatHTML 
 .HTMLBody = _ 
 "<HTML><BODY>Enter the message text here. </BODY></HTML>" 
 .Display 
 End With 
```
公式のここを見て、即理解できる人はなかなかいないと思われる。

## リッチテキストは本当にお手上げ
上のサイトでも謎とされている。リッチテキストもまた、タグを使っている（見えないけど）しかし、これを使いこなしているサンプルは存在しない。

# コード
Outlook用である。
複数のメールを開いているとどこをActiveにするかわからないので、一つだけ開いていること。

```vb
Sub SendHTMLReply()
' 返信したいメールを一つだけ開いている状態で作動させること
Dim Ain As Outlook.Inspector: Set Ain = ActiveInspector
Dim mItem As MailItem
Dim NS As NameSpace: Set NS = Outlook.Application.GetNamespace("MAPI")
Dim rItem As MailItem
Dim buf ' Variantにする
Dim var

Set mItem = Ain.CurrentItem ’ActiveInspector CurrentItemからメールを取得
Set var = mItem.Parent ' いったん親に行き、フォルダから受信したメールか判定
If var.Name Like "送信*" Or var.Name Like "se*" Then Exit Sub ’ 送信の場合はReplyがエラーになる。のでここで終了する
Set rItem = mItem.Reply
rItem.ReadReceiptRequested = True ' 開封通知
If mItem.BodyFormat = olFormatHTML Then
rItem.BodyFormat = olFormatHTML ' Typeをあわせる。
' HTML BODYをつける。1行目のテキストはそのまま。そのあとは<p>..</p>で囲む。テキスト型の変更を視野に入れて、改行も同じように入れる。Cstrは好み。そしてそのあとrItem.htmlbodyを続ける。

buf = "<HTML><BODY>" & vbCrLf & CStr("　いつも...<p></p>" & vbCrLf & "<p>  2行目</p>" & vbCrLf & "<p>　ううう</p>" & vbCrLf & vbCrLf & _
"　えええ</p>" & vbCrLf & vbCrLf & _
"<p>【おおお】</p>" & vbCrLf & _
"<p>・本メールには開封通知を付しております。</p></BODY></HTML>") & vbCrLf & rItem.HTMLBody
rItem.HTMLBody = ""
rItem.HTMLBody = buf
Ritem.bcc= ' BCCが必要なら追加
End if
rItem.Display
End Sub
```