Outlookで送信するメールの下書き作成をRPA化しようとしています。
重要度「高」を設定したいので、INVOKE CODEで設定する方法を、Forumで教えて頂きました。
メールの件名、本文、重要度を設定するまでは出来ました。
Outlookに複数のアカウントを設定しているため、そのうちの特定のアカウントを送信元として指定したいのですが、設定方法が分かりません。
MailItemのSendUsingAccountで送信アカウントを設定できそうだ、ということは分かったのですが、
SendUsingAccount = "test@test"の様にすると、設定値がstringのため、エラーとなってしまいますが、どの様に定義・設定したら良いのか、たどり着けずにいます。
また、ファイル添付もしたいのですが、こちらは検討が付いていません。
INVOKE CODEでメール送信を設定する場合、どの様に送信アカウントとファイル添付を実装したらよいか、ご教示ください。
(.net関数の知見がほとんどないため、調べながらの状態です。)
度々ありがとうございます。
Dim OutlookApp As Microsoft.Office.Interop.Outlook._Application
OutlookApp = New Microsoft.Office.Interop.Outlook.ApplicationClass
Dim mail As Microsoft.Office.Interop.Outlook.MailItem = DirectCast(OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem), Microsoft.Office.Interop.Outlook.MailItem)
mail.Subject = WK_Mail_Subject
mail.Body = WK_Mail_Body
mail.SendUsingAccount = Session.Accounts(“test@test”)
mail.To = WK_Mail_To
mail.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceHigh
mail.save()
としてみたのですが、
BC30451:'Session’は宣言されていません。保護レベルが原因でアクセスでアクセスできない可能性もあります。
と表示されます。
定義が不足しているのでしょうか?
tkgsn146
(Gobun Takagi)
January 28, 2020, 3:13am
4
Sessionの定義が不足していますね。
COMのオブジェクト一覧を見る限りは、OutlookApp.Session とすれば取れそうな気はします。
ただ、Invoke Codeを使う方法はあまりお勧めしません。
というのも、Excel VBA等と違って、VB.NETを使用している場合、オブジェクトの開放を手動で行う必要があります。つまり「Excel VBAのコードを軽くアレンジして~」という作りでは、思わぬ問題を引き起こすコードになってしまう、ということです。
具体的には、すべてのオブジェクトを明示的に変数化した上で、その開放タイミングにあわせて、ReleaseComObject を呼んだり、GC.Collectを強制的に走らせる処理が必要になります。
このあたりの処理を疎かにすると、徐々にUiPathやOutlookの動作が不安定になっていく可能性が高いです。
まあPCを再起動すればたいていは直るはずですが、安定してRPAを動作させられる手法ではなくなるのです。
Invoke Codeでの対応は、Interopの動作等もあわせて、きちんと理解していることが前提になるので、そこに自信がなければ別の方法を検討されることをお勧めします。
OutlookApp.Sessionとして、送信元アカウントを設定することができました。
ありがとうございます!
.NETについての知見がないため、調べながら、皆様に教えて頂きながら、何とか・・・ですので、ご指摘頂いたように、現状の作り方では、誤動作を引き起こしかねないので、今後の進め方を再考致します。
tkgsn146
(Gobun Takagi)
January 30, 2020, 7:39am
6
Dim OutlookApp As Microsoft.Office.Interop.Outlook._Application
Try
OutlookApp = New Microsoft.Office.Interop.Outlook.ApplicationClass
Dim mail As Microsoft.Office.Interop.Outlook.MailItem = DirectCast(OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem), Microsoft.Office.Interop.Outlook.MailItem)
Try
mail.Subject = WK_Mail_Subject
mail.Body = WK_Mail_Body
mail.SendUsingAccount = OutLookApp.Session.Accounts("test@test")
mail.To = WK_Mail_To
mail.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceHigh
mail.save()
Finally
System.Runtime.InteropServices.Marshal.ReleaseComObject(mail)
GC.WaitForPendingFinalizers()
GC.Collect()
End Try
Finally
System.Runtime.InteropServices.Marshal.ReleaseComObject(OutlookApp)
GC.WaitForPendingFinalizers()
GC.Collect()
End Try
オブジェクトの開放だけ最低限行うように変更してみました。
(これも厳密には若干のメモリリークの可能性がありますが、そこをきちんと追い始めると非常に読みにくいコードになってしまうので・・・)
ガベージコレクションを強制的に動かす等、やや特殊な概念が多いですが、よろしければ参考にしてみてください。
ありがとうございます!
記載頂いたコードを調べて、勉強させて頂きます!!