Categories: IBM Lotus Notes

Lotus ScriptでNotesメールを送る場合

Notes式では@MailSendを使えば比較的簡単にメールを送ることが出来ますが、Lotus Scriptでも比較的簡単にメールの送信が出来ます。

場合によっては、Notes式でメールを送信するより高度な内容を作ることができます。

シンプルパターン

シンプルな内容を送る場合。NotesDocumentのSendメソッドを用います。

Sub SendMail()
	'宣言
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	Dim richTextItem As NotesRichTextItem '本文

	Set db = session.CurrentDatabase

'メール送信用文書作成
	Set doc = db.CreateDocument
	doc.Form = "Memo" 'FormはMemoにする
	doc.SendTo = "送信者" '送信先 複数の送信先は配列を格納する
	doc.CopyTo = "CC" 'CC 複数の送信先は配列を格納する
	doc.BlindCopyTo = session.UserName 'BCC メールの送信済みボックスに格納されないため、送信者にBCCでメールが入るようにする

	mailDoc.Subject = "タイトルです" 'タイトル
	Set richTextItem = New NotesRichTextItem( doc, "Body" ) 'Bodyが本文 リッチテキストアイテムとして弄れる
	Call richTextItem.AppendText( "お疲れ様です。" )
	Call richTextItem.AddNewLine( 1 ) '改行
	Call richTextItem.AppendText( "テストです。" )

	Call mailDoc.Send( False ) 'メール送信
End Sub

メール文書に文書リンクを付与する

リッチテキストアイテムには、文書リンクを付与することも可能です。
対象のNotesDocumentを取得して、 NotesRichTextItemのAppendDocLinkで挿入します。

'targetDocに文書リンク先を取得した状態
'本文に文書リンクを挿入する
Call richTextItem.AppendDocLink(doc, "コメント")

これだけで文書リンクが付きます。そのままだとその時点での文書の末尾に付与されます。
コメントの箇所は、文書リンクにカーソルを合わせると表示されるコメントになります。

表を挿入する

Notesでは表の機能がありますが、Notes式ではメール送信時に表を挿入することが出来ません。

Lotus Scriptであれば、表をメール本文に挿入することが出来ます。
ただし、非常に扱いが難しいです。

①NotesRichTextParagraphStyle オブジェクトを作成
②列幅を指定
③表を作成してリッチテキストアイテムへ挿入
④データーをリッチテキストアイテム内の表へ挿入

とりあえずソースコード見て下さい。

	'列幅設定
	Dim rtpsCols(5) As Variant '6列作成する 列数に併せて配列数を調整
	'新しい NotesRichTextParagraphStyle オブジェクトを作成
	Dim i as Integer
	For i = 0 To 5 'ここも列数によって配列数を調整する
		Set rtpsCols(i) = session.CreateRichTextParagraphStyle 'RichTextParagraphStyleオブジェクトの作成
		rtpsCols(i).Alignment = 0 '左揃え
		rtpsCols(i).Firstlineleftmargin = RULER_ONE_CENTIMETER * 0.1 '一行目の左余白
		rtpsCols(i).Leftmargin = RULER_ONE_CENTIMETER * 0.1 '二行目以降の左余白
	Next
	'二行目以降の右余白
	rtpsCols(0).RightMargin = RULER_ONE_CENTIMETER * 0.5
	rtpsCols(1).RightMargin = RULER_ONE_CENTIMETER * 2
	rtpsCols(2).RightMargin = RULER_ONE_CENTIMETER * 2
	rtpsCols(3).RightMargin = RULER_ONE_CENTIMETER * 2
	rtpsCols(4).RightMargin = RULER_ONE_CENTIMETER * 8
	rtpsCols(5).RightMargin = RULER_ONE_CENTIMETER * 2.5
	
	
	'表の作成
	Call richTextItem.AppendTable(2, 6,,,rtpsCols) '2行6列のテーブルを挿入 行数はここで指定すること
	Set rtnav = richTextItem.CreateNavigator 'Navigator取得 リッチテキストアイテムの入力位置を取得するためのオブジェクト
'編集するテーブルオブジェクトの取得
	Dim rtt As NotesRichTextTable 
	Set rtt = rtnav.GetFirstElement(RTELEM_TYPE_TABLE)
'先頭行取得
'セル位置を取得し、編集点を移動して次の列のセルの位置を取得を最後の列まで繰り返す
	Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "*" )
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "項目A" )
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "項目B" )
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "項目C" )
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "項目D" )
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText( "項目E" )
	Call richTextItem.EndInsert
	
	'受注データー挿入
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendDocLink(doc, doc.A(0))
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText(doc.B(0))
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText(doc.C(0))
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText(doc.D(0))
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText(doc.E(0))
	Call richTextItem.EndInsert
	Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
	Call richTextItem.BeginInsert(rtnav)
	Call richTextItem.AppendText(doc.F(0))
	Call richTextItem.EndInsert

扱えるようになると、見た目がリッチなメールを自動送信することが可能です。
情報を伝えるときに簡潔に見せることが可能になるので重宝します。ソースコード組むのが大変ですけど。

送信者を変更する

エージェントにメール送信処理を任せちゃえば、エージェント実行者を弄ることによって送信者の変更が出来ます。
でもそれだと面倒くさいので、ひとつのソース内に抑える方法のご紹介。ですが、厳密には送信者は変わってないです。技術的な問題でしょうか…

二種類ございます。

Principal を使う方法

	Dim strFrom As String
	strFrom = "送信者"
	
	doc.Principal = strFrom
	doc.DisplayFrom = strFrom
	doc.DisplaySent = strFrom
	doc.DisplaySent_1 = strFrom 'R8用

一番上のソースコードにこれを加えると、送信者は変わらないのですが、返信時に指定の名前にすることが出来ます。

mail.boxに直接メールを作成する方法

この方法なら、表示名も変わります。

ですがCCやBCCがいる場合だと、なぜか文書を開いたときに送信者の名前が実行者の名前になってることがあります。何ででしょうかね…

	Dim session As New NotesSession
	Dim db As New NotesDatabase("", "")
	Dim doc As NotesDocument
	Dim strSvr As String

	strSvr = session.GetEnvironmentString("MailServer", True)
	If db.Open(strSvr, "mail.box") = False Then
		Msgbox "mail.box が開けません", 0, "Error"
		Exit Sub
	End If

	Set doc = db.CreateDocument
	doc.Form = "Memo"
	doc.From = "送信者" '送信者名
	doc.SendTo = session.UserName '宛先
	doc.Recipients = doc.SendTo '宛先2 CCやBCCがある場合は、AppendArrayで結合して代入する必要がある
	doc.PostedDate = Now '送信日
	doc.Subject = "テストメールです" '件名

	Dim richTextItem As NotesRichTextItem '本文
	Set richTextItem = New NotesRichTextItem( doc, "Body" ) 'Bodyが本文 リッチテキストアイテムとして弄れる
	Call richTextItem.AppendText( "お疲れ様です。" )
	Call richTextItem.AddNewLine( 1 ) '改行
	Call richTextItem.AppendText( "テストです。" )

	Call doc.Save(True, True) '保存で送信

Recipientsをちゃんと正しく指定しないと正常に動作しません。面倒な仕様です。
そもそもこの方法ってかなりごり押しな方法なので、正常に動作し難いのだと思います。

参考サイト

送信者の変更に関してはこちらを参考にしました。

L.SMK

小さい頃からネットの海を泳ぎ続けている。仕事は社内SE。趣味は音ゲーとIT関連の情報収集。