【VBA】Gmailを送信する方法 CDOとアプリパスワード設定

【VBA】Gmailを送信する方法 CDOとアプリパスワード設定

昔作ったVBAのメール送信ツールを引っ張り出してきたら、いつの間にか使えなくなっていたので、改善方法も含めて改めてプログラムや設定方法をまとめてみました

結論から言うと、VBAからGmailを送るならCDO(Microsoft Collaboration Data Objects)を使うのが定番で、Gmail側でアプリパスワードの生成さえ済ませておけば、件名・本文・宛先・添付ファイル付きのメールをマクロから送信できます

OutlookならOutlook専用のライブラリがあるのでそちらを使ったほうが扱いやすいんですが、GmailはCDO経由で送ることになるので、今回はその方法になります

この記事ではGmail側の事前設定から、コピペでそのまま使える送信関数まで、つまづきやすいところを補足しながら解説していきます

目次

最初にやる一番キモなGmailの事前設定

コードを書く前に、実はこのGmail側の設定が一番のキモなんですよね

ここを飛ばすと、コードが正しくてもメールは送れないので、先に片付けておきましょう

安全性の低いアプリのアクセス・・・が使用できない!?

一昔前はこの「安全性の低いアプリのアクセス」を有効化するのがGmail側の設定だったのに、いつの間にか使用できなくなっていました

(結局この部分が、昔は使えていたツールが動かなくなっていた原因でした)

と言うか、気づいていなかっただけで、しっかりGoogleから2022年5月30日より利用できなくなる事前アナウンスが出ていたのはうっかりでした

2026年現在もこの流れは変わっていなくて、個人のGmailでは「安全性の低いアプリのアクセス」はすでに廃止済みです

そのかわりに用意されたのが、次に紹介するアプリパスワードという仕組みなんですね

今は”アプリパスワード”の生成が必要

VBAのようなアプリからGmailへログインするには、普段ログインに使っている本来のパスワードではなく、アプリパスワードの生成が必要になります

2段階認証を有効にしていると、本来のパスワードはSMTPの認証で弾かれてしまうので、ここで作るアプリパスワードがログイン用のカギになるイメージです

設定するページはこちらから

https://myaccount.google.com/security

ちなみに、アプリパスワードの生成ページにはアカウント内検索だと出てこないことがあるので、その場合は https://myaccount.google.com/apppasswords に直接アクセスすると早いです

  • アプリパスワードは2段階認証が前提なので、先に2段階認証をオンにしないと生成の選択肢が出てきません
  • 発行された16桁のパスワードは発行時に1度しか表示されないので、その場で控えてください
  • アプリパスワードはアカウントへのログインに使えてしまうので、コードに直書きしたまま第三者に渡さないように気をつけてください

それでは実際の流れを見ていきましょう、大まかには次の3ステップです

STEP
2段階認証プロセスをオンにする

初期状態では2段階認証プロセスがオフになっているので、まずはここをオンにします

オンにするのは、次のページで“使ってみる”ボタンを押すだけです

SMSや認証アプリ、セキュリティキーといった標準の2段階認証が有効になっていればOKで、ここが済むとアプリパスワードを作れるようになります

STEP
アプリパスワードを生成する

2段階認証プロセスをオンにしたことでアプリパスワードの選択肢が増えているので、ここで設定していきます

アプリ名はアプリパスワードの名前になるだけなので、それらしい選択をすればよくて、”その他”を選ぶとフリー入力に変わります

名前を入れると“生成”ボタンが活性化するので、そのままクリックします

STEP
発行された16桁を控える

ここで表示される16桁の文字列が、いわゆるアプリパスワードです

右下の完了をクリックすると2度と表示されないので、忘れずにパスワードを控えておきましょう

もし控えそびれても、また同じ手順で新しく生成し直せばいいので、そこは安心してくださいね

ちなみに、画像は記事公開当時のものなので、今は項目名やレイアウトが少し違って見えることがあります

とはいえ「2段階認証をオン → アプリパスワードを生成 → 16桁を控える」という骨子は変わっていないので、流れさえ押さえておけば迷わないと思います

このCDO方式はいつまで使える?

長く使ってきた方式なので、これからも使えるのか気になるところですよね

そのあたりの現況だけ、簡単に注意としてまとめておきます

  • 個人のGmailなら、2段階認証 + アプリパスワードの組み合わせで、2026年に確認した限りでは送信できます
  • ただし次のいずれかに当てはまるとアプリパスワードは作れません、2段階認証がセキュリティキーだけの設定になっている場合、高度な保護機能プログラムに登録している場合、そして会社や学校などの組織アカウントでログインしている場合です
  • Google Workspace(法人)は管理者の設定しだいで、レガシー認証を制限していると使えないことがあります
  • 長期的にはOAuth2やGmail API、Microsoft Graph APIといった方式へ寄っていく流れで、CDOはOAuth2に非対応なので、いずれ移行が必要になるかもしれません

そうは言っても、個人利用の範囲ではまだまだ現役なので、まずは今回のCDO方式で送れるようにしておけば十分じゃないでしょうか

VBAの参照設定

続いてVBA側の準備です、参照設定で次のライブラリにチェックを入れます

Microsoft CDO for Windows 2000 Library

名前に「2000」と入っていて古そうに見えますが、これがCDO(CDO.Message)のライブラリで、今のWindowsにも標準で入っています

実はこの参照設定は任意です

あとで紹介するコードはcdoMsgのデータ型をObjectにしているので、参照設定をしなくてもコピペするだけで動きます、入力補完を効かせたいときだけチェックを入れる、くらいの感覚でOKです

実際のVBAプログラム

お待たせしました、ここからが本体です

プログラムソース

件名・本文・宛先(To/Cc/Bcc)・添付ファイルまで一通り扱える送信関数です、コードの上のほうにあるmailUser と mailPass を、自分のGmailアドレスと先ほどのアプリパスワードに書き換えるだけで使えます

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

送信に関わる設定は .Configuration.Fields のあたりに集まっていて、ポイントはsmtp.gmail.com / ポート465 / SSLの3点です、ここがGmailで送るための決まりごとになります

余談ですが、参照設定をしたのになぜ”cdoMsg”のデータ型を”Object”にするのかと言うと、これならコピペするだけで(≒参照設定をしなくても)プログラムが利用できるからです

自分好みに改修したいときは、Objectから具体的な型への変更をおススメします

ざっくり説明

コード自体はコピペで動くので、ここでは使うとき用に引数だけ説明しておきます

1点だけ補足すると、添付ファイルを1つ(配列ではなく単体の文字列)で渡したときは、お使いの環境によっては添付がスキップされることがあります、確実に添付したいときは Array("C:\temp\a.pdf") のように1件でも配列で渡すと安定しますよ

必須 / 任意変数名備考
必須MailSubject件名
必須MailBody本文
必須ToAddress宛先(To)
任意CcAddress 宛先(Cc)
任意BccAddress 宛先(Bcc)
任意attFile添付ファイル※複数なら配列型に

呼び出すときは、必須の3つを渡すだけでも送れます、たとえばこんな感じです

'---件名・本文・宛先だけ渡すシンプルな呼び出し
Call sendMail("テスト送信", "本文です", "to@example.com")

'---添付ファイルを1つ付けて送る
Call sendMail("見積書の件", "ご確認ください", "to@example.com", , , "C:\temp\mitsumori.xlsx")

'---複数の添付ファイルは配列で渡す
Call sendMail("資料一式", "まとめてお送りします", "to@example.com", , , Array("C:\temp\a.pdf", "C:\temp\b.pdf"))

CcやBccを飛ばしたいときは、引数をカンマで詰めて空けておけば、Optionalの初期値がそのまま使われます

送信できないときに確認したいこと

実行してエラーになったり、送れているはずなのに届かなかったり、というのはよくあるので、つまづきやすいポイントをチェックリストにしておきます

  • 2段階認証がオンになっているか、オフのままだとアプリパスワード自体が作れません
  • mailPassに入れたのがアプリパスワードか、普段ログインに使う本来のパスワードだと認証で弾かれます
  • アプリパスワードの16桁を、空白を入れずに貼り付けているか
  • サーバとポートがsmtp.gmail.com / 465になっていて、SSLがTrueか
  • 会社の回線などで、ポート465の通信がファイアウォールで止められていないか
  • Google Workspace(法人)の場合、管理者がレガシー認証を制限していないか

個人的には、エラーが出たときはまずアプリパスワードを作り直して貼り直すのが手っ取り早い切り分けだと思います

よくある質問(FAQ)

最後に、VBAでGmailを送るときによく聞かれるところをまとめておきます

アプリパスワードの選択肢が出てきません

ほとんどの場合、2段階認証がオフになっているのが原因です、先に2段階認証をオンにすると選択肢が出てきます

それでも見当たらないときは、アカウント内の検索だと出ないことがあるので、https://myaccount.google.com/apppasswords に直接アクセスしてみてください

送信時にエラーになります

多いのは認証まわりで、mailPassに本来のパスワードを入れていたり、アプリパスワードに余計な空白が混ざっていたりするケースです

あとはサーバ・ポートが smtp.gmail.com / 465 でSSLがTrueになっているか、会社の回線ならポート465が塞がれていないか、このあたりを確認してみてください

OAuth2を使わなくて大丈夫ですか?

個人のGmailなら、2段階認証 + アプリパスワードの組み合わせで、2026年に確認した限りでは送信できるので、CDOだけでも問題ありません

ただ、CDOはOAuth2に非対応なので、長期的にはGmail APIやMicrosoft Graph APIといったOAuth2対応の方式に移っていくことになりそうです、セキュリティ要件が厳しい現場ではそちらも検討してみてください

Outlookでも同じように送れますか?

OutlookにはOutlook専用のライブラリがあるので、そちらを使ったほうが扱いやすいです

今回のCDOはGmailなどSMTPで送りたいとき向け、という住み分けですね、Outlook版は別の記事で改めてまとめる予定です

あとがき

今はAPIやWebhookでLINEなどにも通知できるので、メールの出番は減った気もしますが、メール通知もまだまだ現役で、きっとGmailが利用頻度が高いのではとまとめてみました

ちなみにVBAは、外部とのデータ連携でもけっこう活躍してくれて、APIのレスポンスを扱うVBAでJSONをパースする方法もまとめているので、あわせて読んでみてください

まずは今回のCDO方式でGmailが送れるようになれば、定型メールの自動化はだいぶ楽になるはずです、Outlook版もそのうちまとめるので、よかったらまた覗いてみてくださいね

📚 VBAの独学に効く本PR
Excel VBA塾【動画×本で学ぶ!】

Excel VBA塾【動画×本で学ぶ!】

たてばやし淳

パーフェクトExcel VBA

パーフェクトExcel VBA

高橋宣成

Excel マクロ&VBA[実践ビジネス入門講座]完全版 第3版

Excel マクロ&VBA[実践ビジネス入門講座]完全版 第3版

国本温子

私のおすすめからランダムで3冊を表示しています


最後に・・・

クラウドワークスココナラでお仕事受け付けています!

PythonとExcelを中心に仕事に役立つ業務ツールや自動化、スクレイピングツールの作成を受注していて、クラウドワークスでは気が付けば100件以上のお仕事を受注してきました!

会社員をやりながらの副業なので時間の捻出は相応ですが、クライアントの方々と近い立場でこちらからも提案しながら活動していますのでお悩みあれば是非ご相談ください

ココナラのプロフィールページへ

"ココナラ"に新規登録する際は1,000Pもらえる紹介コード使ってください

78E62K

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAとPythonを中心にユーザー側でできるITを自己学習しているので備忘録半分、学習履歴を残して同じ道を辿る人の参考になればとブログを始めました

副業でスクレイピングツール作成を中心にできることを色々やっていますのでご相談いただけるとありがたいです!


クラウドワークスのページへ


ココナラのページへ

コメント

コメント一覧 (2件)

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

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

コメントする

目次