Google Apps ScriptでHTMLメルマガ配信システムを作る

Google Apps Scriptを使って本格的な社内システムを作る登竜門となるのが、メールの配信。但し同一の内容ではなく、人に合わせて内容を差し替える必要があるケースが殆どです。

その場合、一個ずつ手動で作って送信はあまりにも非生産的。さらに素っ気ないテキストメールだと読み手に伝わらないので、HTMLメールで送りつけたい。こんなケースに使えるのが今回のHTMLメルマガ配信システム。但しあまりにも大量に送ると、MailAppの制限に引っかかってしまうので、そこを考慮して作る必要があります。

過去には同じような仕組みでレスポンシブなメールを送る仕組みを作ってます。

Google Apps Scriptでレスポンシブメールを送ってみた

今回使用するスプレッドシート

個人毎に1通づつ送るので、いわゆるbccにせずに送って情報漏えいであったり、間違った人の所へ別の人の内容を送るといった事が低減できるのが今回の仕組みです(但し、スプレッドシートに書き込む内容を間違えれば意味がないですが)

使い方

実行方法

スプレッドシートを開くと、メニューに「メルマガ」というものが表示されるので、スプレッドシートの所定の欄を入力してから、「メルマガ」-> 「一斉送信」を実行すると、送信確認が出ます。実行するとスプレッドシートの内容を差し込んだHTML形式のメールが送られる仕組みになっています。

一斉送信2は、createTemplateFromFileにて生成時に差し込みデータもつけて渡す場合の事例になります。どちらも同じ結果が得られます。

図:送信アラートが出るようになってます

制限

Google Apps Scriptに於いて、メール送信は結構厳しい送信制限が課せられています。

  • ドメイン内の場合は、2000通/1日まで。
  • 外部宛の場合は、1500通/1日まで。
  • メールの読み書きだけならば、50000回/1日まで。
  • メール本文のサイズは400KB/1通まで。
  • メールの添付ファイルは合計25MB/1通まで。
  • メールの添付ファイルは250個/1通まで。
  • メールの受信者は50宛先/1通まで。

以上のようになっています。また、表向き制限値が掛けられていませんが、一度に大量のメールを連続送信すると、429エラーなどが起きる可能性があります(UrlfechAppはそういった制限があるのは確認)。よって、1分間に3通程度になるように、1通送信毎にウェイトを入れておくと良いでしょう。

今回は1人ずつ送るので、メールの受信者制限に掛かることはありませんが、同一メールを送りつける場合には宛先を50個毎に区切って送る必要があるので、要注意です。

メール本文の改造

メール本文は今回はHTMLメールであるため、GASのコード内には存在しません。index.html内に構築していく必要があります。HTMLメールですので、CSSが使えたり、リンクを張ったり自在に作れる為、通常のメールを送るよりも遥かに広い表現力を実現できるのが今回の仕組みの魅力ですね。

今回は差し込みメールであるため、詳細な仕組みはソースコードの項目のHTML側コードを参照してください。body以下にメール本文、Head部分にCSSを記述したりします。JavaScriptは記述しても意味がない(ブロックされます)ので、本当にメールのテンプレート内での利用に限られます(テンプレート整形処理でjavascriptを使うことはあります)

図:body以下にメール本文をHTML形式で記述する

ソースコード

GAS側コード

  • 冒頭に1レコード分のデータを格納するためのグローバル変数mailarrを用意しておきます。HTML側から変数にアクセスするには、HTML側でスクリプトレットで変数を取ってくる関数をGASで用意しておくか?グローバル変数で入れておくか?また、createTemplateFromFileでHTML呼び出し時に同時に値を渡す必要があります。メール送信の関数内の変数を取り出しても、HTML側からは参照できません。
  • forループで取得したスプレッドシートのデータの内、1レコード分をmailarrに格納
  • createTemplateFromFileを使ってindex.htmlの内容を取得。この時、mailarrの内容が差し込まれて、結果のHTMLをgetContentで取得しています。
  • 送信時はMailAppを使いますが、htmlbodyに対して取得したHTMLを割り当てます。
  • 送信エラーなどの対処のために、エラートラップを用意してあります。
  • 実際にはスプレッドシート側に送信ステータスの列を用意して、送信完了したら送信済みが入るようにし、エラー時には未送信のものを継続して次回から送信するような仕組みを用意しておくとベターです。
  • また、返信されると困る場合には、noReplyオプション(Google Workspaceのみ利用可能)を付け加えたり、またreplyToオプションで返信先を自身ではなく別のメアド宛にしておくのも業務ではよく利用するテクニックです。

createTemplateFromFileで呼び出し時に同時に変数を渡す場合は以下のような感じで渡す事が可能です。HTML側は普通に<?=mailarr[0] ?>で渡された変数から取り出せます。

HTML側はこの変数を直接スクリプトレットで指定すれば取り出せます。

HTML側コード

  • createTemplateFromFileにて呼び出されてるので、GAS側の変数をスクリプトレットを使って参照が可能です
  • スクリプトレットを使って差し込みたい場所に変数を呼び出させて入れ込んでいます。

createTemplateFromFileやスクリプトレットについては、以前のエントリーで記述しているので、以下のリンク先を参照してみてください。

Google Apps Scriptでウェブアプリケーション作成入門

大量に送信したい場合には

本当のメルマガのように大量に送信したい場合には、Google Apps ScriptのMailAppで送るのは現実的ではないでしょう。あくまでも社内の少数のメンバーに対して通知で送る場合には非常に有効ですが、外部のメンバーに対して大量に送信したい場合には向いていません

Microsoft365のGraph APIを利用した場合には、10000通/1日くらい送信可能であったり、送信制限も緩やかであり、またUrlfetchAppは10万回/1日利用可能であるため、メール利用ならばMicrosoft365を別途用意しておくのも良いです(とはいえ、UrlfetchAppは10秒間に3回くらいしかアクセスできず、またGASは6分の制限があるのでちょっとね・・・・)。以下のリンク先では、GASからGraph APIのOutlookサービスでメールを送る仕組みを作っています(実際に自分も社内でNode.js + Graph APIでメール通知システムは作ってます)

また、同一内容で送りたい場合は、まぐまぐなどが昔から利用されていますね。但し、REST APIが用意されてるわけじゃないので、月額有料のメール配信システムを利用するほうがREST APIも使えるケースがあるので、そちらを利用したほうが良いかと。

Google Apps ScriptとMicrosoft Graph APIの連携 – Outlook編

関連リンク

Google Apps ScriptでHTMLメルマガ配信システムを作る” に対して3件のコメントがあります。

  1. sergi より:

    officeの杜さん、こんにちわ。

    sergiといいます。参考になる記事ありがとうございます。
    あの質問なのですが、今現在同じような方法でHTMLメールのメルマガをつくっておりまして、googleworkspaceを利用して他社さんに300通ぐらい送ろうと思ってるんですけど、
    Utilities.sleep(3000);はfor文の最後に使えば、連続でメールを送るに時間を置くことが可能になるということでしょうか?

    1. officeの杜 より:

      sergi様

      officeの杜管理人です。
      基本的にはforやwhile文の最後(1通送信後)にUtilities.sleepでウェイトが掛かるので、連続メールでGmailのリミットに引っかかることはないかと思います。
      この連続送信リミットは記載がなく、どれくらいウェイトを入れたらよいのか?は、わからないのですが経験上、UrlfetchAppでは、10秒間に3回以上だと引っかかったので、およそ3000で指定すると、回避出来るのではないかと思います。

      こちらのサイトでも同様の経験をされているようです。

      1. sergi より:

        久しぶりにこのサイトを検索したら返信があって感激しました。
        返答できず申し訳ございません。メルマガの送信をやってみたところ基本的に連続送信でウェイトをかけずとも問題が起こることはありませんでした。一通送るのに時間がかかってしまうのが原因。ただ、六分以上継続して処理が行えない、HTMLメールの場合は100件/一日しか送れないなど個人のアカウントでは、限界があるなと感じました。六分以上処理が行えない問題はgoogle work spaceでも同じのようですが、100件/一日に関しては改善されるようです。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください