Help us understand the problem. What is going on with this article?

GASでのメール送信についてまとめてみる

More than 3 years have passed since last update.

MailApp.sendEmailの種類

今回の内容はAPIドキュメントに記載されていますが、具体的な使い方などについて記述していきます。

GoogleAppsScriptからメールを送る場合、MailApp.sendEmailを使いますが、コードアシストを使うとsendEmailには4つのパターンが表示されます。
(一応GmailApp.sendEmailというのもありますが内容は同じです)

  1. sendEmail(message)
  2. sendEmail(recipient, subject, body)
  3. sendEmail(recipient, subject, body, options)
  4. sendEmail(to, replyTo, subject, body)

どれもメールを送信する関数ですが、1と3はオプションを使用してテキスト以外の要素を含んだメールを送信することが出来ます。
また、なぜか4だけ第1引数が"to"になっていますが、2と3の第1引数もrecipient(受信者)であり、意味は同じでこれがメールの宛先になります。

宛先の書き方

単一の宛先の場合、文字列でメールアドレスを記載します。

コード.gs
MailApp.sendEmail('hoge@gmail.com', '件名', '本文');

複数の宛先に送る場合、文字列の中でカンマで区切るか、宛先アドレスの配列を渡します。

コード.gs
// カンマで区切った複数宛先
var to1 = 'hoge@gmail.com,moge@gmail.com';
MailApp.sendEmail(to1, '件名', '本文');

// 複数宛先の配列
var to2 = ['hoge@gmail.com', 'moge@gmail.com'];
MailApp.sendEmail(to2, '件名', '本文');

この書き方はreplyToでも使用できます(返信先にも複数の宛先を指定できる)。
また、複数宛先のうち1つでもメールアドレスとして無効な文字列があると実行時エラーになり、誰にもメールは送信されません。

装飾文字列の送信

1と3のパターンではオプションを使用して文字を装飾したメールを送ることが出来ます。
方法は、オプションのオブジェクト内にhtmlBodyというプロパティを記述し、値にhtmlで記述した文字列を使用します。

htmlBodyを使用した場合、通常のbodyの内容は無視されます。
なので3の場合、第3引数の内容は一切無視されることになりますので基本的には1のやり方で使うことを推奨します。
htmlBodyを使用した場合、htmlが表示できない環境では通常のbodyの内容が表示されます。(ガラケーとか?)

コード.gs
// 1のやり方
  MailApp.sendEmail({
    to: 'hoge@gmail.com',
    subject: '件名',
    body: '普通のメール', 
    htmlBody: '<h1>装飾メール</h1>' 
  });

  // 3のやり方(第3引数の内容が無視されます)
  MailApp.sendEmail('hoge@gmail.com', '件名', '普通のメール', {htmlBody:  '<h1>装飾メール</h1>' });

htmlメッセージの記述の仕方

余談ですが、gsファイル内でhtml文字列を書くとごちゃごちゃになるので、htmlファイルに記述してそれを取得するやり方が楽かと思います。

ファイル→新規作成でhtmlファイルを作成し、文字列を記述します。

message.html
<h1>装飾メール</h1>

<b>装飾したメッセージを送ることが<br/>
できます。</b>

コード.gs
  var html = HtmlService.createHtmlOutputFromFile("message").getContent();

  // 1のやり方
  MailApp.sendEmail({
    to: 'hoge@gmail.com',
    subject: '件名',
    htmlBody: html
  });

インライン画像を表示する

メールの本文内に画像を表示することが出来ます。

表示する画像を取得する方法は、ウェブ上の画像を引っ張ってくるか、Googleドライブ上の画像を取得するかの2つになります。(他、ExternAPIで引数としてもらった場合も可能?)

htmlBodyを記述し、画像を表示するタグを埋め込みcidとinlineImagesのプロパティ名を一致させるとその画像が表示されます。
※cidとプロパティ名が一致しない画像は自動的に添付ファイル扱いになるようです。
cidは全角文字も使えるようです、一応。

コード.gs
  // ウェブ上の画像を取得する
  var image = UrlFetchApp.fetch('http://www.gochiusa.com/core_sys/images/contents/00000025/base/001.jpg');

  // Googleドライブ上の画像を取得する
  var driveImage = DriveApp.getFilesByName("bluemountain.jpg").next();

  // インライン画像を表示する
  MailApp.sendEmail({
    to: 'hoge@gmail.com',
    subject: '画像',
    htmlBody: '<img src="cid:千夜"><br/><img src="cid:青山">',
    inlineImages: {
    千夜: image.getBlob(),
    青山: driveImage.getBlob()
    }
  });

ファイルを添付する

添付ファイルをつけることが出来ます。
こちらもウェブ上から直接ファイルを取得するか、Googleドライブのファイルを取得するかになります。
添付ファイルを指定するときにsetName()でファイル名を指定しないと失敗します。

コード.gs
  // ウェブ上の画像を取得する
  var image = UrlFetchApp.fetch('http://www.gochiusa.com/core_sys/images/contents/00000025/base/001.jpg');

  // Googleドライブ上の画像を取得する
  var driveImage = DriveApp.getFilesByName("bluemountain.jpg").next();

  MailApp.sendEmail({
    to: 'hoge@gmail.com',
    subject: '添付',
    body: '添付ファイル',
    attachments: [image.getBlob().setName('宇治松千夜.jpg'), driveImage.getBlob().setName('青山ブルーマウンテン.jpg')]

  });

※Gmailの制限で、実行可能ファイルは送信できません。(setNameでファイル名の拡張子をjpgとかにすると、実行はされるが実際には添付されない)

ブロックされるファイル形式
https://support.google.com/mail/answer/6590?hl=ja

その他のオプション

上記で紹介した以外にも下記のようなオプションが利用可能です。

cc,bcc

cc,bccにアドレスを追加できます。追加方法は宛先と同じです。

name

メールの送信者名を変更することが出来ます。

noReply

trueにすると送信者がnoreply@example.comとなり、返信不可になります。
このプロパティはGoogleAppsアカウントでのみ有効です。

まとめ

Gmailで出来ることはAPIでも大体できます。
通常はテキストメールだけしか使わないことがほとんどだと思いますが、ユーザー部門から装飾したメールを毎週発信してほしいというような依頼があった時に調べたのでまとめておきます。

Reference

https://developers.google.com/apps-script/reference/mail/mail-app

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away