Article

【Excel VBA】CDO で Gmail メール送信|port 465+アプリパスワード対応版

この記事で分かること

Excel VBA で Outlook を使わず個人 Gmail から送信する CDO 実装を、port 465 SSL とアプリパスワード、認証エラー対処まで実機検証つきで解説します。

Excel VBA からメール送信したいけれど、Outlook を起動したくない/そもそも Outlook が入っていない端末で困っていませんか。

CDO.Message という Windows OS 同梱のメール送信機構を使えば、Outlook 不要で個人 Gmail (@gmail.com) からメールを送れます。ただし、2025 年 3 月以降 Google が SMTP の従来パスワード(基本認証)を廃止したため、2 段階認証プロセス + アプリパスワード が必須です。

本記事は 個人 Gmail アカウント で Excel 2024 永続版(Build 19929 / Windows 11 25H2 / cdosys.dll 6.6.26100)を使い、実機検証したコピペ完成版コード(port 465 SSL)と、ネット記事で多く見かける port 587 STARTTLS が CDO では使えない理由、0x80040213 などの認証エラー HRESULT 対処早見表、配布 xlsm までを 1 つの記事にまとめました。Google Workspace は組織設定に左右されるため本記事の検証対象外です。

サンプルファイル(xlsm)

本記事の VBA コード 7 モジュール(基本送信 / 添付 / HTML+複数宛先 / Outlook 比較 / エラー対処 / InputBox 安全版)が入った xlsm ブックです。アプリパスワードを差し替えるだけで動作確認できます。個人 Gmail (@gmail.com) + 2 段階認証プロセス済みアカウントが必要です。

xlsm ・ 約 28 KB ・ VBA 7 モジュール(基本送信 / 添付送信 / HTML+複数宛先 / Outlook 比較 / エラー対処 / InputBox 安全版)入り。アプリパスワードはダミーのままなので、各自取得して差し替えてください。

excel-vba-gmail-cdo-sample.xlsm

なぜ Outlook ではなく CDO を使うのか

結論を先に書きます。CDO を使う理由は次の 4 つです。

観点CDO (cdosys.dll)Outlook.Application
インストール不要○ Windows 11 25H2 標準同梱× Outlook 本体のインストールが必要
起動の軽さ○ Send 直前まで 0.5 秒以内× 初回起動 60 秒以上
ヘッドレス動作○ 画面なし、タスクトレイ常駐なし× プロファイル設定必須
サービス向け実績○ Microsoft 自身が SQL Server Reporting Services 最新版 (v17) で CDO を採用△ ユーザー対話アプリ向け

cdosys.dll は Windows 11 25H2 の C:\Windows\System32\cdosys.dll(バージョン 6.6.26100.8457、2025-09-16 更新)に標準で入っています。追加インストール不要、ライセンス料も不要です。「Outlook を入れたくない端末」「無人実行したいバッチ」「Excel から Send したいだけで Outlook を起動したくない」の救済策として現役の仕組みです。

事前準備:Gmail アプリパスワード取得 4 ステップ

2025 年 3 月 14 日以降、Google は SMTP の従来パスワード認証を廃止しました。個人 Gmail (@gmail.com) で CDO 経由送信するには、2 段階認証プロセス + アプリパスワード の取得が必須です。

Step 1: 2 段階認証プロセスを有効化

Google アカウントの「セキュリティ」画面で 2 段階認証プロセスを ON にします。SMS か認証アプリのどちらかで設定します。

Google アカウントのセキュリティ画面で 2 段階認証プロセスが有効になっている様子。右上のアカウント情報はマスク。

Step 2: アプリパスワード生成画面を開く

https://myaccount.google.com/apppasswords を直接開きます。セキュリティ画面の検索ボックスから「アプリパスワード」で検索しても辿れます。Google は UI を頻繁に変更するため、画面で見つからなければ URL 直接アクセスが確実です。

myaccount.google.com/apppasswords を開いて「アプリ名」欄に「helpaso CDO sample」と入力した状態。URL バーのセッショントークンと右上のアカウント情報はマスク。

Step 3: アプリ名を入力して生成

「アプリ名」欄に Excel VBA など分かりやすい名前を入力し、「作成」をクリックします。16 文字(4 文字 × 4 グループ、スペース区切り)のアプリパスワードが表示されます。

「作成」直後に表示されるアプリパスワード 16 文字のダイアログ。本物のパスワードは黒矩形で完全にマスク。読者は各自の画面で表示される 16 文字を控える。

Step 4: 16 文字を VBA コードに貼り付け

表示された 16 文字からスペースを取り除いて連続 16 文字にします(例: abcd efgh ijkl mnopabcdefghijklmnop)。これを次節の VBA コードの SENDER_PASSWORD に貼り付けます。なお、生成済みのアプリパスワードは下図の一覧画面で確認・削除できます(不要になったら必ず削除してください)。

アプリパスワード一覧画面。「helpaso CDO sample」行と右端の削除ゴミ箱アイコンが見える。不要になったらゴミ箱をクリックして即削除する。

Google Workspace(会社の Gmail)について

本記事は個人 Gmail(@gmail.com)で検証しています。Google Workspace は組織の管理設定に左右され、従来のパスワードによる基本認証は 2025-03-14 以降使えません。アプリパスワードを使える場合もありますが、管理者設定や組織ポリシー次第のため、本記事の対象外とします。会社の Gmail で送信したい場合は管理者に確認するか、後述の FAQ「Workspace 利用者向け代替案」を参照してください。

アプリパスワードが画面に表示されない場合

次のいずれかに該当すると myaccount.google.com/apppasswords を開いても画面が出ません。

  • Google Workspace の組織アカウントで管理者が許可していない
  • 2 段階認証プロセスが「セキュリティキーのみ」設定
  • Google の「高度な保護機能プログラム」が有効

アプリパスワードは Google アカウントのパスワード変更で失効します

Google アカウント本体のパスワードを変更すると、生成済みのアプリパスワード(複数あれば全部)が一斉に失効します。送信できなくなったら、再度 myaccount.google.com/apppasswords で生成し直してください。

CDO.Message の基本コード(コピペで動く完成版)

結論先出しです。下のコードを VBE に貼り、【ここを書き換え】 の 3 か所(送信元メールアドレス、アプリパスワード、宛先メールアドレス)を埋めて F5 で実行すれば送信完了します。

⚠ アプリパスワードをコードに書く前に

下のコードは SENDER_PASSWORDConst(定数)として VBA 内に直接書き込む形です。本物のアプリパスワードを書き込んだ状態でブックを保存・共有しないでください(メールや Teams で送ると相手が SMTP 送信権を持つことになります)。検証後は必ず "YOUR_APP_PASSWORD_HERE" に戻して保存してください。誤共有が怖い場合は、後述の InputBox 安全版(Module7_InputBoxSafe) でブックにパスワードを残さない運用にできます。

Option Explicit

' ===============================================================
' Excel VBA Gmail メール送信 — port 465 SSL + アプリパスワード対応版
' helpaso.net 配布サンプル — 個人 Gmail (@gmail.com) アカウント前提
' Google Workspace は組織設定次第のため本記事の検証対象外
'
' 【セキュリティ重要】
'   - 本物のアプリパスワードを入れた状態でこのブックを保存・共有しない
'   - 検証後は SENDER_PASSWORD を "YOUR_APP_PASSWORD_HERE" に戻して保存
'   - パスワードをブックに残したくない場合は後述の InputBox 版を使用
' ===============================================================

Public Sub SendGmailByCDO()
    On Error GoTo ErrHandler

    ' 【ここを書き換え】 ↓ 3 か所
    Const SENDER_ADDR     As String = "your-account@gmail.com"     ' 送信元
    Const SENDER_PASSWORD As String = "YOUR_APP_PASSWORD_HERE"     ' 16 文字アプリパスワード(スペース除去)
    Const RECIPIENT_ADDR  As String = "to-someone@example.com"     ' 宛先
    ' 【ここを書き換え】 ↑ 3 か所

    Dim msg As Object
    Dim cfg As Object
    Dim flds As Object

    Set msg = CreateObject("CDO.Message")
    Set cfg = msg.Configuration
    Set flds = cfg.Fields

    ' SMTP 設定 (CDO で Gmail に送るなら port 465 SSL が現実解)
    ' 注: 下記 URL は設定名 (XML 名前空間) であり、ブラウザで開く URL ではない
    flds("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2          ' 2 = 外部 SMTP
    flds("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.gmail.com"
    flds("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465   ' 465 SSL
    flds("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = True
    flds("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1   ' 1 = Basic 認証
    flds("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = SENDER_ADDR
    flds("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = SENDER_PASSWORD
    flds("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 30
    flds.Update

    ' メッセージ本体
    msg.From = SENDER_ADDR
    msg.To = RECIPIENT_ADDR
    msg.Subject = "CDO 送信テスト (helpaso サンプル)"
    msg.TextBody = "これは Excel VBA からの CDO テスト送信です。"
    msg.BodyPart.Charset = "utf-8"

    msg.Send
    MsgBox "送信完了", vbInformation
    Exit Sub

ErrHandler:
    MsgBox "送信失敗: HRESULT=&H" & Hex(Err.Number) & vbCrLf & Err.Description, vbCritical
End Sub

実行手順 3 ステップ

  1. Excel を開いて Alt+F11 で VBE(Visual Basic Editor)を起動
  2. 「挿入」→「標準モジュール」で新しいモジュールを作成し、上のコードを貼り付け
  3. 3 か所の 【ここを書き換え】 を埋めて F5 で実行
VBE で Module1_Basic.SendGmailByCDO のコードを開いた画面。port 465 SSL + アプリパスワード対応版の完成形。

送信に成功すると MsgBox "送信完了" が表示されます。Gmail Web UI の受信トレイ(または宛先のメーラー)で実物のメールが届いていることを確認してください。実機検証では Send 完了まで約 2 秒でした。

送信成功時の MsgBox「送信完了」ダイアログ(実機)。
Outlook の受信画面で、Excel VBA から CDO 経由で送信したテストメール [helpaso E-1 S3] が実際に届いた様子。送信者・受信者の個人情報部分はグレー矩形でマスク。

各 schemas URL の役割は次節で詳しく解説します。

port と暗号化の正しい組み合わせ:587 STARTTLS が動かない理由

Gmail は port 587 STARTTLS を正しく提供しています。openssl で確認すると TLS 1.3 ハンドシェイクが成立し、EHLO に対する応答に STARTTLSSMTPUTF8 が広告されます。しかし CDO ではそこに乗れません。「Gmail が悪い」のではなく「CDO のクライアント側仕様」が原因です。本節はこの切り分けを 4 段で論証します。

結論先出しです。CDO で Gmail に送るなら port 465 + smtpusessl=True が現実解。port 587 STARTTLS はネット記事に多く出てきますが、CDO の仕様上 Gmail には届きません。

論証 1:Microsoft Learn は smtpusessl フィールドの定義のみ

CDO の smtpusessl は「外部 SMTP サーバーに SSL/TLS で接続するかどうか」を指定する Boolean 型のフィールドです。フィールド定義は Microsoft Learn に存在しますが、「どの port で STARTTLS を発火し、どの port で implicit SSL (SMTPS) になるか」までは公式ドキュメントには書かれていません。挙動仕様は次の論証で支えます。

論証 2:cdosys.dll のヘックス解析(外部検証)

Codekabinett による cdosys.dll のヘックス解析では、smtpusessl 文字列は DLL 内に存在しますが、sendtls 文字列は ASCII / Unicode どちらでも存在しないことが示されています(同じ事実を本記事の T9b 検証でも確認)。同レポートと実装挙動から、smtpusessl=True は port 25 でのみ STARTTLS、その他の port では implicit SSL (SMTPS) を試行する作りになっています。ネット記事で見かける「sendtls=True で 587 STARTTLS が動く」という記述は誤りです。Fields にはセットできますが、CDO は送信挙動に使っていません。

論証 3:本記事の実機検証

Excel 2024 Build 19929 + Windows 11 25H2 + cdosys.dll 6.6.26100.8457 + 実 Gmail アプリパスワードで試した結果は次の通りです。どちらも送信は成立しませんが、出るエラーは別物です。

  • smtp.gmail.com:587 + smtpusessl=True: Err.Number = &H80040213(CDO_E_FAILED_TO_CONNECT、TCP/TLS の接続段階で失敗)
  • smtp.gmail.com:587 + smtpusessl=False + sendtls=True: 接続自体は平文で成立するが STARTTLS には移行されず、AUTH を送ったところで Gmail から 530 5.7.0 … 系の拒否応答が返り Err.Number = &H8004020E になる

後者は「sendtls=True を設定したから STARTTLS で送れた」のではなく、CDO が平文で AUTH しようとして Gmail に弾かれているだけです。sendtls フィールドは値をセットできますが、CDO の送信挙動には使われていません。

左: 587 + smtpusessl=True で HRESULT &H80040213 接続失敗のエラーダイアログ。右: 465 SSL に切り替えると送信完了 MsgBox が出る、の 2 コマ比較。

論証 4:Gmail 側は 587 STARTTLS を完全提供している

openssl の s_client -connect smtp.gmail.com:587 -starttls smtp を実行すると、TLSv1.3 / TLS_AES_256_GCM_SHA384 でハンドシェイクが成立し、EHLO 応答に STARTTLSSMTPUTF8 が広告されます。Gmail 側に何の問題もなく STARTTLS は動くのに、CDO クライアント側がそれを呼び出す仕組みを持たないだけ、というのが事実関係です。

正解の設定値 7 項目

schemas URL(設定名)意味
.../cdo/configuration/sendusing2外部 SMTP サーバーを使う
.../cdo/configuration/smtpserversmtp.gmail.comGmail の SMTP ホスト名
.../cdo/configuration/smtpserverport465SSL 専用 port
.../cdo/configuration/smtpusesslTrueimplicit SSL (SMTPS) を使う
.../cdo/configuration/smtpauthenticate1Basic 認証
.../cdo/configuration/sendusername送信元 Gmail アドレス
.../cdo/configuration/sendpassword16 文字アプリパスワード

表の .../http://schemas.microsoft.com の省略です。これらの URL は CDO Configuration の「設定名」として使う XML 名前空間であり、ブラウザで開いてアクセスする URL ではありませんhttps:// ではなく http:// でないと CDO は認識しないので注意してください。

補足:CDO の SMTPAuthenticate=1 は本記事の用途では問題ありません

Microsoft SQL Server Reporting Services(SSRS)の設定ファイルは CDO と同じ SMTPAuthenticate という設定名を使うため Web 検索でヒットすることがありますが、SSRS の設定文書と本記事の CDO 設定は別の話です。本記事の Excel VBA からの直接送信では SMTPAuthenticate=1(Basic 認証)が正解です。

添付ファイル / HTML 本文 / 複数宛先

基本コードに 1〜2 行追加するだけで、添付ファイル、HTML 本文、複数宛先の各機能が使えます。

添付ファイルを送る

送信前に msg.AddAttachment を呼ぶだけです。複数添付したい場合は複数回呼びます。

msg.AddAttachment "C:\path\to\your-file.xlsx"
msg.AddAttachment "C:\path\to\report.pdf"   ' 追加で 1 行

本記事の検証では、openpyxl で生成した xlsx の添付送信を実機で確認しました(Send 成功、受信側 Outlook.jp Web UI で添付表示・xlsx を開いてセル内容まで確認)。

HTML 本文を送る

msg.TextBody の代わりに msg.HTMLBody を使います。文字化けを防ぐため HTMLBodyPart.Charset = "utf-8" も忘れず併設します。

msg.HTMLBody = "<h2 style='color:#1e88e5;'>HTML メールサンプル</h2>" & _
               "<p><strong>太字</strong>と" & _
               "<a href='https://www.helpaso.net'>リンク</a></p>"
msg.BodyPart.Charset = "utf-8"
msg.HTMLBodyPart.Charset = "utf-8"

本記事の検証では、青見出し / 太字 / リンクが受信側で正常レンダリングされることを確認しました。ただし、メーラーやデバイスによって HTML レンダリングは異なる場合があります。重要な情報は本文(TextBody)にも残してください。

複数宛先(To / Cc / Bcc)

セミコロン区切りで複数アドレスを書けます。Cc は msg.CC、Bcc は msg.BCC です。Bcc は受信者側からは見えません。

msg.To  = "primary@example.com; secondary@example.com"   ' 必ず異なるアドレスを使う
msg.CC  = "cc-person@example.com"
msg.BCC = "bcc-person@example.com"

⚠ 注意:To / Cc / Bcc に同じアドレスを入れても 1 通だけ届きます

本記事の実機検証で発見した挙動です。To / Cc / Bcc に 同じアドレス を入れて Send すると、SMTP の RCPT TO としては成立しますが、受信側のメールサーバー(Outlook.com など)が重複を排除して 1 通だけ届けます(同種の動作報告: extendoffice.com)。VBA の .To = "x@y; x@y; x@y" も同様に 1 通になります。これは CDO の障害ではなく SMTP / 受信側 MTA の正常動作です。動作確認は必ず異なるアドレスを使ってください。

絵文字・機種依存文字について

本記事の検証では、絵文字(📧)や機種依存文字(①②③)、全角英数(ABC)を含む件名・本文の Send は成功しました。検証環境(Outlook.jp Web UI)では表示も正常でした。ただし、受信側の表示はメーラー / OS / フォントに依存します。業務利用では半角英数 + 日本語の標準的な文字に留めるのが安全です。

Outlook の受信画面で、Excel VBA から CDO 経由で送信した HTML+添付メール [helpaso E-3-A S7] を開いた様子。青色見出し / 太字 / 箇条書き / リンクが正しくレンダリングされ、添付の T5_attachment.xlsx も表示されている。送信者・受信者の個人情報部分はグレー矩形でマスク。

Outlook.Application 版との 1 行差比較

Outlook.Application 版で同じ送信内容を書くと、コード行数は 18 行 → 9 行 に短くなります。ただし「短いから優れている」わけではありません。用途で使い分け ます。

' Outlook.Application 版(最小実装、9 行)
Public Sub SendByOutlook_Minimal()
    Dim ol As Object, mi As Object
    Set ol = CreateObject("Outlook.Application")
    Set mi = ol.CreateItem(0)        ' 0 = olMailItem
    mi.To = "to@example.com"
    mi.Subject = "test"
    mi.Body = "body"
    mi.Send
End Sub
CDO 版 18 行と Outlook.Application 版 9 行の VBE コード並列比較。Outlook 版が短い分、本体インストール + プロファイル設定 + 初回起動 60 秒以上のコストがかかる。
判断軸CDO 版が向くOutlook 版が向く
Outlook 本体のインストール不要必須
Outlook プロファイル設定不要必須(メールアカウント追加済み)
起動時間0.5 秒以内初回 60 秒以上
自動化バッチ / サーバー側 Excel△(GUI 起動が発生)
送信履歴を Outlook 側に残したい×(CDO は履歴を持たない)○(Outlook の送信済みフォルダに残る)
署名 / リッチエディタを使いたい×

Outlook を業務常用していて送信履歴も残したい場合は Outlook 版、Outlook を起動したくないバッチ処理や Outlook 未インストール端末では CDO 版、と振り分けます。

認証エラー対処早見表(HRESULT 別)

VBE 実行時エラーで Err.Number = -2147220973 などが出たら、下表で対処方法を引いてください。同じ Err.Number 内で原因が分かれるケース(0x80040211 系)は、Err.Description の中にある「転送エラー コード」も併せて見る必要があります。

Err.Number(VBA から見える値)Hex(Err.Number)Err.Description に出る「転送エラー コード」原因と対処
-21472209730x80040213—(このエラーは内部コードを含まない)CDO_E_FAILED_TO_CONNECT「サーバーに接続できませんでした」。
原因:(1) SMTP サーバー名の typo / 不在ホスト / (2) port 587 で smtpusessl=True を指定(CDO は 587 で implicit SSL を試行して失敗、前節参照) / (3) ファイアウォール / インターネット切断。
対処:smtpserver = "smtp.gmail.com" / smtpserverport = 465 / smtpusessl = True を再確認。
-21472209780x8004020E説明文に 530 5.7.0 などの Gmail 応答CDO_E_SMTP_REFUSED_TO_SEND「サーバーが送信者アドレスを拒否」。
原因:(1) 2 段階認証プロセスが未有効 / (2) アプリパスワードではなく通常パスワード使用 / (3) Workspace 環境で管理者が許可していない(本記事の検証対象外) / (4) Google アカウントのパスワード変更でアプリパスワードが失効。
対処:個人 Gmail で 2 段階認証プロセス → アプリパスワード再生成。
-21472209750x80040211説明文に 0x80040217 + not available(VBA 側では Err.Number ではなく Err.Description 内の文字列)CDO_E_SMTP_SEND_FAILED「SMTP 認証メカニズムが Gmail 側で利用不可」。基本認証が無効化された状態(アプリパスワード未取得 / 失効 / Workspace 環境など)。
対処:myaccount.google.com/apppasswords で再生成。VBA のコードは Case &H80040211 内で InStr(Err.Description, "0x80040217") で判定します(後述のサンプル参照)。
-21472209750x80040211説明文に他の 0x... コード(例 0x800CCC78 = Bad Sender Address)CDO_E_SMTP_SEND_FAILED の別ケース。送信元アドレス不正・本文 MIME 不正など。
対処:SENDER_ADDR / msg.From を確認。本文に制御文字が混入していないか確認。
-21474181130x8000FFFFE_UNEXPECTED。CDO オブジェクト作成または Fields 設定段階での予期せぬエラー。
対処:cdosys.dll の登録、Windows / Excel の再起動。

本表の値は Excel 2024 Build 16.0.19929.20172 / Windows 11 25H2 / cdosys.dll 6.6.26100.8457(2025-09-16 版)で実機検証時点。Windows Update や Office 更新で挙動が変わる可能性があります。

HRESULT &H80040213「転送においてサーバーに接続できませんでした」の MsgBox 実機スクショ。Err.Number と Err.Description が両方表示されている。

エラー別に分岐する VBA コード

On Error GoToErr.Number を取得し、Select Case で原因別に分岐します。同じ Err.Number 内で内部コードが異なる場合(0x80040211)は InStrErr.Description を検索します。

ErrHandler:
    Dim hr As Long, desc As String, msgText As String
    hr = Err.Number
    desc = Err.Description

    Select Case hr
        Case &H80040213    ' サーバー接続失敗
            msgText = "サーバーに接続できません。" & vbCrLf & _
                      "port (465) / smtpusessl (True) / インターネット接続を確認してください。" & vbCrLf & _
                      "(port 587 + smtpusessl=True はこのエラーになります)"

        Case &H8004020E    ' Gmail 側で拒否(530 系)
            msgText = "Gmail に拒否されました。" & vbCrLf & _
                      "2 段階認証プロセス + アプリパスワードを確認してください。" & vbCrLf & _
                      "詳細: " & desc

        Case &H80040211    ' SMTP 送信失敗(内部コード別判定)
            If InStr(desc, "0x80040217") > 0 Or InStr(desc, "not available") > 0 Then
                msgText = "Gmail から ""not available"" が返されました。" & vbCrLf & _
                          "アプリパスワード未取得 / 失効 / パスワード変更で失効した可能性があります。"
            Else
                msgText = "SMTP 送信エラー。詳細: " & desc
            End If

        Case Else
            msgText = "未分類エラー HRESULT=&H" & Hex(hr) & vbCrLf & desc
    End Select

    MsgBox msgText, vbCritical, "送信失敗"

VBA の On Error 構文の基礎については VBA エラーハンドリング構文の解説 も参考にしてください。

FAQ — 動かないときのチェックリスト

Q. CreateObject("CDO.Message") で「ActiveX コンポーネントはオブジェクトを作成できません」エラー
cdosys.dll が登録されていない可能性です。Windows 11 標準同梱なので通常はあり得ませんが、稀に Windows 修復が必要になります。
Q. 昨日まで動いていたのに今日突然送れなくなった
アプリパスワードが失効した可能性が高いです。Google アカウントのパスワードを変更すると、生成済みのアプリパスワードがすべて一斉に失効します。myaccount.google.com/apppasswords で再生成してください。
Q. ファイアウォールの設定を確認したい
Windows Defender などのファイアウォールが port 465 outbound をブロックしている可能性があります。Excel.exe からの外向き 465 接続を許可してください。
Q. 件名や本文の日本語が文字化けする
msg.BodyPart.Charset = "utf-8" と、HTML 本文を使う場合は msg.HTMLBodyPart.Charset = "utf-8" も必ず設定してください。
Q. Google が将来アプリパスワードを廃止したらどうなる?
Google はアプリパスワードを推奨していません。代わりに OAuth 2.0(Google でログイン)の利用を案内しています。CDO は基本認証しかサポートせず OAuth 2.0 に対応していません。将来アプリパスワード自体も廃止された場合、CDO 方式は使えなくなります。長期運用では次の代替案を視野に入れてください。
Q. 会社の Gmail(Google Workspace)で送りたい
Workspace は組織ポリシーに依存するため本記事の対象外です。次の選択肢があります:(1) 管理者にアプリパスワード許可を確認、(2) Google Apps Script Web App(OAuth 2.0 経由)、(3) Power Automate Desktop の Gmail コネクタ、(4) Microsoft Graph API(Microsoft 365 アカウントの場合)。長期運用・大量配信用途では (2) 以降が安全です。
Q. 業務でメルマガや一斉通知を送りたい
個人 Gmail には 1 日あたり約 500 通 / 500 宛先の送信制限 があります。本記事の用途(数通〜数十通の業務通知・自動レポート送信)であれば制限値そのものには達しにくいですが、短時間に連続送信したり宛先に不備があるとスパム判定を受けて一時的に送信できなくなることがあります。大量配信・メルマガには向きません。SendGrid / Amazon SES / さくらメールボックスなどの専用配信サービス、または管理者承認済み SMTP リレーを検討してください。
Q. 送信成功を確実に確認したい
次の 4 点をすべて確認します:(1) Gmail Web UI の「送信済み」フォルダに送信履歴があるか、(2) 受信側 Web UI の受信トレイで本文・添付・HTML レンダリングを確認、(3) スパムフォルダも確認(Gmail 経由は Outlook.com 等で稀にスパム扱いされる)、(4) 添付は実際に開いて中身を確認。
Q. アプリパスワードをコードに書きたくない(共有時の事故防止)
配布 xlsm の SendGmailWithInputBoxPassword プロシージャを使ってください。実行時に InputBox でパスワードを入力する版で、ブックには残りません。完全に隠したい場合は UserForm + TextBox.PasswordChar の別実装が必要です(本記事スコープ外)。
Q. ファイルパス系のエラー(76 パスが見つかりません など)
ファイル添付のパス指定ミスです。VBA 実行時エラー 76 の対処 を参照してください。
Q. UI ベースで Outlook を使いたい(Outlook 派の人へ)
新しい Outlook for Windows のショートカット も参考になります。

まとめ

Excel VBA で個人 Gmail からメールを送る CDO 実装を、port 465 SSL + アプリパスワードの正解構成で完結させました。要点を再掲します。

  • Outlook 不要、cdosys.dll は Windows 11 25H2 標準同梱
  • port は 465 SSL(implicit SSL)。587 STARTTLS は CDO で動かない
  • 2025-03-14 以降は 2 段階認証プロセス + アプリパスワード が必須(個人 Gmail @gmail.com、Workspace は対象外)
  • 認証エラーは Err.NumberErr.Description 内の「転送エラー コード」を別々に判定する
  • 長期運用・大量配信は CDO 以外(OAuth 2.0 経由)を検討

ダウンロードした xlsm の「基本送信」シートでアプリパスワードを差し替えるだけで、すぐに送信を試せます。

サンプルファイル(xlsm)

本記事の VBA コード 7 モジュール(基本送信 / 添付 / HTML+複数宛先 / Outlook 比較 / エラー対処 / InputBox 安全版)が入った xlsm ブックです。アプリパスワードを差し替えるだけで動作確認できます。個人 Gmail (@gmail.com) + 2 段階認証プロセス済みアカウントが必要です。

xlsm ・ 約 28 KB ・ VBA 7 モジュール(基本送信 / 添付送信 / HTML+複数宛先 / Outlook 比較 / エラー対処 / InputBox 安全版)入り。アプリパスワードはダミーのままなので、各自取得して差し替えてください。

excel-vba-gmail-cdo-sample.xlsm

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント