昔作った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ステップです
ちなみに、画像は記事公開当時のものなので、今は項目名やレイアウトが少し違って見えることがあります
とはいえ「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版もそのうちまとめるので、よかったらまた覗いてみてくださいね











コメント
コメント一覧 (2件)
この記事を読んでGmailのSMTPサーバーに送れるようになりました。
大変ありがとうございました。
さらに、私のBlogにも引用させてもらいました。
→ https://automated.jp/blog/
コメントありがとうございます!
始めて他のサイトへ引用していただきました
久しぶりに触ると仕様が変わってて私も沼ってしまったので力になれてよかったです!