【GAS】メール送信で「無効な引数です」が出てハマったのでメモする

TL;DR

  • スプレッドシートを編集した際、スプレッドシートを編集した人のアドレスを送信元としてメールを送ろうとしたができなかった。
  • MailAppとGmailAppではoptionとして指定可能なものが違う。

状況

承認を管理するスプレッドシートがあり、承認されるとGAS経由でメールを規定の人に送信するように開発をした。
送信元がスクリプトオーナー(私)に固定されていたので、事務的なメールを開発部署の私が各営業部署にホイホイ通達する状況が発生。(開発中は気づかなかった)
ここで私、何を考えたか 送信元をシートの編集者にすればいいのでは?:thinking:と発想する。(前提が既に間違っている)

元のコード

宛先やタイトルは「mailSetting」に既に設定済とする
mailSetting.from = Session.getActiveUser().getEmail();
MailApp.sendEmail(mailSetting); //送信元は私のまま

動かない…!!

そもそも間違っている点としてはMailAppを使用している点で、fromを指定するためにはGmailAppを使わないといけない。
以下のように書き換え。
mailSetting.from = Session.getActiveUser().getEmail(); //別の人に操作してもらってテスト
GmailApp.sendEmail("宛先", "件名", "内容", {from : mailSetting.from}); //Exception:無効な引数です

まだ動かない…!!!

「無効な引数です」は、例えばJavaなどでよく見る「この変数の型を間違えている」ということではなく、「このアドレスがメールの送信元として使えない」ということが正しい。
詳しくはこの記事に載っていたのだけど、ようは「メールの送信元は前提としてスクリプトオーナーが基準」であり、「そこから参照として正しく設定したメールアドレスのみが送信元として使用可能」なのだ、ということでした。
私は「スクリプトオーナーが基準である」を、「実行者が基準である」と勘違いしていたので長いことハマってしまった……。
結局私のアカウントに連絡用のメーリングリストをエイリアス設定して、以下の感じになった。

var alia = GmailApp.getAliases(); //スクリプトオーナーのアカウントのエイリアスされたアドレスが載っている配列
GmailApp.sendEmail("宛先", "件名", "内容", {from : alia[0]}); //Successfully sent!!!

モヤ

docsを読んでもなぜMailAppとGmailAppのメール送信の仕方や引数、取りえるオプションに違いがあるのかは分からなかった……。
「メールを送る」という観点だけで考えれば同じような気がするんだけど、セキュリティ的な理由なんだろうか :thinking:
GASプロがいたら教えてほしい。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.