Google Apps ScriptのMailApp.sendEmail()でメールを送信してもGmailの送信済みにメールが残らない時の対処方法です
送信したメールが残らない
Google Apps Scriptを使ってある作業を自動化する簡単なスクリプトを書いているのですが、メール送信する機能があり作業の完了内容を指定のメルアドへ送信し、送信済みメールを確認することで、その作業がどのように完了したかをチェックするなどを行っていました。
ある日、メール送信は問題なく正常に動作しているのに、送信済みメールボックス(in:sent)に送信したメールが残らない現象が発生しました。
メール送信はできているので作業の流れに問題は出ないのですが、送信済みメールで作業が完了したことやその内容などをチェックしていた(ログのように扱ってるかも・・)ので、送信済みメールが残らないことにけっこう戸惑いました。
少し時間をおいても送信済みメールは残ってなかったので、これは本当に動いてないなと思い調べ始めました。
グーグっても全くそれらしい情報がなく、日本では情報がなさそうなので、海外も含めて調べてみました。
GASについてはStackOverflowがメインのフォーラムになっているようで、GASに関する情報はいっぱいあるのですが、この件についての情報は全く見つかりませんでした。
MailApp.sendEmail()を見直す
メールは正常に送信されているので作業そのものに問題はないのですが、やはり送信済みメールが残らないのはいやなので、sendEmail()を見直すことにしました。
メール送信に使っているのはMailAppクラスのsendMail()です。MailAppクラスはメール送信だけを提供しているクラスで、数種類のsendMail()を使い分けていろんなメールを送信することができます。
このスクリプトでは以下の2種類を使っています。
sendMail(message);
sendMail(recipient, subject, body);
1つ目のsendMail(message);は、HTMLメールを送信しています。例えば以下のような感じです。
function send(){
var mail = '送信先メールアドレス';
var title = '件名';
var message = '<html><body>' + '<h1>メール見出し</h1>' + 'メール本文1<br>メール本文2';
MailApp.sendEmail({
to: mail,
subject: title,
htmlBody: message
});
}
2つ目のsendMail(recipient, subject, body);は、通常のテキストメールを送信しています。例えば以下のような感じです。
function send(){
var mail = '送信先メールアドレス';
var title = '件名';
var message = 'メール見出し\nメール本文1\nメール本文2';
MailApp.sendEmail(mail, title, message);
}
メールは正常に送信されているので、デバッグとは違った方法の解析となります。
とりあえず、この関数だけを抜き出して動作するかどうか確認するため、テストスクリプトを作成してみました。
そうすると、正常に動作し送信済みフォルダにメールも残っているではないですか。。
しかし、元の作業スクリプトを動作させると送信済みフォルダにメールは残りません。謎です・・
原因は見つけられそうにないので、’name’や’replyTo’のパラメータを足してみましたが、現象は変わりませんでした。
パラメータをいじったくらいではダメだったので、クラスを変えてみることにしました。
sendEmail()はMailApp以外にGmailAppクラスでも同じメソッドがあります。
GmailAppクラスはメール送信以外にも様々な機能を提供しています。
リファレンスではMailAppよりもsendMail()のバリエーションは少ないですが、上記2種類のメールであればGmailApp.sendEmail()でメールの送信ができます。
通常のテキストメールはクラス名をMailAppからGmailAppに変更するだけでsendMail()が使えます。
でも、HTMLメールはクラス名を変更するだけではsendMail()が使えません。
GmailAppクラスでHTMLメールを送信するには以下のようにします。
function send(){
var mail = '送信先メールアドレス';
var title = '件名';
var message = '<html><body>' + '<h1>メール見出し</h1>' + 'メール本文1<br>メール本文2';
GmailApp.sendEmail(
mail,
title,
'HTMLメール',{
htmlBody: message
});
}
4つ目の引数にオプションとしてHTMLメールの本文を指定します。
このとき、3つ目の引数の文字列は使われません。
これでそれぞれGmailAppクラスでメールが送信できるようになりました。
この方法に書き換えて送信してみると、送信済みフォルダにメールが残るではないですか!
まとめ
GASでメール送信するときはMailAppクラスよりもGmailAppクラスを使ってメール送信したほうが良さそうです。
同じような現象で困っている方がいれば参考にしてください。