【VBA】マクロでGmailを送信する

本ページはプロモーションが含まれています

昔作ったツールを引っ張りだして来たら使えなくなっていたので改善方法も含めて改めてプログラムや設定方法をまとめてみました

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版は改めて作ります

コメント

  1. 氏家洋一 より:

    この記事を読んでGmailのSMTPサーバーに送れるようになりました。
    大変ありがとうございました。
    さらに、私のBlogにも引用させてもらいました。
    → https://automated.jp/blog/

    • ジャベ雄 より:

      コメントありがとうございます!
      始めて他のサイトへ引用していただきました
      久しぶりに触ると仕様が変わってて私も沼ってしまったので力になれてよかったです!

タイトルとURLをコピーしました