問い合わせはフォームからだけ来るとは限りません。名刺やパンフレットを見た人は、info@example.co.jp に直接メールを送ってきます。この記事では、そのメールをn8nで受けて「問い合わせ一覧」とSlackの #問い合わせ に流し、送り主に受付確認を返し、種類ごとにGmailのラベルで振り分けるところまでを作ります。読み終わると、受信のきっかけをGmail TriggerとIMAPのどちらにするか、送信をGmailノードとSMTPのどちらでやるかを自分で決められます。前提は「n8nの使い方入門:最初のワークフローを作って動かす」で、フォームからシートとSlackへ流す3ノードが動いていることです。画面と設定項目は2026年10月時点の安定版2.44.7で確かめています。
この記事の内容
先に決めること
どの受信箱を見るか
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 Trigger | Email 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は同じものを使います。
| 順番 | ノード | 役割 |
|---|---|---|
| 1 | Gmail Trigger | info@ に届いた未処理のメールで動く |
| 2 | Edit Fields (Set) | 差出人・件名・本文・受信日時を取り出して整える |
| 3 | Google Sheets | 「問い合わせ一覧」に1行足す |
| 4 | Slack | #問い合わせ に知らせる |
| 5 | Gmail(Reply) | 送り主に受付確認を返す |
| 6 | Gmail(Add Label) | 「受付済み」のラベルを付ける |
| 別の枝 | Split Out と Google Drive | 添付ファイルを共有ドライブのフォルダに保存する |
ラベルを付けるのを最後に置くのが要です。途中で失敗したメールにはラベルが付かないので、直したあとに拾い直せます。

手順
準備: ラベルを作る
- つなぐアカウントでGmailを開き、左の一覧の「ラベル」の横の + を押す
- 名前に「受付済み」と入れて作成する
- 同じように「見積もり」「不具合」「採用」「営業売り込み」を作る(振り分けの節で使う)
ラベルはn8nの「Label」の「Create」でも作れますが、最初の数個は画面で作るほうが早いです。
Credentialを作る
- 新しいワークフローを作り、名前を「メール問い合わせ受付」にする
- 「Add first step」を押し、
gmailで検索して「Gmail Trigger」を選ぶ - 「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を設定する
- 「Poll Times」の「Mode」は「Every Minute」のままにする
- 「Event」は「Message Received」のまま
- 「Simplify」をオフにする
- 「Filters」の「Add Filter」から「Search」を足し、
-label:受付済み -from:meと入れる - 同じく「Read Status」を足し、「Unread and read emails」を選ぶ
- 「Options」の「Add option」から「Download Attachments」を足してオンにする
- 「Max Emails per Poll」は10のままにする
- 「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」に延ばしたとたんに取りこぼしが出ます。

件名・本文・差出人を取り出す
Simplifyをオフにした出力は項目が多いので、後ろで使うものだけを「Edit Fields (Set)」で抜き出します。
- Gmail Triggerの右の + から「Edit Fields (Set)」を足す
- 「Mode」は「Manual Mapping」のまま、「Fields to Set」に次の表の6項目を足す
- ノード名を「メールを整える」に変える
| 項目名 | 式 |
|---|---|
{{ $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 です。

シートとSlackに流す
シートとSlackの設定は入門の記事と同じです。違うのは値の出どころだけです。
- 「メールを整える」の右に「Google Sheets」を足し、「Append Row」で「問い合わせ一覧」の「シート1」を選ぶ
- 「Mapping Column Mode」を「Map Each Column Manually」にし、次の表のとおり入れる
- その右に「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に置きます。
- Gmail Triggerの右の + をもう一度押し、2本目の枝として「Split Out」を足す
- 「Fields To Split Out」に
$binaryと入れる。添付が3つなら item が3件に分かれる - その右に「Google Drive」を足し、操作は「Upload file」を選ぶ
- 「Input Data Field Name」に
{{ Object.keys($binary)[0] }}を入れる - 「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行足しておくと、担当者が探さずに済みます。

受付済みのラベルを付けて公開する
- Slackの右に「Gmail」を足し、「Resource」を「Message」、「Operation」を「Add Label」にする
- 「Message ID」に
{{ $('メールを整える').item.json.messageId }}を入れる - 「Label Names or IDs」で「受付済み」を選ぶ
- 「Execute workflow」で通しで動かし、シート・Slack・ラベルの3つを確かめる
- 右上の「Publish」を押す
- 別のアドレスから info@ にテストのメールを送り、1分ほどで「Executions」タブに実行が出ることを確かめる
Publishする前に届いていたメールは拾われません。Gmail Triggerは、公開して最初に見に行った時刻より後のメールだけを対象にします。公開前のメールを取り込みたいときは、手動で動かす別のワークフローに「Gmail」の「Get Many」を置き、「Received After」で日付を指定して流します。
送る: 受付確認を返す
Gmailノードで返信する
受付確認は、新しいメールとして送るより、届いたメールへの返信にするほうが相手の受信箱で話がつながります。
- Slackと、受付済みのラベルを付けるGmailの間の線の + を押して「Gmail」を挟み、「Operation」を「Reply」にする
- 「Message ID」に
{{ $('メールを整える').item.json.messageId }}を入れる - 「Email Type」を「Text」にする
- 「Message」に下の本文を入れる
- 「Add option」から「Append n8n Attribution」を足してオフにする
- 同じく「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ノードとSMTPの使い分け
| 項目 | Gmailノード | Send Email(SMTP) |
|---|---|---|
| つなぎ方 | Gmailと同じOAuth2のCredential | SMTPサーバーのアドレス・ポート・ユーザー・パスワード |
| 送信元 | つないだアカウント。表示名だけ「Sender Name」で変えられる | 「From Email」に書く。名前 <info@example.co.jp> の形も可 |
| 返信先 | 「Send Replies To」 | 「Reply To」 |
| スレッドにつなぐ返信 | 「Reply」でできる | できない(毎回新しい会話になる) |
| 本文の形式 | Text か HTML | Text・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のラベルになることです。
- 「メールを整える」と Google Sheets の間に「Text Classifier」を挟む
- 「Text to Classify」に
件名:{{ $json.subject }}と本文:{{ $json.message }}の2行を入れる - 「Categories」に「見積もり」「不具合」「採用」「営業売り込み」を登録し、Otherの出口も作る
- 各出口に「Gmail」の「Add Label」をつなぎ、同じ名前のラベルを選ぶ
- 4つの出口と Other を、その先で Google Sheets に合流させる
ラベルが付けば、担当者はGmailの左の一覧で自分の種類だけを開けます。営業売り込みのラベルが付いたメールには受付確認を返さないようにすると、売り込みのメールに丁寧な返信を送り続ける事故も防げます。

応用
| やりたいこと | 使うもの |
|---|---|
| 返信を人が確かめてから送る | 「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時間待つ。原因の繰り返しを止めてから再開する |
最後の上限の件は、待てば戻ります。ただ、その間は同じアカウントで人も送れません。送信に使うアカウントは、社員が普段使うアカウントと分けておきます。
次にやること
- n8nとGoogleスプレッドシート連携:読み書き・更新・重複を防ぐ
- n8nでAIエージェントを作る:ChatGPT・Claude・Geminiをつなぐ
- n8nを止めずに運用する:アップデート・バックアップ・エラー通知・脆弱性
- n8nの使い方入門:最初のワークフローを作って動かす
メールで受けた問い合わせとフォームの問い合わせが同じシートに並ぶと、重複して登録される人が出ます。同じメールアドレスの行を探して更新する作り方は、スプレッドシートの記事で扱っています。受信のトリガーは止まっても実行一覧に何も残らないことがあるので、運用の記事の毎朝の生存確認も合わせて入れます。