VBAからGmailを送りたくなったら

VBAやKintoneといったものからGMail経由でメールを送りたいという要望は今もまだ結構遭遇します。しかし、現在は通常この手の要望を実現するには、OAuth2.0認証を行ってAPI経由で送るというのがモダンな方法になっていて、SMTP直接送るというのがあまり推奨されていません。とは言え、VBAやkintoneからOAuth認証して送るというのはちょっとハードルが高い。

ということで、現在でも利用できるVBAからGMailに対してメールを送る手法をまとめてみました。

今回利用するファイル等

旧式の「安全性の低いアプリをオン」で送る手法は、ノーマルのGoogleアカウントでは2022年5月30日より廃止されています。GWSでは、2024年秋に停止になるようです。

事前準備

昔と違って、Google WorkspaceのSMTPに直接接続してVBAから送るといったことはセキュリティ上出来ません。また、大量に送るスパムなどでSMTPリレーが悪用されてきた事もあって、故にSMTP直接接続して連続送信というのは昨今は割と制限されていたりします。しかし、少量であるならば有用な手段ではあるので、VBAやkintoneで使うにはとっても有用です。其のためにはGoogle Workspace側でも設定が必要です。

二段階認証をオンにする

2021年10月より、通常のGoogleアカウントでは認証に「2段階認証」が強制されるようになっています。Google Workspaceはそうではない設定も使えるようですが、今どき2段階認証がオンにしていないケースなんてほぼ無いと思われますが、一応以下の手順で二段階認証をオンにすることが可能です。

  1. Googleアカウントのセキュリティ項目にログインする
  2. Googleへのログイン項目の「2段階認証プロセス」をクリック
  3. オンにするセキュリティキーGoogle認証アプリなどでの処理を追加します)

二段階認証がオンになっていないアカウントではアプリパスワードは利用できません。

図:二段階認証は今や常識です

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

SMTPを使ってメールを送るといっても、SMTP認証をGoogleアカウントのパスワードで送るのではなく、アプリパスワードと呼ばれるもので行うようになっているので、以下の手順でアプリパスワードを入手します。ただGWSだとすでにアカウント設定から直接行けなくなっているようで、こちらのドキュメントを参考にセットします。

  1. Googleアカウントの設定画面に入る
  2. 左サイドバーより「セキュリティ」を開く
  3. 2段階認証プロセスをクリックする
  4. 下の方に「アプリパスワードがあるので「>」をクリックする。もしくは、「アプリパスワード」をクリック
  5. アプリ選択では、メールを選択
  6. デバイス選択では、Windowsパソコンを選択
  7. 生成ボタンを押す
  8. 16文字の文字列が出てくるのでこれを控えておく(この瞬間しか出ないので注意)

図:アプリパスワード設定画面

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

ソースコード

通常のメッセージ送信

VBAからはCDO.messageを利用して送信します。kintoneの場合にはkmailerなどに設定して送ることになります。以下のサンプルはフル機能を使った場合のサンプルなので不要な項目は除外してコードを組み立てます。きちんと送信トレイにも残ります

アプリパスワードはスペース区切りの文字列ですが、そのまんまapppassに入力しておきます。

Public Function GmailSend2()
    'ファイルの存在有無チェック用
    Dim objFso As Object
    Set objFso = CreateObject("Scripting.FileSystemObject")

    'アプリパスワードを設定
    Dim apppass as string
    apppass = "ここにアプリパスワードを入れる"

    '送信先設定
    Dim fromman As String
    Dim tomail As String
    Dim ccmail As String
    Dim bccmail As String
    
    fromman = "送信元アドレスを入れる"
    tomail = "送信先アドレスを入れる"
    ccmail = "ccの宛先を入れる"
    bccmail = "BCCの宛先を入れる"            '複数宛先はセミコロン区切り

    '送信タイトルとメッセージ本文
    Dim subject As String
    Dim bodyman As String
    
    subject = "テストメールだよ"
    bodyman = "このメールはテストです" & vbCrLf & vbCrLf & "返信しないでね"
    
    '添付ファイルの指定(複数の場合は配列にして格納する)
    Dim arrayman As Variant
    arrayman = "ここにファイルへのフルパスを入れる"
    
    'CDOにパラメータを与える
    With CreateObject("CDO.Message")
        '送信先指定
        .From = fromman
        .To = tomail
        .cc = ccmail
        .bcc = bccmail
        
        'タイトルと本文指定
        .subject = subject
        .textBody = bodyman        '.htmlbodyでHTMLメールを送れる
        
        '添付ファイルの指定(ここだけ指定方法がちょっと違う)
        '複数ファイルの場合は配列で渡す
        If IsArray(arrayman) = True Then
            For i = LBound(arrayman) To UBound(arrayman)
                '添付する
                If objFso.FileExists(arrayman(i)) Then
                    .AddAttachment arrayman(i)
                End If
            Next
        Else
            '---ファイルが存在してれば添付する
            If objFso.FileExists(arrayman) Then
                .AddAttachment arrayman
            End If
        End If
        
        '文字コードの指定
        .TextBodyPart.Charset = "ISO-2022-JP"
        
        '認証方法の指定
        With .Configuration.Fields
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            
            'SMTPサーバの指定
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
            
            'SSLの指定
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
            
            'ユーザ名の指定
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = fromman
            
            'アプリパスワード
            .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = apppass            
            '設定を保存
            .Update
        End With
        
        'エラートラップ
        On Error Resume Next
        'メールの送信
        .Send
        If Err.Number <> 0 Then
          MsgBox "エラー発生" & vbCrLf & "エラー番号:" & Err.Number & vbCrLf & "エラー内容:" & Err.Description, vbCritical + vbSystemModal
        End If
        On Error GoTo 0
    End With
    
    'オブジェクトを開放
    Set objMail = Nothing
    Set objFso = Nothing
    
    '終了メッセージ
    MsgBox "メール送信したよ"
    
End Functionべ

別の文字コードで送信する

前述のメールの場合、あえて指定していますが.TextBodyPart.Charsetにて文字コードを指定しています。通常のメッセージの場合は、文字コードは「iso-2022-jp」にて送信されるようです。ここを任意の文字コードで送信テストすることが可能です。他の代表的なメール文字コードとしては

  • utf-8, utf-7, utf-16
  • euc-jp
  • shift-jis

但し現代のメールではUTF-8を送るのが定石となっています。すでにもうshift-jisやeuc-jpなどは殆ど利用されていません。試しにutf-8を指定して送ってみます。

受信側のGmailでメールヘッダを見てみます。メッセージのソースを表示で見てみるとメールヘッダや送信クライアントを確認可能です。Content-Typeにはエンコード指定がUTF-8となってるのを確認可能です。またX-MailerではMicrosoft CDO for Windows 2000としてCDOで送ったのを確認可能です。

図:UTF8で送信されてるのを確認

SMTPリレーサービス

概要

今回の手法の他に、Google Workspaceの場合にはSMTPリレーサービスというものも利用可能です。こちらはノーマルのGoogleアカウントでは設定が出来ません。こちらの場合送信先のSMTPアドレスは「smtp-relay.gmail.com」となります。

こちらは1 日に送信できるお客様あたりの合計の宛先数がユーザ数 ✕ 130の数となっています。

事前準備

Google WorkspaceのAdmin Consoleからルーティングを設定する必要があります。

  1. Admin Consoleにログインする
  2. アプリ→Google Workspace→Gmailを開く
  3. ルーティングを開く
  4. STMPリレーサービスの設定をクリック
  5. 許可する送信者は通常はドメイン内のアドレスを指定します。
  6. 指定したIPアドレスからのみメールを受信するを指定した場合にはIPアドレスレンジを指定する必要(CIDR)があります。IPv6形式での指定も可能です。
  7. SMTP認証を必須にするをした場合、送信者側でも設定が必要です。この時のパスワードも前述の「アプリパスワード」である必要性があります。送信者のユーザ名はアプリパスワードを発行したユーザのメールアドレスになります。
  8. 7.をオンにした場合は通常はTLSによる暗号化を必須にするもチェックを入れます。
  9. 保存をクリックする

MailAppと違ってこの手法の場合、Fromのメールアドレスの書き換えが可能です。送信側がTLSに対応していない場合は、8.の設定は行いません(送信出来ずにエラーになる)

図:この画面でリレーサービス指定をする

送信側の指定

送信側でのポートの指定はSMTPリレーサービスの場合以下のようになる。

  • SMTPのポートはTLS有効化の場合は587となる
  • そうではない場合は、25, 465, 587のいずれかを指定する
  • TLSによる認証をしない場合、SMTP認証は出来ませんのでIPアドレス認証が必要になる

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)