ご相談・お問い合わせ
サイトエンジン株式会社
平日 9:00-18:00

SendGridとGoogle Apps Scriptで大量のメールを送れるようにしてみた

2021.01.31
この記事の著者
小出 祐廉
小出 祐廉
記事一覧

以前、Google Apps scriptを使ってメールを送信する機能を実装したのですが、1日100件までしか送れないという制限に直面しました。この制限はGmailのメール送信機能によるものなので、メール送信機能だけ他のものに置き換えれば現状の機能を利用して送信数を増やすことができるのではないか考え、Sendgridを使ってメール送信機能を実装してみました。本記事ではSendgridの登録方法やAPIの取得などSendgrid自体の設定に関しては触れず実際の実装部分にフォーカスしています。

前提編

実現したい機能

  • Googleスプレッドシートから送信先の情報を取得する(実装済)
  • Googleドキュメントからメールの本文を取得する(実装済)
  • 取得した情報を元にSendGridを用いてメールを送信する(今回実装したい機能)

使用したツール等

  • Googleドキュメント
  • Googleスプレッドシート
  • Google Apps Script
  • SendGrid

準備編

SendGridへの登録

以下にいずれかのサイトから申し込みましょう。登録してから審査があるので2-3日かかる場合もあります。気長に待ちましょう。

ほとんどの海外発のサービスはオリジナルサイトで登録すると日本代理店を通すより安いことが多いのですが、Sendgridに限っては日本の代理店の条件がかなり良いので、日本の代理店経由で登録すると良いと思います(2020年1月31日現在)

日本代理店
無料プラン 12,000件/月
1900円のプラン 40,000件/月

オリジナル
無料プラン 6,000件/月  
25USD/月のプラン 30,000件/月

SendGridのAPIキーの取得

  1. SendGridダッシュボードの「API Keys」のページにアクセスしてCreate API Keyを選択します。
  2. APIキーのラベル名を入力します。名前はなんでもいいです。
  3. Full Accessの権限を選択します。
  4. 表示されるキーをどこかにメモっておいてください。一度しか表示されないので注意が必要です。

実装編

SendGridを使ってメールを送るテスト

SEND_GRID_ENDPOINT = "https://api.sendgrid.com/v3/mail/send";
SEND_GRID_API_KEY = "API KEY";

Const sendGridApi = (to, subject, from, from_name, body_text)=>{ 
  Const body = {
    "personalizations": [
      {
        "to": [
          {
            "email": to
          }
        ],
        "bcc":[
          {
            "email": from
          }
        ],
        "subject": subject
      }
    ],
    "from": {
      "email": from,
      "name" : from_name
    },
    "content": [
      {
        "type": "text/html",
        "value": body_text
      }
    ]
  }
  const payload = JSON.stringify (body);
  UrlFetchApp.fetch(SEND_GRID_ENDPOINT, {
    method: 'POST',
    headers: { "Content-Type": 'application/json',
             "Authorization": "Bearer "+SEND_GRID_API_KEY},
    payload: payload
  });
}

これでメールが送られるようになります。ただしこのままだとSendgrid経由と表示されるのでDNSの設定も行っておくと良いでしょう。

GoogleスプレッドシートとGoogleドキュメントからデータを取得して複数のメールを送る

以前のコード

function sendEmail(){

  const sheet = SpreadsheetApp.getActiveSheet(); //シートをアクティブにする
  const lastRow = sheet.getLastRow(); //最後の行が何行目かを取得
  
  const urlDocument = 'GoogleドキュメントのURLをいれる'; 
  const document = DocumentApp.openByUrl(urlDocument); //URLからドキュメントを取得
  const documentText = document.getBody().getText(); //ドキュメントからテキストデータ取得

  const subject = '件名をいれる'; //件名
   
  for(let i = 2; i <= lastRow; i++){

    const companyName = sheet.getRange(i, 1).getValue(); //1列目:会社名
    const lastName = sheet.getRange(i, 2).getValue(); //2列目:姓
    const firstName = sheet.getRange(i, 3).getValue(); //3列目:名
    const email = sheet.getRange(i, 4).getValue();  //4列目:メールアドレス
    
    const body = documentText
      .replace('{会社名}',companyName)
      .replace('{姓}',lastName)
      .replace('{名}',firstName);
    
    GmailApp.sendEmail(email, subject, body); ここを変える
  }
}

先ほど作成した関数を使って、赤い部分を以下に置き換えます。

const from = 送信者のアドレス ;
const from_name = 送信者名;
sendGridApi =(email, subject, from, from_name, body)

これでリストに対して一括メールを送信することができます。

まとめ

Googleの機能では1日100通のメール送信制限がありましたが、SendGridを使うことで月12,000通まで送れるようになりました。今回は送信を行うだけで実際に届いたか、開封されたかなどが分からないので送信したメールのステータスが分かる機能の実装が今後の課題です。

著者プロフィール
小出 祐廉
小出 祐廉

ライターとの原稿のやり取りを支える、サイトエンジン独自のライティング管理システムの開発、運用を担当。効率的なライティングや各種業務を行うための機能改善の他、サービスサイトや自社サイトの管理、運用も行っている。

page top