昔作ったツールを引っ張りだして来たら使えなくなっていたので改善方法も含めて改めてプログラムや設定方法をまとめてみました
Outlookなら専用のライブラリがあるのでそっちを使った方がいいですが、GmailならCDO(Microsoft Collaboration Data Objects)を使って送信することになるのでその方法になります。
最初にやる一番キモなGmailの事前設定
安全性の低いアプリのアクセス・・・が使用できない!?
一昔前はこの設定を有効化することがGmail側の設定だったのにいつの間にか使用できなくなっていました
(結局この部分が昔は利用できたツールが利用できなくなっていた原因でした)
と言うか気づいていなかっただけでしっかりGoogleからの2022年5月30日より利用できなくなる事前アナウンスがあったのはうっかり
今は”アプリパスワード”の生成が必要
設定するページはこちらから
https://myaccount.google.com/security
まずは2段階認証プロセスをオンにする
初期では2段階認証プロセスがオフになっているのでオンにする
オンにするのは次ページで”使ってみる”ボタンを押下するだけ
アプリパスワードを生成する
2段階認証プロセスをオンにしたことでアプリパスワードの選択肢が増えているのでここで設定する
アプリパスワードの名前になるだけなのでそれらしい選択をすればいいが”その他”を選ぶとフリー入力に変わる
“生成”ボタンが活性化するので押下
発行された16桁のパスワードが”アプリパスワード”
右下の完了クリックすると2度と表示されないのでパスワードを控えておく
VBAの参照設定
Microsoft CDO for Windows 2000 Library
実際のVBAプログラム
プログラムソース
Function sendMail(MailSubject As String, MailBody As String, ToAddress As String, _
Optional CcAddress As String = vbNullString, Optional BccAddress As String = vbNullString, Optional attFile As Variant = vbNullString)
Const mailUser As String = "<Gmailのメアド>"
Const mailPass As String = "<アプリパスワード>"
Dim cdoMsg As Object: Set cdoMsg = CreateObject("CDO.Message")
Dim objFso As Object: Set objFso = CreateObject("Scripting.FileSystemObject")
Dim i As Long
With cdoMsg
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "shift-jis" '---文字コード指定
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 '---外部SMTP指定
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com" '---SMTPサーバ名
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = "465" '---ポート№
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = True '---SMTP認証
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True '---SSL
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60 '---タイムアウト
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailUser '---ユーザー
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailPass '---パスワード
.Update
End With
.Subject = MailSubject
.TextBody = MailBody
.TextBodyPart.Charset = "ISO-2022-JP"
.From = mailUser
.To = ToAddress
.CC = CcAddress
.BCC = BccAddress
'---添付ファイルが複数(配列形式)かの分岐
If IsArray(attFile) = True Then
For i = LBound(attFile) To UBound(attFile)
'---ファイルが存在してれば添付する
If objFso.FileExists(attFile(i)) Then
.AddAttachment attFile(i)
End If
Next
Else
'---ファイルが存在してれば添付する
If objFso.FileExists(attFile(i)) Then
.AddAttachment attFile(i)
End If
End If
.Send
End With
Set cdoMsg = Nothing
Set objFso = Nothing
End Function
余談ですがなぜ参照設定をしたのに”cdoMsg”のデータ型を”Object”にするのかと言うとこれならコピペするだけで(≒参照設定をしなくても)プログラムが利用できるから
自分好みに改修したい時は変更をおススメします
ざっくり説明
今回のプログラムは特に解説することはないので、このプログラムを使うときのために引数の説明だけ
改修するなら添付ファイルが存在しなかった時の分岐ぐらいでしょうか
必須 / 任意 | 変数名 | 備考 |
---|---|---|
必須 | MailSubject | 件名 |
必須 | MailBody | 本文 |
必須 | ToAddress | 宛先(To) |
任意 | CcAddress | 宛先(Cc) |
任意 | BccAddress | 宛先(Bcc) |
任意 | attFile | 添付ファイル※複数なら配列型に |
あとがき
今はAPIやWebhookでLINEとかにも通知できるので出番は減った気もしますがメール通知もまだまだ現役で、きっとGmailが利用頻度が高いのではとまとめてみました
お仕事の中ではOutlookを使う機会も多いと思うのでOutlook版は改めて作ります
コメント
この記事を読んでGmailのSMTPサーバーに送れるようになりました。
大変ありがとうございました。
さらに、私のBlogにも引用させてもらいました。
→ https://automated.jp/blog/
コメントありがとうございます!
始めて他のサイトへ引用していただきました
久しぶりに触ると仕様が変わってて私も沼ってしまったので力になれてよかったです!