LotusNotesのメール作成・送信をフルオート化してみた

LotusNotesでメール作成→送信をフルオートにする

LotusNotesでメールを送る作業が大量発生したときは、メール自動作成ツールで対応している。

akashi-keirin.hatenablog.com

ただ、誤送信が怖いので、基本的にメール作成までは自動でやっても、送信自体は手作業でやっていた。

しかしながら、ついに背に腹は替えられぬようになり、作成・送信フルオートをやってみた。

作業の手順としては、

  1. Excelファイルにメール作成用のデータを作成
  2. 1.をもとに、このときのマクロを使ってメールを作成
  3. 送信
  4. 文書を閉じて次へ

といった感じ。

フルオート送信の壁

これまでのマクロに、「送信」という過程と「次へ移る」という過程を付け加えるだけなので、楽勝だと思っていたんだが、いざやってみると、

  • 送信後、閉じるときに「……保存しますか? [はい][いいえ]」という確認メッセージが出てしまう
  • メール作成後のNotesDocumentクラスのSaveメソッドを実行しなければ確認メッセージは出ないが、送信履歴に残らない

という問題が生じた。

復習~LotusNotesのメールができるまで

スキップ

ちょっと復習として、LotusNotesでメールができるまでの処理の過程をおさらいしておく。興味がなかったら上の「スキップ」リンクを踏んだら下にワープするのでどうぞ。

やっとクラスリファレンスの読み方が分かってきたので、自身の勉強のために書くだけ。よって、説明の中には素人の推定によるものも含まれているw

Notesメールができるまで
  1. NotesSessionクラスのインスタンスを作成
    →これで現在使用中のNotesのいろんなものが使える。
  2. NotesUIWorkSpaceクラスのインスタンスを作成
    →これでNotesのワークスペースのうち、現在使用中のウインドウが使える
  3. NotesDatabaseクラスのインスタンスを作成
    →これで現在使用中のNotesデータベースにアクセスできる。
  4. NotesDatabaseクラスのOpenMailメソッドで現在のユーザーのメールデータベースを開く
    →これでメールデータベースが使える。
  5. NotesDatabaseクラスのCreateDocumentメソッドを用いて、NotesDocumentクラスのインスタンスを作成
  6. NotesDocumentクラスのインスタンスに、宛先、件名、受信確認の有無など諸データをセット
  7. NotesDocumentクラスのCreateRichTextItemメソッドを用いて、NotesRichTextItemクラスのインスタンスを作成
  8. NotesSessionクラスのCreateRichTextStyleメソッドを用いて、NotesRichTextStyleクラスのインスタンスを作成
  9. NotesRichTextItemクラスのAppendTextメソッド等を用いて本文を作成
  10. 必要ならNotesRichTextItemクラスのEmbdedObjectメソッドを用いて添付ファイルを追加
  11. NotesDocumentクラスのSaveメソッドを用いて文書を保存する
    →これで作成したメールがドラフトに保存される。
  12. NotesUIWorkSpaceクラスのEditDocumentメソッドを用いて、NotesUIDocumentクラスのインスタンスを作成
    →これで画面に作成したメールが表示される。

とまあ、こんな手順。

ちょっとづつ分かってきたような気がする。

確認メッセージの表示を防止するのは簡単

上掲Notesメールができるまで11.12.の過程は、

リスト1
notesDocument.Save False, False
Set notesUIDocument = notesUIWorkSpace.EditDocument(True, notesDocument, False)

というコードになる。

で、これに「送信→閉じる」という過程を付け加えれば、あとは処理全体をループで回すだけなのだが、単純に

スト2
notesDocument.Save False, False
Set notesUIDocument = notesUIWorkSpace.EditDocument(True, notesDocument, False)
CallByName notesUIDocument, "Send", VbMethod, False
notesUIDocument.Close True    '……(*)'

と書いて実行すると(*)を実行したところで、保存確認のメッセージボックスが出てきてしまう。

VBAでいうところの「Saved」みたいなプロパティはないものか、とクラスリファレンスを探してみると、NotesUIDocumentクラスのリファレンスSaveメソッドというやつがあった。

そこで、リスト2

リスト3
notesDocument.Save False, False
Set notesUIDocument = notesUIWorkSpace.EditDocument(True, notesDocument, False)
CallByName notesUIDocument, "Send", VbMethod, False
notesUIDocument.Save    '……(*)'
notesUIDocument.Close True

このたった1行(*)を加えるだけでうまく行ったw

おかげで、80件近くの宛先に文面も添付ファイルも異なるメールを送る、という苦行が便所に行っている間に完了w

おわりに

一昨年の今頃は、まったく意味も分からずに使っていたマクロだが、「クラス」の概念が理解できてきたことによってLotusScriptのクラスリファレンスがだんだん読めるようになってきた。

その結果、コードの意味が分かるようになり、いろいろアレンジを加えることができるようになってきた。

オブジェクト指向を勉強してよかったなあ、と思う今日この頃。

参考~LotusScriptのクラスリファレンス