kintoneのデータをGASでメール送信する方法|1日1,500宛先の上限をblastengineで解消する手順

kintoneで顧客情報や請求データを管理していると、よく寄せられるのが「このデータを使って、そのままメールを送れないか」という要望です。請求明細の送付、契約更新のお知らせ、申込受付の通知。送るべきメールの元データは、すでにkintoneの中にそろっています。
ところが、kintoneには顧客など外部のメールアドレスへメールを一斉配信する標準機能がありません。そのため、kintone向けのメール配信プラグインを導入するのが一般的な方法です。
一方で、「自社の業務フローに合わせて送信の仕組みを作り込みたい」「すでにGASで業務を自動化している」という場合は、Google Apps Script(GAS)でメールを送る仕組みを自作する選択肢もあります。ただし、GASから直接送信する場合、Google Workspaceアカウントでは1日あたり1,500宛先という上限があります。毎月4,000件の請求明細を送る企業なら、上限に収めるために送信を3日に分けなければなりません。
本記事では、GASでkintoneのメール送信を自作する場合に、送信上限を解消する方法として、メール配信API「blastengine(ブラストエンジン)」とkintoneを連携させる具体的な手順を、GASのサンプルコード付きで解説します。請求明細メールを例にした設計パターンも紹介するため、kintoneのメール配信を「仕組み」として安定させたいシステム担当者は、そのまま設計の参考にしてください。
※本記事の仕様・料金・上限値は2026年10月時点の情報です。

kintoneからメールを送る方法とGASの位置づけ
kintoneのデータを使ってメールを送る方法として最も一般的なのは、kintone向けのメール配信プラグインの導入です。一方で、送信の仕組みを自作する場合は、GASで作る方法と、Node.jsなどのプログラムをサーバーで動かす方法があります。
kintoneには標準のメール一斉配信機能がない
kintoneの標準機能にある「通知」は、kintoneのユーザーに向けた社内通知です。顧客など外部のメールアドレスに、レコードの内容を差し込んだメールを送る機能は標準では備わっていません。
そのため、外部にメールを送るには「プラグインや連携サービスを追加する」「自分たちで送信の仕組みを作る」のどちらかが必要です。開発なしで手軽に始めたい場合や、プラグインの機能で要件を満たせる場合は、プラグインの導入が近道です。
GASで仕組みを自作するメリット
GASは、Googleのサーバー上でJavaScriptを実行できるサービスです。自前のサーバーを用意する必要がなく、時間主導型のトリガーで定期実行もできるため、すでにGoogle Workspaceで業務を自動化している企業には取り組みやすい選択肢です。
kintoneのREST APIもGASから呼び出せるため、「kintoneからデータを取得して、メールを送り、結果を書き戻す」という一連の処理をGASだけで完結できます。
GASからの直接送信と、メール配信APIとの組み合わせ
GASでメールを送る方法は、GASのMailAppやGmailAppでGoogleのメールサーバーから直接送る方法と、GASからblastengineなどのメール配信APIを呼び出す方法の2つです。違いは次のとおりです。
| 比較項目 | GASから直接送信 | GAS+メール配信API(blastengine) |
|---|---|---|
| 1日の送信上限 | Google Workspaceで1,500宛先 | 宛先数の上限なし(UrlFetchAppの呼び出しは1日100,000回まで。月間通数の超過分は従量課金、API呼び出しは1分あたりの上限あり) |
| 費用 | 追加費用なし | 月間配信通数に応じた月額料金 |
| 送信の経路 | Googleのメールサーバー(送信者はGoogleアカウントのアドレス) | blastengineの配信サーバー(自社ドメインにSPF/DKIM/DMARCを設定) |
| エラーメールの処理 | 自前で集計・除外 | 配信サービス側で自動対応 |
| 配信ログ | 自前で保存 | 配信IDで追跡可能 |
| 向いているケース | 月数百件程度の小規模送信 | 月数千件以上の送信 |
月数百件程度なら直接送信で十分ですが、件数が増えると送信上限が壁になります。以降は、GASとメール配信APIを組み合わせる方法を中心に解説します。
なお、自社のサーバーでNode.jsのプログラムを動かし、kintoneとblastengineを連携する方法は、別記事で詳しく解説しています。
GASからの直接送信でぶつかる「1日1,500宛先」の壁
GASからの直接送信は手軽な反面、件数が増えた途端に運用が苦しくなります。ここでは、その原因と影響を具体的な数字で確認します。
送信上限の正体はApps Scriptのクォータ
Googleが公開しているApps Scriptのクォータでは、MailAppなどで送信できるメールの宛先数は、Google Workspaceアカウントで1日あたり1,500宛先、gmail.comなどの個人アカウントでは1日100宛先と定められています。なお、試用期間中のWorkspaceアカウントなどでは、さらに低い上限が適用される場合があります。
注意したいのは、この上限が「通数」ではなく「宛先数」で数えられる点です。1通のメールにTo・CC・BCCで3人を入れれば、3宛先分を消費します。さらに、上限は最初のリクエストから24時間でリセットされる仕組みのため、「毎朝9時にリセットされる」といった固定の区切りでもありません。
月4,000件を送るとどうなるか(シミュレーション)
月末締め・月初送付で、請求明細メールを月4,000件送る企業を想定します。
- GASから直接送信する場合:1日1,500宛先が上限のため、最短でも3日に分けて送る必要があります(1,500+1,500+1,000)。顧客によって請求明細の到着日が最大2日ずれ、「まだ届いていない」という問い合わせの原因になります。
- 件数が1万件に増えた場合:最短7日。もはや「月初に送る」という業務ルール自体が守れません。
- メール配信APIで送信する場合:1日あたりの宛先数の上限がないため、APIの呼び出し上限の範囲内で、4,000件でも1万件でも同じ日に送れます(本記事のサンプル設計では、1万件の送信完了まで8時間程度かかります)。
送信を分割すると、「どこまで送ったか」を管理する仕組みも別途必要になります。上限への対処のために、本来不要な管理コストが積み上がっていくわけです。
上限以外にも残る運用の課題
送信上限を回避できたとしても、Googleアカウントから業務メールを大量送信する運用には、別の課題が残ります。
- 送信に使うアカウントの評価が下がると、普段の業務メールにまで影響が出るおそれがある(Googleのメール送信者のガイドラインでも、Google Workspaceで大量のメールを送る場合は、迷惑メールや不正行為に関する規定を確認するよう案内されています)
- 宛先不明などで戻ってきたエラーメール(バウンスメール)を、自分たちで集計・除外する必要がある
- 「どの顧客に、いつ、何を送ったか」という配信ログを、自前で保存しなければならない
送信件数が月数千件を超えたら、メール配信の専門サービスに送信処理を切り出すことを検討するタイミングです。
blastengine×kintone連携の全体像
実装に入る前に、blastengineとkintoneを連携させる構成の全体像を整理します。ポイントは「どこに何を持たせるか」という役割分担です。
kintoneは「データと操作画面」、GASは「本文と送信処理」
おすすめの構成は、kintone・GAS・blastengineの3つで役割を分ける形です。
- kintone:顧客情報・請求データの管理と、「送信待ちにする」「送信結果を確認する」といった操作画面
- GAS:メール本文のテンプレート管理と、blastengine APIへの送信処理
- blastengine:実際のメール配信、配信ログ、エラーメールの管理
kintone側の担当者は、これまでどおりkintoneの画面で操作するだけです。GASが定期的にkintoneを確認し、「送信待ち」のレコードがあればblastengine経由でメールを送り、結果をkintoneに書き戻します。
APIキーをkintoneのJavaScriptに書いてはいけない理由
「GASを挟まず、kintoneのJavaScriptカスタマイズから直接blastengine APIを呼べばよいのでは」と考える方もいるはずです。しかし、この方法には大きなリスクがあります。
kintoneのJavaScriptカスタマイズは、アプリを開いたユーザーのブラウザで実行されます。つまり、コード内に書いたblastengineのAPIキーは、アプリを閲覧できるすべてのユーザーから見える状態になります。APIキーが漏れれば、第三者に自社ドメインからメールを送られる危険があります。
kintoneから直接呼び出したい場合は、認証情報をプラグインの設定に保存して秘匿できる「プラグインから外部APIを実行するAPI」を使う方法もあります。ただし、プラグイン開発の手間がかかるため、まずはGASのスクリプトプロパティに認証情報を保管する構成が現実的です。
トランザクション配信と一斉配信、kintone連携ではどちらを使うか
blastengine APIには、1宛先ずつ送る「トランザクション配信」と、多数の宛先にまとめて送る「一斉配信(BULK)」があります。kintone連携でどちらを選ぶかは、送信経路にも関わる重要な判断です。
| 比較項目 | トランザクション配信 | 一斉配信(BULK) |
|---|---|---|
| APIの呼び出し方 | 1宛先につき1回のPOSTで完結 | 配信作成(POST)→宛先登録(PUT)→配信確定(PATCH)の3段階 |
| 本文の個別化 | 宛先ごとに本文を自由に組み立てられる | 差し込みコードで宛先ごとに一部を置き換える |
| kintoneのJavaScriptから直接呼び出し | 技術的には可能(APIキーが露出するため非推奨) | kintone.proxy()経由では配信確定のPATCHを送れないため不可 |
| GASからの呼び出し | 可能 | 可能(UrlFetchAppはPATCHに対応) |
| 向いているメール | 請求明細、申込受付、契約更新案内など1件ごとに内容が異なるメール | 全員に同じ内容を送るお知らせ・メールマガジン |
見落としやすいのが、kintoneから外部APIを呼び出すkintone.proxy()の仕様です。指定できるHTTPメソッドはGET・POST・PUT・DELETEの4つのみで、PATCHは使えません。一斉配信の最後のステップである配信確定はPATCHメソッドのため、kintone.proxy()だけでは一斉配信を完結できないのです。
請求明細のように顧客ごとに金額や内容が異なるメールなら、トランザクション配信を1件ずつ順番に呼び出す方式がシンプルです。全員に同じ文面を送る用途で一斉配信を使いたい場合は、GASなどkintoneの外側から呼び出す構成にします。
なお、お知らせやメールマガジンなど、広告・宣伝を含むメールを送る場合は、特定電子メール法に基づく受信者の同意取得と、送信者情報・配信停止方法の表示が必要です。
実装手順:kintoneの請求明細をblastengineで送信する
ここからは、kintoneの請求管理アプリから請求明細メールを送る仕組みを、6つのステップで構築します。GASのサンプルコードはV8ランタイムで動作する形で記載しています(STEP 3のボタンのみ、kintoneのJavaScriptカスタマイズです)。なお、本記事の構成はkintoneのJavaScriptカスタマイズとREST APIを使うため、スタンダードコース以上の契約が前提です。本番運用の前に、必ずテスト環境で動作を確認してください。
STEP 1:blastengineのアカウント作成とAPIキーの確認
blastengineの無料トライアルに申し込み、管理画面にログインします。管理画面で「ID」と「APIキー」を確認しておきます。この2つを組み合わせて、API認証に使うBearerトークンを生成します。
トライアル環境では、スパム行為を防ぐため、送信先のアドレスを「配信可能アドレス」として事前に登録する必要があります(5件まで)。管理画面上部の「スタートアップガイド」から「API連携で試す」を選び、「アドレス登録」で社内の検証用アドレスを登録してから、テスト送信を行ってください。なお、トライアルで配信できるのは月間10,000通までです。
検証が終わって実際の顧客へ配信する場合は、本契約が必要です。管理画面の「プラン変更」からプラン選択・契約者情報・支払方法を入力して申し込みます。環境の切り替えは、即日〜2営業日程度で完了します。
blastengineの無料トライアルはこちらから:https://app.engn.jp/be/order/request-form
STEP 2:送信ドメインのSPF・DKIM・DMARC設定
自社ドメインからメールを送るため、送信ドメインのDNSにSPFレコードとDKIMの設定を追加します。SPFレコードの設定例は次のとおりです。
v=spf1 include:spf.besender.jp ~all既存のSPFレコードがある場合は、SPFレコードを新たに追加するのではなく、既存のレコードにinclude:spf.besender.jpを追記してください。末尾の-allなどの設定は変更しません。1つのドメインにSPFレコードが2つあると、SPFの検証自体が失敗します。また、includeを重ねてDNSの参照回数が10回を超えた場合もエラーになるため、追記後は検証ツールで確認します。
あわせて、DMARCレコードも設定します。Googleのメール送信者のガイドラインでは、Gmailアカウントに1日5,000件以上のメールを送る送信者に、SPF・DKIM・DMARCの設定が求められています。認証設定が不十分なまま送信すると、迷惑メールとして扱われる可能性が高まるため、請求明細のような重要なメールほど、本番送信前に設定を済ませてください。
STEP 3:kintoneアプリにフィールドを追加しAPIトークンを発行する
請求管理アプリに、送信制御用のフィールドを追加します。フィールドコードは英数字にしておくと、プログラムから扱いやすくなります。
| フィールド名 | フィールドコード | フィールドの種類 |
|---|---|---|
| 顧客名 | customer_name | 文字列(1行) |
| メールアドレス | 文字列(1行)またはリンク(必須項目に設定) | |
| 請求月 | billing_month | 文字列(1行) |
| 請求金額 | amount | 数値(必須項目に設定) |
| 送信ステータス | send_status | ドロップダウン(未送信/送信待ち/送信中/送信済み/送信エラー、初期値:未送信) |
| 配信ID | delivery_id | 文字列(1行) |
| エラー内容 | error_message | 文字列(複数行) |
フィールドを追加したら、アプリの設定からAPIトークンを発行します。権限は「レコード閲覧」と「レコード編集」の2つで十分です。必要以上の権限を付けないことが、安全な運用の基本です。発行後は、アプリ設定画面で「アプリを更新」をクリックしてください。更新しないと、APIトークンもフィールドの変更も有効になりません。
送信ステータスは、担当者が手動で「送信済み」から「送信待ち」に戻すと再送につながります。フィールドのアクセス権で、編集できるユーザーを限定しておきます。また、kintoneでIPアドレス制限などのアクセス制限を設定している場合、GAS(Googleのサーバー)からkintoneにアクセスできないことがあります。事前に管理者に確認してください。
kintoneのレコード詳細画面に「送信待ちにする」ボタンを置くと、担当者の操作が分かりやすくなります。このコードはkintoneの標準APIだけを使うため、blastengineの認証情報は一切含まれません。
(() => {
'use strict';
kintone.events.on('app.record.detail.show', (event) => {
// フィールド追加前の既存レコードは値が空の場合があるため、空も対象にする
if (!['未送信', ''].includes(event.record.send_status.value)) return event;
const btn = document.createElement('button');
btn.textContent = '請求明細メールを送信待ちにする';
btn.onclick = async () => {
if (!window.confirm('このレコードを送信待ちにしますか?')) return;
try {
await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', {
app: kintone.app.getId(),
id: kintone.app.record.getId(),
record: { send_status: { value: '送信待ち' } },
});
window.location.reload();
} catch (e) {
window.alert('更新に失敗しました。権限を確認してください。');
}
};
kintone.app.record.getHeaderMenuSpaceElement().appendChild(btn);
return event;
});
})();このコードをUTF-8(BOMなし)の.jsファイルとして保存し、アプリの設定の「JavaScript / CSSでカスタマイズ」から「PC用のJavaScriptファイル」にアップロードします。保存したら「アプリを更新」をクリックすると、レコード詳細画面にボタンが表示されます。この設定には、アプリの管理権限が必要です。
STEP 4:GASに認証情報を保存しBearerトークンを生成する
GASのプロジェクトを作成し、「プロジェクトの設定」→「スクリプト プロパティ」に次の3つを保存します。コード内に直接書かないことで、コード共有時の漏えいを防げます。
BE_LOGIN_ID:blastengineのIDBE_API_KEY:blastengineのAPIキーKINTONE_API_TOKEN:STEP 3で発行したkintoneのAPIトークン
ただし、スクリプトプロパティはGASプロジェクトの編集者であれば閲覧できます。編集権限は必要最小限のメンバーに絞ってください。
blastengineのBearerトークンは、「ID+APIキー」の文字列をSHA-256でハッシュ化し、小文字の16進数文字列にしたうえでBase64エンコードして生成します。GASでは次のように書けます。なお、blastengineのGitHubでは、GAS向けのSDKも公開されています。
const KINTONE_DOMAIN = 'example.cybozu.com'; // 自社のkintoneドメイン
const KINTONE_APP_ID = 123; // 請求管理アプリのID
const BE_API_BASE = 'https://app.engn.jp/api/v1';
function prop_(key) {
return PropertiesService.getScriptProperties().getProperty(key);
}
let beToken_ = null; // 1回の実行中はトークンを使い回す
function getBearerToken_() {
if (beToken_) return beToken_;
const raw = prop_('BE_LOGIN_ID') + prop_('BE_API_KEY');
const digest = Utilities.computeDigest(
Utilities.DigestAlgorithm.SHA_256, raw, Utilities.Charset.UTF_8
);
const hex = digest
.map((b) => ('0' + (b & 0xff).toString(16)).slice(-2))
.join(''); // 小文字の16進数文字列
beToken_ = Utilities.base64Encode(hex);
return beToken_;
}STEP 5:kintoneから送信待ちのレコードを取得してメールを送る
kintoneのREST APIで「送信待ち」のレコードを取得し、1件ずつblastengineのトランザクション配信APIに送ります。kintoneのREST APIには、1アプリにつき1日10,000回(スタンダードコース。ワイドコースは100,000回)のリクエスト数の上限があります。そのため、レコードの更新は1件ずつではなく、最大100件をまとめて行う/k/v1/records.jsonを使います。
function kintoneFetch_(path, method, body) {
const options = {
method: method,
headers: { 'X-Cybozu-API-Token': prop_('KINTONE_API_TOKEN') },
muteHttpExceptions: true,
};
if (body) {
options.contentType = 'application/json';
options.payload = JSON.stringify(body);
}
const res = UrlFetchApp.fetch(`https://${KINTONE_DOMAIN}${path}`, options);
if (res.getResponseCode() >= 300) {
throw new Error(`kintone API error: ${res.getContentText()}`);
}
return JSON.parse(res.getContentText());
}
function fetchPendingRecords_() {
const query = 'send_status in ("送信待ち") order by $id asc limit 100';
const path = `/k/v1/records.json?app=${KINTONE_APP_ID}&query=${encodeURIComponent(query)}`;
return kintoneFetch_(path, 'get').records;
}
// 複数レコードをまとめて更新する(1リクエスト最大100件)
function updateRecords_(updates) {
for (let i = 0; i < updates.length; i += 100) {
kintoneFetch_('/k/v1/records.json', 'put', {
app: KINTONE_APP_ID, records: updates.slice(i, i + 100),
});
}
}
function buildMail_(r) {
const amount = Number(r.amount.value).toLocaleString('ja-JP');
return {
subject: `【ご請求明細】${r.billing_month.value}分のご案内`,
text: [
`${r.customer_name.value} 様`,
'',
'いつもご利用いただき、ありがとうございます。',
`${r.billing_month.value}分のご請求金額は ${amount}円 です。`,
'',
'株式会社サンプル 請求窓口',
].join('\n'),
};
}
function sendTransaction_(to, mail) {
const res = UrlFetchApp.fetch(`${BE_API_BASE}/deliveries/transaction`, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + getBearerToken_() },
payload: JSON.stringify({
from: { email: 'billing@example.jp', name: '株式会社サンプル 請求窓口' },
to: to,
subject: mail.subject,
encode: 'UTF-8',
text_part: mail.text,
}),
muteHttpExceptions: true,
});
if (res.getResponseCode() >= 300) {
throw new Error(`blastengine API error: ${res.getContentText()}`);
}
return JSON.parse(res.getContentText()).delivery_id;
}本文をGAS側で組み立てているのがポイントです。文面を修正したいときはGASのbuildMail_だけを直せばよく、kintoneのアプリ設定には手を入れずに済みます。HTMLメールにしたい場合は、送信データにhtml_partを追加します。
STEP 6:送信結果をkintoneに書き戻し、トリガーで自動実行する
最後に、STEP 5の関数を組み合わせたメイン処理を作ります。送信の前に対象レコードを「送信中」へ更新することで、処理が途中で止まった場合の二重送信を防ぎます。この更新ではrevision(レコードのリビジョン番号)を指定しているため、取得した直後に担当者がレコードを編集していた場合は更新が失敗し、古い内容のまま送信されることもありません(次回の実行で最新の内容を取得し直します)。送信後の書き戻しに失敗した場合は「送信中」のまま残し、配信IDをログに出力します。
function sendPendingMails() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(1000)) return; // 前回の処理が実行中なら何もしない
try {
const records = fetchPendingRecords_();
if (records.length === 0) return;
// 1. 送信前に「送信中」へまとめて更新する(ここで失敗した場合は送信しない)
// revisionを指定し、取得後に担当者などが更新したレコードがあれば失敗させる
try {
updateRecords_(records.map((r) => ({
id: r.$id.value, revision: r.$revision.value,
record: { send_status: { value: '送信中' } },
})));
} catch (e) {
console.warn('送信中への更新に失敗したため、今回は送信しません(次回の実行で取得し直します)', e);
return;
}
// 2. 1件ずつ送信し、結果を配列にためる
const results = records.map((r) => {
const id = r.$id.value;
let result;
try {
const deliveryId = sendTransaction_(r.email.value, buildMail_(r));
result = { id, record: {
send_status: { value: '送信済み' },
delivery_id: { value: String(deliveryId) },
} };
} catch (e) {
result = { id, record: {
send_status: { value: '送信エラー' },
error_message: { value: String(e).slice(0, 1000) },
} };
}
Utilities.sleep(200); // APIの呼び出し間隔を空ける
return result;
});
// 3. 結果をまとめて書き戻す(失敗時は「送信中」のまま残し、ログで確認する)
try {
updateRecords_(results);
} catch (e) {
console.error('kintoneへの書き戻しに失敗しました', JSON.stringify(results), e);
}
} finally {
lock.releaseLock();
}
}GASエディタの「トリガー」から、sendPendingMailsを「時間主導型」で5分おきなどに実行するよう設定すれば完成です。kintone側で「送信待ち」にしたレコードが、数分以内に自動で送信され、配信IDが書き戻されます。1回の実行で処理するのは100件までのため、1万件の送信完了までは8時間程度かかります。急ぐ場合は、トリガーの間隔を短くしてください。
トリガーは作成したユーザーのアカウントで実行されます。担当者の異動や退職でアカウントが停止すると送信も止まるため、運用用のアカウントで作成しておくと安心です。
配信IDがkintoneに残るため、顧客から「メールが届いていない」と問い合わせを受けたときも、blastengineの管理画面で該当の配信ログをすぐに確認できます。
構成例:請求明細メールをkintone×blastengineで送る場合の設計パターン
ここでは、請求明細メールのような定型の通知メールを送る場合に、押さえておきたい設計の考え方を整理します。
GASで送信していた仕組みは、送信先の切り替えで活かせる
すでにGASからGoogleのメールサーバー経由で送信している場合、kintoneからデータを取得する処理や本文の組み立て処理は、そのまま活かせます。主な変更点は、MailAppによる送信をblastengine APIの呼び出しに切り替える部分です。
ゼロから作り直すのではなく、送信処理を段階的に置き換えられるため、移行の負担を抑えられます。
テンプレートはGAS、操作画面はkintone
定型の通知メールでは、次のような設計が開発量と運用負荷を小さくします。
- メール本文は、GAS内にテンプレートとして設定する
- kintone上には、送信操作や配信結果の確認を行う画面をJavaScriptで用意する
- 本文を自由に編集するメールエディタは設けず、文面はテンプレートで統一する
- kintone上の「一括送信」も、各レコードに対してトランザクション配信APIを順番に呼び出す方式にする
エディタを作り込まず、「テンプレート+トランザクション配信」に割り切ることで、文面のばらつきや誤記のリスクも抑えられます。
誤送信を防ぐテストの方法
テスト段階では、宛先をテスト用アドレスに差し替え、本文の末尾に「本来の送信先」を表示する仕組みを用意すると便利です。本番の顧客に誤送信するリスクを避けながら、実際の文面・送信元・添付ファイルで確認できます。
運用で失敗しないためのチェックポイント
仕組みが動いたあとも、安定して運用するためには押さえておきたい点があります。
APIのレートリミットとGASの実行時間を意識する
blastengine APIには、デフォルトで1分あたり500回のレートリミットがあります。トランザクション配信を1件ずつ呼び出す方式では、数千件を一気に送ろうとすると、この上限に達する可能性があります。
また、GASは1回の実行が最大6分で打ち切られます。サンプルコードのように1回の処理件数を100件程度に区切り、トリガーで繰り返し実行する設計にしておけば、どちらの制限にも余裕を持って収まります。blastengineのレートリミットの引き上げが必要な場合は、オプションで上限を緩和することも可能です。
GASには、このほかにも1日あたりの上限があります。Google Workspaceアカウントの場合、トリガーによる実行時間の合計は1日6時間、UrlFetchAppの呼び出しは1日100,000回までです(gmail.comなどの個人アカウントでは、それぞれ90分・20,000回)。1日に数万件を送る場合は、これらの上限も確認してください。
添付ファイルの容量と送信形式に注意する
請求書のPDFを添付して送る場合は、添付ファイルのサイズに注意してください。blastengine APIでは、デフォルトで添付ファイルの上限が1MBです。1MBを超える添付ファイルが発生する場合は、オプションで上限を引き上げられます。
また、添付ファイルを送る場合は、リクエストをmultipart/form-data形式に変更する必要があります。本記事のサンプルコードはJSON形式のため、そのままでは添付できません。詳細はAPIドキュメントを参照してください。
二重送信と送信漏れを防ぐステータス設計
請求明細の二重送信は、顧客の混乱やクレームに直結します。サンプルコードでは「送信待ち→送信中→送信済み」とステータスを順に進め、送信前に必ず「送信中」へ更新しています。
処理が途中で止まって「送信中」のまま残ったレコードは、自動で再送せず、担当者が配信ログで送信の有無を確認してから手動で戻す運用がおすすめです。自動再送よりも、確認してから戻すほうが二重送信のリスクを抑えられます。
エラーメールの扱いを決めておく
宛先のメールアドレスが存在しない場合などは、送信後にエラーメール(バウンスメール)として扱われます。blastengineではバウンスメールに自動で対応し、配信ログでエラーの内容を確認できます。
エラーになった顧客は、kintone側でメールアドレスの修正を依頼するフローを用意しておくと、翌月以降の送信漏れを防げます。
kintoneのメール配信を安定させるならblastengineを活用する
kintoneのデータを使ったメール送信は、GASを使えば比較的シンプルに作れます。しかし、送信件数が増えるほど、送信上限・エラーメールの処理・配信ログの管理といった「メール配信そのものの難しさ」が表に出てきます。こうした課題を、送信の仕組みを大きく変えずに解消できるのが、メール配信API「blastengine(ブラストエンジン)」です。
kintone×GASの課題をblastengineで解決できる理由
本記事で紹介した構成のように、データ管理はkintone、本文と送信処理はGAS、メール配信はblastengineと役割を分けると、それぞれの得意分野に集中できます。
- 1日1,500宛先の壁を越えられる:Googleアカウントの1日あたりの宛先数の上限に縛られず、請求明細のように月初に集中するメールも同じ日に送れる
- 送信基盤の運用を任せられる:送信IPの評価管理やエラーメール(バウンスメール)の処理をblastengine側で行うため、業務用のGoogleアカウントを大量送信に使わずに済む
- 配信ログで問い合わせに即答できる:配信IDをkintoneに書き戻しておけば、「いつ、誰に、何を送ったか」を管理画面ですぐに確認できる
すでにGASで送信の仕組みを持っている場合も、送信部分をblastengine APIに切り替えることで、既存の処理を活かしたまま始められます。
kintone連携で役立つblastengineの機能

blastengineは、開発者向けに特化した日本製のメール配信サービスです。kintoneとの連携では、次の機能が役立ちます。
- トランザクション配信と一斉配信のAPI:請求明細のように1件ごとに内容が異なるメールも、全員に同じ内容を送るお知らせも、同じサービスで送れる
- 各言語向けのSDK:GASやNode.js、Python、PHP、Ruby、Javaなど向けのSDKがGitHubで公開されており、実装の手間を減らせる
- SMTPリレーにも対応:GASからはAPI、既存の業務システムからはSMTPリレーと、システムに合わせて接続方法を選べる
- SPF/DKIM/DMARC対応:送信ドメイン認証に対応し、迷惑メール判定のリスクを低減
- バウンスメール自動対応:宛先不明などのエラーメールの管理を自動化し、運用負荷を削減
- 配信ログ管理:配信IDごとに送信結果を確認でき、問い合わせ対応がスムーズ
- 用途に合わせたオプション:APIのレートリミット緩和や添付ファイルの容量上限アップなど、送信件数や請求書PDFの添付にも対応できる
料金と無料トライアル
blastengineは初期費用無料で、月間1万通のプランを月額3,000円(税抜)から利用できます。上限を超えた分は1通あたり0.60円(税抜)の超過料金で送信でき、送信件数に合わせてプランを選べます(2026年10月時点)。
メールアドレスの入力だけで無料トライアルを始められ、トライアルでも月間10,000通まで配信できます(配信可能アドレスは5件まで)。まずは本記事のサンプルコードで、APIでのテスト送信から試してみてください。
ブラストエンジン公式サイト:https://blastengine.jp/
まとめ
kintoneには外部へメールを一斉配信する標準機能がないため、外部にメールを送るにはプラグインを導入するのが一般的です。一方で、自社の業務フローに合わせて作り込みたい場合や、すでにGASで業務を自動化している場合は、GASで送信の仕組みを自作する選択肢もあります。
ただし、送信件数が月数千件を超える場合、GASからの直接送信はGoogle Workspaceの1日1,500宛先という上限が大きな壁になります。kintoneをデータと操作画面、GASを本文と送信処理、blastengineをメール配信と役割分担すれば、既存の仕組みを大きく変えずに上限の問題を解消できます。
次にやるべきことは、次の4つです。
- プラグインで要件を満たせるか、自作が必要かを判断する
- 自社の月間送信件数と、送信が集中する日の最大件数を確認する
- blastengineの無料トライアルに申し込み、本記事のサンプルコードでテスト送信する
- 送信ドメインのSPF・DKIM・DMARC設定を、本番送信の前に済ませる
FAQ
- kintoneだけでメールの一斉配信はできますか?
- A:kintoneの標準機能には、顧客など外部のメールアドレスへメールを一斉配信する機能はありません。外部にメールを送るには、kintone向けのメール配信プラグインを導入するか、GASやメール配信APIと連携する仕組みを用意する必要があります。
- GASからのメール送信は1日何通まで送れますか?
- A:Google Workspaceアカウントでは1日あたり1,500宛先、gmail.comなどの個人アカウントでは1日100宛先が上限です(2026年10月時点)。上限は通数ではなく宛先数で数えられるため、CCやBCCに入れた宛先も消費します。試用期間中のWorkspaceアカウントなどでは、さらに低い上限が適用される場合があります。
- kintoneのJavaScriptから直接blastengine APIを呼び出せますか?
- A:トランザクション配信はPOSTだけで完結するため技術的には可能ですが、APIキーがブラウザ上で閲覧できる状態になるためおすすめしません。また、kintone.proxy()はPATCHメソッドに対応していないため、一斉配信の配信確定はkintone.proxy()経由では実行できません。GASなどを経由する構成が安全です。
- 請求書のPDFを添付して送れますか?
- A:トランザクション配信で添付ファイル付きのメールを送れます。添付ファイルを送る場合はリクエストをmultipart/form-data形式にする必要があります。デフォルトの添付ファイル上限は1MBで、1MBを超える場合はオプションで上限を引き上げられます。
- 月1万件程度の送信だと、blastengineの料金はいくらですか?
- A:blastengineは初期費用無料で、月間10,000通のプランは月額3,000円(税抜)です。上限を超えた分は1通あたり0.60円(税抜)の超過料金で送信できます(2026年10月時点)。
※kintoneはサイボウズ株式会社の登録商標です。Google Workspace、Gmail、Google Apps ScriptはGoogle LLCの商標です。
