n8nとGmail連携:受信をきっかけに動かす、送る、振り分ける

公開 書いた人 大林 諒

問い合わせはフォームからだけ来るとは限りません。名刺やパンフレットを見た人は、info@example.co.jp に直接メールを送ってきます。この記事では、そのメールをn8nで受けて「問い合わせ一覧」とSlackの #問い合わせ に流し、送り主に受付確認を返し、種類ごとにGmailのラベルで振り分けるところまでを作ります。読み終わると、受信のきっかけをGmail TriggerとIMAPのどちらにするか、送信をGmailノードとSMTPのどちらでやるかを自分で決められます。前提は「n8nの使い方入門:最初のワークフローを作って動かす」で、フォームからシートとSlackへ流す3ノードが動いていることです。画面と設定項目は2026年10月時点の安定版2.44.7で確かめています。

この記事の内容
  1. 先に決めること
  2. Gmail TriggerとEmail Trigger (IMAP) の違い
  3. 作るものの一覧
  4. 手順
  5. 送る: 受付確認を返す
  6. 振り分ける: ラベルと種類の判定
  7. 応用
  8. できないことと、その代わり
  9. よく詰まるところ
  10. 次にやること

先に決めること

どの受信箱を見るか

n8nが見られるのは、Credential(認証情報)でつないだアカウント1つの受信箱だけです。Google Workspaceで info@ がGoogleグループになっている会社は多く、グループは受信箱を持たないので、そのままではつなげません。この場合は共用の業務アカウント(例: automation@example.co.jp)をグループのメンバーに入れ、そのアカウントの受信箱を見ます。info@ がユーザーのアカウントなら、そのアカウントで直接つなぎます。

担当者個人のアカウントでつながないのは、入門の記事に書いたシートの話と同じ理由です。加えてGmailには固有の事情があります。n8nのGmailのCredentialは、メールの読み取り・送信・削除までできる広い権限を求めます。個人の受信箱を丸ごと預けることになるので、問い合わせ専用の受信箱にします。

受信のきっかけをどれにするか

Gmailなら「Gmail Trigger」(Gmailの新着で動くトリガー)を使います。XServerのメールのようにGmail以外のサーバーで受けているなら「Email Trigger (IMAP)」(IMAPで受信するトリガー)です。違いは次の節の表にまとめました。

処理済みの印を何で付けるか

同じメールを2回シートに書かない、1通も取りこぼさない、の2つを両立させる印が要ります。候補は既読とラベルです。人も見ている受信箱で既読を印にすると、担当者が先に開いたメールをn8nが拾えなくなります。この記事では「受付済み」というラベルを印にします。既読・未読は人の対応状況に使えるよう、n8nは触りません。

返信をどのアドレスから送るか

Gmailノードで送ると、送信元はCredentialでつないだアカウントのアドレスになります。「Send」の設定に送信元アドレスを選ぶ欄は無く、変えられるのは表示名だけです。info@ から返したいなら、info@ のアカウントでつなぐかSMTPを使います。後から変えるとCredentialから作り直しになるので、受信箱を決めるときに一緒に決めます。

Gmail TriggerとEmail Trigger (IMAP) の違い

項目Gmail TriggerEmail Trigger (IMAP)
つなぎ方GoogleのOAuth2(推奨)かサービスアカウントユーザー名とパスワード。Gmailは2段階認証とアプリパスワードが要る
動き方「Poll Times」の間隔で見に行く。既定は「Every Minute」(1分おき)メールサーバーとの接続を保ち、届いたら動く
絞り込みGmailの検索欄と同じ書き方の「Search」、ラベル、既読・未読、差出人「Custom Email Rules」(既定は ["UNSEEN"]=未読)
1回に拾う数「Max Emails per Poll」既定10・最大50。超えた分は次の回届いた分
受信後の既読変えない「Action」の既定が「Mark as Read」で既読にする
本文と添付「Simplify」をオフにしたときだけ。添付は「Download Attachments」もオン「Format」と「Download Attachments」で決める
テスト実行条件に合う最新の1通を拾う新しいメールが届くのを待つ
使える相手Gmail(Google Workspaceを含む)IMAPに対応したメールサーバー全般

Gmailで迷ったらGmail Triggerです。ラベルとGmailの検索条件がそのまま使え、パスワードを預けずに済みます。1分おきに見に行っても、新しいメールが無い回はワークフローが動かないので、n8n Cloudの実行回数は増えません。届いた瞬間に動かしたい、Gmail以外の受信箱を見たい、のどちらかならIMAPです。IMAPの接続が切れたまま戻らなかった事故と対策は「n8nを止めずに運用する:アップデート・バックアップ・エラー通知・脆弱性」に書きました。

作るものの一覧

入門の記事の「問い合わせ受付」とは別に、メール用のワークフロー「メール問い合わせ受付」を1本作ります。シートとSlackは同じものを使います。

順番ノード役割
1Gmail Triggerinfo@ に届いた未処理のメールで動く
2Edit Fields (Set)差出人・件名・本文・受信日時を取り出して整える
3Google Sheets「問い合わせ一覧」に1行足す
4Slack#問い合わせ に知らせる
5Gmail(Reply)送り主に受付確認を返す
6Gmail(Add Label)「受付済み」のラベルを付ける
別の枝Split Out と Google Drive添付ファイルを共有ドライブのフォルダに保存する

ラベルを付けるのを最後に置くのが要です。途中で失敗したメールにはラベルが付かないので、直したあとに拾い直せます。

完成した「メール問い合わせ受付」のキャンバス。Gmail Triggerから右へ6ノードが並び、下に添付の枝が分かれている
完成した「メール問い合わせ受付」のキャンバス。Gmail Triggerから右へ6ノードが並び、下に添付の枝が分かれている

手順

準備: ラベルを作る

  1. つなぐアカウントでGmailを開き、左の一覧の「ラベル」の横の + を押す
  2. 名前に「受付済み」と入れて作成する
  3. 同じように「見積もり」「不具合」「採用」「営業売り込み」を作る(振り分けの節で使う)

ラベルはn8nの「Label」の「Create」でも作れますが、最初の数個は画面で作るほうが早いです。

Credentialを作る

  1. 新しいワークフローを作り、名前を「メール問い合わせ受付」にする
  2. 「Add first step」を押し、gmail で検索して「Gmail Trigger」を選ぶ
  3. 「Credential for Gmail OAuth2 API」の欄で「Create new credential」を選ぶ

n8n Cloudなら「Sign in with Google」で共用アカウントにログインして許可するだけです。セルフホストでは、入門の記事の手順でGoogle CloudにOAuthクライアントを作ります。違いは、「Library」で有効にするAPIが Gmail API になることだけです。シート用に作ったプロジェクトとOAuthクライアントをそのまま使い、Gmail APIを足して有効にすれば済みます。

「Authentication」はOAuth2のままにします。サービスアカウントでもGmailはつながりますが、Googleの「ドメイン全体の委任」が要り、公式ドキュメントもGmailにはOAuth2を勧めています。

Google Cloudの「Audience」は、Google Workspaceなら「Internal」にします。「External」で「Testing」のままだと7日で接続が切れます。「External」で本番に出すと、Gmailの権限は審査の対象になり、審査前は「確認されていないアプリ」の画面が出ます。社内だけで使うなら「Internal」で両方を避けられます。

Gmail TriggerのCredential画面。OAuth Redirect URLとClient ID・Client Secretの欄
Gmail TriggerのCredential画面。OAuth Redirect URLとClient ID・Client Secretの欄

Gmail Triggerを設定する

  1. 「Poll Times」の「Mode」は「Every Minute」のままにする
  2. 「Event」は「Message Received」のまま
  3. 「Simplify」をオフにする
  4. 「Filters」の「Add Filter」から「Search」を足し、-label:受付済み -from:me と入れる
  5. 同じく「Read Status」を足し、「Unread and read emails」を選ぶ
  6. 「Options」の「Add option」から「Download Attachments」を足してオンにする
  7. 「Max Emails per Poll」は10のままにする
  8. 「Execute step」を押し、OUTPUTに直近のメールが1通出ることを確かめる

3は必須です。「Simplify」がオンのままだと、出てくるのは件名・差出人・宛先などのヘッダーと、本文の冒頭だけの snippet です。本文そのものも添付も来ません。オフにすると、本文が text(テキスト)と html に分かれて入り、添付は attachment_0、attachment_1 のようにファイルとして付きます。

4の -label:受付済み は、処理済みのメールを拾わないための条件です。-from:me は、自分が送った受付確認のメールが同じスレッドにあっても拾わないためです。

5は、既定の「Unread emails only」(未読だけ)をやめるためです。未読だけにすると、担当者がGmailで先に開いたメールは条件から外れます。1分おきなら滅多に起きませんが、間隔を「Every Hour」に延ばしたとたんに取りこぼしが出ます。

Gmail Triggerの設定。Simplifyがオフ、FiltersにSearchとRead Status、OptionsにDownload Attachments
Gmail Triggerの設定。Simplifyがオフ、FiltersにSearchとRead Status、OptionsにDownload Attachments

件名・本文・差出人を取り出す

Simplifyをオフにした出力は項目が多いので、後ろで使うものだけを「Edit Fields (Set)」で抜き出します。

  1. Gmail Triggerの右の + から「Edit Fields (Set)」を足す
  2. 「Mode」は「Manual Mapping」のまま、「Fields to Set」に次の表の6項目を足す
  3. ノード名を「メールを整える」に変える
項目名式
email{{ $json.from.value[0].address }}
name{{ $json.from.value[0].name }}
subject{{ $json.subject }}
message{{ ($json.text ?? '').trim().slice(0, 3000) }}
receivedAt{{ DateTime.fromISO($json.date).setZone('Asia/Tokyo').toFormat('yyyy-MM-dd HH:mm') }}
messageId{{ $json.id }}

date は世界標準時で入っているので、日本時間に直してから書きます。そのまま書くと9時間ずれます。message を3,000字で切るのは、返信の引用や長い署名でシートの1セルが読めない長さになるのを防ぐためです。

HTMLだけで書かれたメールでも、text にはHTMLから起こした文字が入ります。html をそのままシートやSlackに送るとタグだらけになるので、使うのは text です。

Edit Fieldsの設定。6項目が並び、右のOUTPUTに日本時間の receivedAt が出ている
Edit Fieldsの設定。6項目が並び、右のOUTPUTに日本時間の receivedAt が出ている

シートとSlackに流す

シートとSlackの設定は入門の記事と同じです。違うのは値の出どころだけです。

  1. 「メールを整える」の右に「Google Sheets」を足し、「Append Row」で「問い合わせ一覧」の「シート1」を選ぶ
  2. 「Mapping Column Mode」を「Map Each Column Manually」にし、次の表のとおり入れる
  3. その右に「Slack」を足し、「Send a message」で #問い合わせ に下の本文を送る
列入れる値
受付日時{{ $json.receivedAt }}
会社名空のまま
お名前{{ $json.name }}
メールアドレス{{ $json.email }}
種類メール
内容{{ $json.subject }}/{{ $json.message }}
対応状況未対応
メールで問い合わせが届きました
差出人: {{ $('メールを整える').item.json.name }} <{{ $('メールを整える').item.json.email }}>
件名: {{ $('メールを整える').item.json.subject }}
内容: {{ $('メールを整える').item.json.message.slice(0, 300) }}

Slackには冒頭の300字だけ出し、全文はシートで読みます。会社名はメールの署名にしか無いことが多いので、ここでは空けておきます。署名から抜き出すなら、「n8nでAIエージェントを作る:ChatGPT・Claude・Geminiをつなぐ」のInformation Extractorが使えます。

添付を共有ドライブに保存する

添付はシートに入らないので、Google Driveに置きます。

  1. Gmail Triggerの右の + をもう一度押し、2本目の枝として「Split Out」を足す
  2. 「Fields To Split Out」に $binary と入れる。添付が3つなら item が3件に分かれる
  3. その右に「Google Drive」を足し、操作は「Upload file」を選ぶ
  4. 「Input Data Field Name」に {{ Object.keys($binary)[0] }} を入れる
  5. 「Parent Drive」と「Parent Folder」で、共有ドライブのフォルダ「問い合わせ添付」を選ぶ

Split Outで分けたあとも、ファイルの入れ物の名前は attachment_0、attachment_1 のまま残ります。4の式は、その item に入っている1つ目の入れ物の名前を拾っています。「File Name」は空のままにすると、添付の元のファイル名で保存されます。添付が無いメールではこの枝は0件になり、何も起きません。Google DriveのCredentialは、シートと同じGoogle CloudのOAuthクライアントで作れます(Drive APIは入門の記事の手順で有効にしてあります)。

Slackの本文に「添付は共有ドライブの『問い合わせ添付』フォルダにあります」と1行足しておくと、担当者が探さずに済みます。

Split Outの「Fields To Split Out」に $binary を入れ、OUTPUTで添付ごとに item が分かれたところ
Split Outの「Fields To Split Out」に $binary を入れ、OUTPUTで添付ごとに item が分かれたところ

受付済みのラベルを付けて公開する

  1. Slackの右に「Gmail」を足し、「Resource」を「Message」、「Operation」を「Add Label」にする
  2. 「Message ID」に {{ $('メールを整える').item.json.messageId }} を入れる
  3. 「Label Names or IDs」で「受付済み」を選ぶ
  4. 「Execute workflow」で通しで動かし、シート・Slack・ラベルの3つを確かめる
  5. 右上の「Publish」を押す
  6. 別のアドレスから info@ にテストのメールを送り、1分ほどで「Executions」タブに実行が出ることを確かめる

Publishする前に届いていたメールは拾われません。Gmail Triggerは、公開して最初に見に行った時刻より後のメールだけを対象にします。公開前のメールを取り込みたいときは、手動で動かす別のワークフローに「Gmail」の「Get Many」を置き、「Received After」で日付を指定して流します。

送る: 受付確認を返す

Gmailノードで返信する

受付確認は、新しいメールとして送るより、届いたメールへの返信にするほうが相手の受信箱で話がつながります。

  1. Slackと、受付済みのラベルを付けるGmailの間の線の + を押して「Gmail」を挟み、「Operation」を「Reply」にする
  2. 「Message ID」に {{ $('メールを整える').item.json.messageId }} を入れる
  3. 「Email Type」を「Text」にする
  4. 「Message」に下の本文を入れる
  5. 「Add option」から「Append n8n Attribution」を足してオフにする
  6. 同じく「Sender Name」を足し、「株式会社サンプル お問い合わせ窓口」のように表示名を入れる
{{ $('メールを整える').item.json.name }} 様

お問い合わせありがとうございます。
内容を確認し、2営業日以内に担当からご連絡します。

株式会社サンプル お問い合わせ窓口

3の「Email Type」は既定が「HTML」です。HTMLのまま改行入りの文章を入れると、改行が無視されて1段落につながります。HTMLで送るなら改行を <br> で書きます。5を忘れると、本文の最後に「This email was sent automatically with n8n」が付きます。

「Reply」は件名を元のメールに合わせ、同じスレッドに入れて送ります。「Send」(新規送信)を使うと、相手の受信箱では別の話として届きます。

Gmailノードの「Reply」設定。Email TypeがText、OptionsにAppend n8n AttributionとSender Name
Gmailノードの「Reply」設定。Email TypeがText、OptionsにAppend n8n AttributionとSender Name

GmailノードとSMTPの使い分け

項目GmailノードSend Email(SMTP)
つなぎ方Gmailと同じOAuth2のCredentialSMTPサーバーのアドレス・ポート・ユーザー・パスワード
送信元つないだアカウント。表示名だけ「Sender Name」で変えられる「From Email」に書く。名前 <info@example.co.jp> の形も可
返信先「Send Replies To」「Reply To」
スレッドにつなぐ返信「Reply」でできるできない(毎回新しい会話になる)
本文の形式Text か HTMLText・HTML・Both
添付「Attachments」に入力のファイル名「Attachments (File)」と、本文に埋め込む「Attachments (Inline)」
向く場面Gmailで受けてGmailで返すGmail以外のメールサーバーから送る、配信専用のサービスを使う

GmailをSMTPで使うこともできます。2段階認証を有効にしてアプリパスワードを作り、「Host」に smtp.gmail.com、「Port」に 465、「SSL/TLS」をオンにします。ただ、Gmailで受けているならGmailノードのほうがパスワードを預けずに済み、スレッドにもつながります。SMTPが要るのは、XServerなどのメールサーバーにある info@ から送りたいときです。

送りすぎを防ぐ

Gmailには送信の上限があります。Google Workspaceでは、1ユーザーが送れるのは1日2,000通(無料試用中は500通)、1日の宛先の総数は10,000、1通あたりの宛先はGmail API経由で500、SMTP経由で100です。数えるのは直近24時間で、超えると最長24時間送れなくなります。その間も受信はできますが、同じアカウントで人が送るメールも止まります。

問い合わせへの返信で上限に届くことはまずありません。危ないのは、ワークフローの誤りで同じ処理が繰り返されたときです。実際に本番で動かしていると、次の2つが起きます。

  • 自動返信どうしの往復。相手も自動返信を返す設定だと、そのメールにまたn8nが返信し、止まらなくなる。Gmail Triggerの「Search」に -from:mailer-daemon -subject:自動返信 のような除外を足し、返信の前に「If」で同じアドレスへの返信が直近にあれば止める
  • 宛先の取り違え。シートから読んだ件数ぶん返信が出て、全員に同じメールが届く。返信するノードの前で item の件数を確かめ、テストは自分宛てのメールだけで行う

一斉配信のように数百通をまとめて送る用途には、Gmailも個人のSMTPも使いません。配信専用のサービスのAPIを「HTTP Request」で呼びます。

振り分ける: ラベルと種類の判定

検索条件で分ける

決まった相手や決まった件名は、AIを使わずに検索条件で分けられます。Gmail Triggerの「Search」は、Gmailの検索欄と同じ書き方です。

条件書き方
特定の相手からfrom:sales@example.com
件名に「見積」を含むsubject:見積
添付付きだけhas:attachment
PDFの添付だけfilename:pdf
10MBより大きいものを除く-larger:10M
特定のラベルが付いていない-label:受付済み

条件ごとにワークフローを分けるより、1本で受けて「Switch」で分けるほうが、受付済みのラベル付けが1か所で済みます。

LLMで種類を判定してラベルを付ける

本文を読まないと分からない種類は、LLMに判定させます。Text Classifierの置き方、Descriptionの書き方、どれにも当てはまらないときの扱いは「n8nでAIエージェントを作る:ChatGPT・Claude・Geminiをつなぐ」に書いたとおりです。メールの場合に違うのは、入力の式と、出口の先がGmailのラベルになることです。

  1. 「メールを整える」と Google Sheets の間に「Text Classifier」を挟む
  2. 「Text to Classify」に 件名:{{ $json.subject }} と 本文:{{ $json.message }} の2行を入れる
  3. 「Categories」に「見積もり」「不具合」「採用」「営業売り込み」を登録し、Otherの出口も作る
  4. 各出口に「Gmail」の「Add Label」をつなぎ、同じ名前のラベルを選ぶ
  5. 4つの出口と Other を、その先で Google Sheets に合流させる

ラベルが付けば、担当者はGmailの左の一覧で自分の種類だけを開けます。営業売り込みのラベルが付いたメールには受付確認を返さないようにすると、売り込みのメールに丁寧な返信を送り続ける事故も防げます。

Text Classifierの5つの出口に、それぞれGmailのAdd Labelがつながったキャンバス
Text Classifierの5つの出口に、それぞれGmailのAdd Labelがつながったキャンバス

応用

やりたいこと使うもの
返信を人が確かめてから送る「Draft」の「Create」で下書きにする。「Thread ID」を入れると元のスレッドに入る
上長の承認を取ってから送るGmailの「Send and Wait for Response」で承認ボタン付きのメールを送り、押されたら先へ進む
AIに返信の下書きを書かせるAI AgentのToolにGmailノードをつなぐ。送信の前には人の確認を挟む
XServerの info@ を見るEmail Trigger (IMAP)。「Action」を「Nothing」にすれば人の既読を邪魔しない
毎朝、未返信の件数を知らせる「Schedule Trigger」とGmailの「Get Many」。Searchに -label:受付済み

AIに書かせた返信をそのまま送るのは避けます。誤った金額や約束が一度送られると取り消せません。下書きまでをn8nにやらせ、送るのは人、という線を引いておくと安全です。

できないことと、その代わり

できないこと代わりの手
Gmail Triggerで届いた瞬間に動かす1分おきで足りない場面はIMAPのトリガーにする
1つのCredentialで複数人の受信箱を見る見たい受信箱ごとにCredentialを作るか、共用アカウントに転送して集める
Gmailノードの「Send」で送信元アドレスを変える送りたいアドレスのアカウントでつなぐか、SMTPの「From Email」を使う
SMTPで元のメールのスレッドにつなげて返すGmailノードの「Reply」を使う
大きなファイルをGmailで添付して送る個人のGmailは25MBが上限。Google Driveに置いてリンクを送る
数百通以上の一斉配信配信専用サービスのAPIをHTTP Requestで呼ぶ
Gmailノードに無い操作(フィルタや署名の設定など)Gmail APIを「HTTP Request」で直接呼ぶ。画面で済むなら手で設定する

よく詰まるところ

症状原因直し方
7日ほどでGmailにつながらなくなるGoogle Cloudの「Audience」が「External」で「Testing」のまま「Internal」にしてつなぎ直す
ある日から全部止まった。直前に共用アカウントのパスワードを変えたGmailの権限を含むトークンは、パスワード変更で無効になることがあるCredentialを開いて「Sign in with Google」でつなぎ直す。パスワード変更の手順に「n8nのつなぎ直し」を入れておく
401 unauthorized_client が出るGoogle CloudでGmail APIを有効にしていない「APIs & Services」の「Library」で Gmail API を有効にする
本文が取れない。subject が空で Subject があるSimplifyがオンで、ヘッダーと snippet しか来ていないSimplifyをオフにし、式を $json.subject・$json.text で作り直す
添付が出てこないSimplifyがオン、または「Download Attachments」がオフ両方を直す。OUTPUTの「Binary」に attachment_0 が出れば取れている
同じメールがシートに何行も入るテスト実行のたびに最新の1通を拾い直している。失敗した実行をやり直しているテスト中はシートのノードを止めるか、テスト用のシートに向ける。やり直しの前にシートを確かめる
担当者が開いたメールが拾われない「Read Status」が既定の「Unread emails only」「Unread and read emails」にし、印はラベルで付ける
IMAPで同じメールが何度も処理される「Action」が「Nothing」で、条件が未読のまま「Mark as Read」にするか、「Custom Email Rules」と処理済みのフォルダで分ける
IMAPでログインできないGmailに普段のパスワードを入れている2段階認証を有効にし、アプリパスワードを作って入れる。Workspaceは管理者がIMAPを許可しているか確かめる
受付日時が9時間ずれるdate が世界標準時のままDateTime.fromISO($json.date).setZone('Asia/Tokyo') で直す
返信の本文が1行につながって届く「Email Type」が既定の「HTML」「Text」にするか、改行を <br> で書く
返信の末尾に英語の一文が付く「Append n8n Attribution」が既定でオンOptionsから足してオフにする
大きな添付のメールでn8nが止まる添付をメモリに読み込みきれないSearchに -larger:10M を足し、大きなメールは人が見る。セルフホストならサーバーのメモリを増やす
「You reached a Gmail sending limit」で送れない1日の送信上限を超えた最長24時間待つ。原因の繰り返しを止めてから再開する

最後の上限の件は、待てば戻ります。ただ、その間は同じアカウントで人も送れません。送信に使うアカウントは、社員が普段使うアカウントと分けておきます。

次にやること

メールで受けた問い合わせとフォームの問い合わせが同じシートに並ぶと、重複して登録される人が出ます。同じメールアドレスの行を探して更新する作り方は、スプレッドシートの記事で扱っています。受信のトリガーは止まっても実行一覧に何も残らないことがあるので、運用の記事の毎朝の生存確認も合わせて入れます。

あわせて読む