★Excel2019のVBAからのOutlook2019でのメール送信あれこれ
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★ メールが即時送信できる条件
基本、Outlookが起動していること。
起動していない場合は、「Send」メソッドを実行したとしても、「次回起動時」でないと送信されません。
※「起動している」とは、例えばOutlook2019の場合、
(a)普通に画面が見えている状態で普通に起動しているか、
(b)オブジェクト(グローバル変数)として起動され、タスクトレイに常駐しているか、
(c)または、オブジェクト(グローバル変数)として非表示で起動しているか、
(↑(c)は、本当にこの状態があるのかどうかわかりません。未確認です。)
のどれか、です。
なお、(b)の場合は、「普通に画面が見えている状態」ではないわけですが、でも、ちゃんとメールが送れます。日時指定してあっても送れます。(ただし、以降に書いた注意事項を守る必要があります。)
あと、(b)と(c)の、『 オブジェクト(グローバル変数)として起動している場合 』は、そのオブジェクト(グローバル変数)のコードが書かれたExcelファイルを閉じると、それと道連れに『 Outlookが起動した状態 』が消滅してしまうので、メールが送れないことが多々あります。
なので(少なくともメールが全部送れるまでは)、その「コードが書かれたExcelファイル」を閉じないように注意しなければなりません。
もし、例えば(b)の場合で、「数日後に指定した時刻にメールを送れるようにしたい」という場合は、その日時が来るまで、パソコンをシャットダウンさせずに、かつ、その「コードが書かれたExcelファイル」を閉じないで開きっぱなしにしておく必要があります。(もし1度でもパソコンをシャットダウンさせてしまったのなら、その指定した日時まで、毎日、Outlookを「普通に開きっぱなし」にしておかないと指定した日時にメールが送信されません。)
※後日判明:日時指定は、(b)と(c)の場合、コード実行時刻から数時間が空いてしまうと、メールが送れないもようです。送信トレイに溜まったままでした。
Outlookをちゃんと通常起動してないとダメでした。
即送信や30分以内くらいの時間指定なら、もちろん(b)や(c)でもOKですが、
結局のところ、「Outlookを普通に起動・開いたほうが無難」な気がします。
★ 「Gmail」でメール送信
参考
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11243243566
メール送信には、「CDO」というものを使う・・・、という方法もあるようですが、
https://www.ka-net.org/blog/?p=12806
にも書いてありますが、
2021年5月現在、「Gmailに限って」はそれは使えなくなったようです。
事前に、「Outlook」で「Gmail」が「送受信」できる状態にしておかなければなりません。
その際、Gmail側でも少し設定が要ります。
その際、以下の、2と3だけは先にやっておいたほうがいいかもです。
Outlook2016/2019でGmailのPOP/IMAP・SMTPが設定できない時の対処法
そのうえで、以下のようにOutlookで設定してみます。
Gmail アカウントを Outlook に追加する
詳しいことはこちら↓
★Excel2019のVBAからの「Gmail」でのメール送信(Outlook2019利用)
一覧表から、「名前」で絞り込んだ結果のリストを「PDF化」し、「名前」に紐付いたメールアドレスにGamailにて送信する・・・というサンプルです。
★ メールの本文の中にパソコンのフォルダパスのハイパーリンクを含めて送信
※参考Webページ
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12245174832
A1セルに以下のHTMLを書いておきます。
1 2 3 4 5 6 7 8 |
' ' aaaaaa<BR> bbbbb<BR> <a href="d:\1\" target="_blank" rel="noopener noreferrer">d:\1\</a><BR> ddddd<BR> eeeeeeeeeee<BR> ' |
↑これは、「d:\1」というフォルダが届いたメールの本文画面から、クリックにて直接開けるようになる内容です。上図もご参照ください。
↓ 以下のプログラムは「参照設定」は何もしないことが前提です。
↓ また、前述の(b)のように、Outlookをタスクトレイに常駐させたい場合は、
↓ 「Dim olkapp As Object」を、モジュールの先頭の宣言部分に移動させる
↓ 必要があります。でないと、Excelファイルを閉じなくても、Outlookの常駐が
↓ すぐに消えてしまうので・・・。
↓ Excelファイルを開いているあいだじゅう、Outlookをタスクトレイに常駐
↓ させたい場合は、「olkapp」をグローバル変数にして、かつ、Excelファイルも
↓ 閉じない、という2つのことを行う必要があります。
↓ ※必要に応じて、「Dim objMail As Object」の行も同じことをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
' ' Sub CreateHTMLMail() 'Creates a new email item and modifies its properties. Dim olkapp As Object Dim objMail As Object ' Set olkapp = CreateObject("Outlook.Application") 'Outlookの起動 On Error Resume Next Set olkapp = GetObject(, "Outlook.Application") If olkapp Is Nothing Then Shell "OUTLOOK.EXE", vbNormalFocus Do Set olkapp = GetObject(, "Outlook.Application") DoEvents Loop While olkapp Is Nothing Else End If '↑起動しきるまで待つ 'Create mail item Set objMail = olkapp.CreateItem(0) '0=MailItem '↑「参照設定」してないので、「0」でやる。「MailItem」と書くと「見つからない」みたいなエラーになるので。 With objMail 'Set body format to HTML .BodyFormat = 2 '2=olFormatHTML '↑「参照設定」してないので、「2」でやる。「olFormatHTML」と書くと「見つからない」みたいなエラーになるので。 .To = "宛先のメールアドレス" .HTMLBody = ActiveSheet.Range("A1") .Subject = "test" ' .Display 'いったん内容を確認 .Send '即送信 End With End Sub ' ' |
★ 日付と時間を指定してメールを送る
これも、指定した日時で正しくメール送信するには、基本、Outlookが起動している必要があります。
例えば、
Dim olkapp As Object
の1行を「Sub test()」の前に書いて、
かつ、
プログラム実行後、すべてのメールが時刻通り自動送信され尽くすまで、
このExcelファイルを閉じないでおくか、
あるいは、
逆に、Excelファイルを閉じるなら、
Outlookを起動しておいて、その画面を開きっぱなしにしておかないと、
指定した時刻に送信できませんでした。
※参考Webページ
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11244514481
↓ 以下のプログラムは「参照設定」は何もしないことが前提です。
↓ また、前述の(b)のように、Outlookをタスクトレイに常駐させたい場合は、
↓ 「Dim olkapp As Object」を、モジュールの先頭の宣言部分に移動させる
↓ 必要があります。でないと、Excelファイルを閉じなくても、Outlookの常駐が
↓ すぐに消えてしまうので・・・。
↓ Excelファイルを開いているあいだじゅう、Outlookをタスクトレイに常駐
↓ させたい場合は、「olkapp」をグローバル変数にして、かつ、Excelファイルも
↓ 閉じない、という2つのことを行う必要があります。
↓ ※必要に応じて、「Dim objMsg As Object」の行も同じことをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
' ' Option Explicit 'https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11244514481 Sub 日付時間指定でメールを送る() Dim olkapp As Object Dim objMsg As Object Dim d As String Dim t As String d = "2021/06/18" t = "22:42" ' Set olkapp = CreateObject("Outlook.Application") ' '↑基本、不要。 'Outlookの起動 On Error Resume Next Set olkapp = GetObject(, "Outlook.Application") If olkapp Is Nothing Then Shell "OUTLOOK.EXE", vbNormalFocus Do Set olkapp = GetObject(, "Outlook.Application") DoEvents Loop While olkapp Is Nothing Else End If '↑起動しきるまで待つ Set objMsg = olkapp.CreateItem(0) '0=olMailItem '↑「参照設定」してないので、「0」でやる。「MailItem」と書くと「見つからない」みたいなエラーになるので。 objMsg.DeferredDeliveryTime = CDate(d & " " & t) objMsg.Subject = "(" & d & "--" & t & ")" objMsg.To = "宛先のメールアドレス" '送信先 objMsg.Body = "aaaaaaaaaaaaaaaaaa" '本文内容 objMsg.Send End Sub ' ' |
★ Outlookを「どうしても起動させずにメールを送りたい」という場合
前述の2つのサンプルにおいて、
Outlookを「どうしても起動させずにメールを送りたい」という場合は
「Dim olkapp As Object」
を
「Sub CreateHTMLMail()」
の上・・・
というか、モジュールの一番上の宣言部分に移動させて、
「'Outlookの起動」
から
「'↑起動しきるまで待つ」
のブロックを全部コメントアウトし、
「' Set olkapp = CreateObject("Outlook.Application")」
のコメントアウトをはずします。
タスクトレイにOutlookのアイコンができて、送信ができます。
ただし、実行後にプログラムのExcelファイルを閉じてしまうと、タスクトレイのOutlookアイコンがしばらくすると消えてしまうので、正常に遅れないか、まったく送れなくなるのいずれかになると思いますので、ご注意ください。
起動させたほうが確実です。
- 投稿タグ
- AccessVBA, Accessの独学, Access操作の基礎, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, Gmail, Outlookの基礎, PDF, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, 独学, 自動化