Google Apps Scriptでメールを送信する - MailApp編【GAS】

2021年4月、新年度に入りこれまでどちらかというと中級編以上を取り上げてきましたが、Google Apps Scriptの入門編記事もいくつかつくってみようと思い、その中でもよく利用されるメール操作系を作ってみました。

今回はメール操作なので、送信やGMail自体の操作を中心にこれまでに自分がよく使ったものを中心に記述しています。

※以下、Google Workspaceについては、GWと省略

今回使用するサンプルや資料

はじめてGASに触れる人は、サンプルのスプレッドシートをコピーしてから、「ツール」→「スクリプトエディタ」で開いて編集をするようにしましょう。

また、Fromを書き換えての送信はGmailAppの側で対応してるのでそちらを利用するようにしましょう(但し、そのための手順というものが存在します)。

グループアドレスのメアドでGoogle Apps Scriptからメールを送る手法【GAS】

制限について

Google Apps Scriptは、様々なサービスを簡単に扱えますが、他のウェブサービス同様に実行には一定の制限があります。これは使いすぎや一部の人によってサービスを占有されるのを防ぐ為の処置であるので、回避は出来ません(上位のサービスを契約すれば緩和されたりはします)

今回のGASでのメールの操作に関しては以下のような制限が存在しますので、コードを記述する場合には意識して書く必要があります(GWアカウントについて記載)

  • メールの送信制限 - GWアカウントの場合2000通/1日
  • 宛先数制限 - GWアカウントの場合10000/1日(外部宛は3000/1日)
  • メールの読み書き - GWアカウントの場合、50000件/1日
  • 添付ファイルサイズ - GWアカウントの場合、1件あたり25MBまで
  • 本文のサイズ - GWアカウントの場合、1件あたり400KBまで

メルマガなどで大量のメールを送ったりなどは、この制限に引っかかる可能性が高いです。また、添付ファイルのサイズなども引っかかる可能性が高い為、それらの目的で超えそうなケースは専用のアプリや外部サービスなどを利用すべきだと思います。

MailAppを使用する

MailAppはメールの送信だけ行えるもっとも基本的な機能です。Google Apps Scriptに触る上では最も基本中の基本になると思います。後述のGmailAppは送信だけでなくメールの中身を拾ったりできますが、通常はこのMailAppだけ扱えれば十分業務の自動化を実現可能です。

普通に送信してみる

普通にメール送信をするケース。もっとも基本的なものになります。しかし、基本が故に結構抑えるポイントは豊富にあります。以下のソースコードが基本になります。

  • メール本文はBody変数に分けるのは、本文ゆえ長い文章になるので、別に切り分けておくのが定石です。
  • メール本文内での改行は、バックスラッシュにnであるエスケープシーケンスを使う事で改行になります。
  • もちろん、自分で作った関数などの返り値を本文等に含めることも可能です。
  • MailApp.sendEmailで送信を行います。
  • MailAppの中身は、toは必須。ccとbccは省略可能です。
  • 送信先を複数設定したい場合には、""で囲った中で、カンマ区切りで複数設定すればOK
  • subjectでメールタイトル。nameは省略すると既定の自分の名前が使われます。

このコードで送ると以下の図のような形で届きます。

図:これがもっとも基本的な送信方法

HTMLメールで装飾

前述のメールはテキスト形式のメールであるため、文字の装飾などは出来ません。現代のメールはHTML形式で使われるのが標準となっているので、このままでは、無味乾燥なメールとなります。そこでHTMLを使えるようにすると、文字の装飾が出来たり、より複雑なレスポンシブなメールを作るときには必須のオプションとなります。

  • Body本文内で、基本的なHTMLタグが利用可能です(何でも使えるわけではありません)
  • 改行等は<br>タグなどで実現します。
  • MailApp.sendEmailにてbodyではなく、htmlBodyをオプション指定に加える

このコードで送ると以下の図のようになります。また、応用をするとモバイルとPCとでメールの表示パターンを変えるレスポンシブメールも作ることが可能で、その際もhtmlBodyである必要があります。

図:文字の装飾がされ改行も自由自在

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

添付ファイルをつける

請求書などを生成後、PDF化してメールに添付して送るといったパターンは、ホワイトカラーの現場では非常に多いケースです。この添付ファイルもGoogle Apps Scriptで自動化して送ることが可能です。但し、Gmailはセキュリティ上添付できないファイル形式がありますので、注意は必要です(exeやzipなどが添付できません)

  • 今回、複数添付の部分を見越してコードを記述しています(コメントアウトさせてあります)
  • attach1変数に、Googleドライブ上の画像やPDFファイルのファイルIDを入れておきます。
  • DriveAppのgetFileByIdにてattach1を指定して、Blob形式で取得させます。
  • MailApp.sendEmailにてattachmentオプションを追加。Blob形式で取得したblob変数を指定する
  • 複数の添付ファイルを付けたい場合には、attach2とblob2で追加取得させて、attachmentオプションでは、配列の形式でblobとblob2を指定してあげる

図:test2.pdfを添付してみた

インラインイメージ

前述では画像類などを添付ファイルとして付けましたが、そうではなくメール本文内に画像を埋め込みたい事があります。ちょっと複雑ですが、2つのオプションをよく見てhtmlBodyを構築する必要があります。

  • inlineimage変数に、Googleドライブ上の画像やPDFファイルのファイルIDを入れておきます。
  • DriveAppのgetFileByIdにてinlineimage変数を指定して、Blob形式で取得させます。
  • img srcの指定ですが、メール本文内で、srcとしてcid:名前を指定する。今回はsirakawaという名前を使いました。
  • 新たにinlineImagesオプションをMailApp.sendEmailに追加し、cidの名前と取得した画像のblobを指定します。

このコードで送ると、以下のように本文内で画像が展開されます。あまり使う機会は少ないと思いますが、例えばグラフを生成して表示させるといったケースで使えます。

図:本文内に画像を表示したい場合に使う

noReplyメール

GWアカウントでのみ使えるオプションで、よく外部サービスなどでも通知系のメールで使われてる返信先指定のないメールです。受信者に本メールに返信してほしくない場合に使います。この場合、送信元はnoreply@指定ドメインになります

  • MailApp.sendEmailにnoReplyオプションを追加し、trueを指定するだけ

これで送信すると以下の図のようになります。送信元メアドは表示されないので、返信が出来ません。

図:noreplyなので返信出来ません

返信先指定

通常は、メールの返信は送信元のFromで指定されてるメアドに対して行います。メールで返信時も自動でこの値を使ってToに入るようになっていますが、送信元に返信されてはちょっと困るケースで使うのが、返信先指定です。このオプションを使うことで、返信をクリックした時に、別の返信先のメアドが入るようになり、送信元ではない場所へ、受信者が意識せずに返信が可能です。

  • MailApp.sendEmailに新たにreplayToオプションを追加し、返信先メアドを指定するだけ

見た目は通常のメールなのですが、返信をクリックすると、指定したメアドで新規メールが作られます。

図:返信先が追加され、Fromではないメアドが入ってる

メールがブロックされるケース

稀にMailAppからメールを送信する場合に於いて、相手先メールサーバからメールをブロックされることがあります。自分が遭遇したケースでは、GASのWebアプリのURLを貼り付けて送ったらブロックされてしまい、送れなかったことがあります(通常のメールはきちんと送れる)。

この場合解決法はMailAppを使うのではなく、GmailAppを利用して送信すると送れる場合があります。

図:ブロックされた事例

環境依存文字の文字化け

絵文字や漢字の特殊な文字(𠮷といった文字)などについて、Unicodeでも特殊な扱いになってる文字については、GmailApp.sendEmailで送信をすると�で表示され文字化けします。このメソッドが対応していないようです。送りたい場合はbase64でエンコードしてあげなければならない模様。

しかし、MailAppでの送信についてはこの問題が起きない為、こういった文字が入る場合には自前でエンコードするか?MailAppを使って送信するようにしましょう。

図:GmailAppだと文字化けする

関連リンク

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)