/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

GoogleAppsScriptを使ってGmailのラベルの付いたメールを取得する方法

f:id:yatta47:20210221101900p:plain

Slackに情報を集約しようとしているけど、まだ完全移行はできてないのが現状。

では何から離れられないか?というと、Gmail。基本メールで受信していたから、その部分を移行するのはなかなか難しい。ってことで、完全移行ではなくても、GmailGoogle Apps Scriptで操作して、Slackに自動投稿するようにしようかなと思ってGmail操作を調べてます。

 

やりたいこと

やりたいことは、

Gmailの特定のラベルが付いているもので未読のものを取得する

です。

最終的には、取得したものをSlackに投稿するつもりです。今回はメールを取得するところまで。

 

なぜにGoogleAppsScript?

まぁ・・・疑問に思いますよね。大きな理由は2つ。

Gmail連携が簡単

Gmailの外部APIがあるかどうかはちょっと調べていないのでわからないですが、とにかく簡単。他のでよくあるAPIキーがあるとかそういうのも一切なしに、直接使えるのがとても魅力的です。

cron機能がある!!

Google Apps Scriptは他でも色々と使っているのですが、一番のメリットはcronが使えることだと思います。1時間に1回とか、半日に一回とか。自動化するためには必須のcron機能がメチャメチャ簡単に使えるからこれを使わない手はないといった感じです。

それではやったことはこちら。

実際のコード

ほとんどピンポイントでやりたいことのコードを載せてくれているサイトさんがあったので、そのコピペになってしまってますww

function gmailLabelGet(){
  var start = 0;
  var count = 0;
  var max = 500;
  var hours = 1;
  var maillist = "";
  
  // searchのフィルター条件はGmailで検索する時と一緒
  var threads = GmailApp.search('label:ticket-cnplayguide.com is:unread', start, max);

  // 件数取得
  count = threads.length;
  
  // 現在の時刻取得
  var targetDate = new Date();
  targetDate.setHours(targetDate.getHours() - hours);
  
  // メッセージの中身を取得
  for (var i = 0; i < count; i++ ){
    var lastDate = threads[i].getLastMessageDate();
    
    var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate()
      + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds();
    
    Logger.log(datetime + " [" + threads[i].getFirstMessageSubject() + "]");
    Logger.log("Subject" + threads[i].getFirstMessageSubject() );
    
    // メッセージの詳細を取得する
    var message = threads[i].getMessages();
    
    for (var j = 0; j < message.length; j++){
      Logger.log("message.length :" + message.length);
      Logger.log("message :" + message[j].getBody());
    }    
  }
}

簡単に解説。

var threads = GmailApp.search('label:ticket-cnplayguide.com is:unread', start, max);

ここでフィルターを掛けたGmailThreadを取得。「label:ticket-cnplayguide.com is:unread」の部分は、”Ticketというラベルにネストされたcnplayguide.comというラベルの、未読のもの"という意味。この辺はGmailの検索と一緒です。

フォーマット的には「label: ラベル名」でOK。

時刻の部分とかは必須ではありません。この条件だけだと毎回取ってきちゃうから、メール受信日時でフィルターかけるのに使うつもりです。

メールの中身とかをとるには、GmailThreadからGmailMessageを取得する必要があります。

そのGmailMessageを取得しているのが以下の場所。

// メッセージの詳細を取得する
var message = threads[i].getMessages();

ここでメール単体の詳細を取得することが出来ます。messageはGmailMessageクラスになります。getBody()で本文が取れたりします。
ただ、改行とかスペースが文字コードに変換されていてなんか見づらい・・・・

使えるメソッドは以下のサイトに沢山乗っています。

Class GmailMessage  |  Apps Script  |  Google Developers

まとめ

これからこれを改造していって、Slackに情報を集約するのに使っていこうと思っています。普段良く使っている検索部分がそのまま考えとして使えるってのは非常に助かった。

Gmailを操作するに辺り、参考になった文言がこちら。

GmailAppからGmailThreadを取得し、そこから更にGmailMessageを取得する。そして必要に応じてそれぞれの情報を取り出して処理する。この3つのオブジェクトのつながりがわかれば、Gmailの利用はそれほど難しくはないことがわかるでしょう。 (引用元:Gmailにアクセスする(5/7):初心者のためのGoogle Apps Scriptプログラミング入門 - libro

これで一気に理解が深まった気がします。

 

参考にしたサイトはこちら

Google Apps Scriptで、ラベルがない未読メールを全て既読にする - Qiita

Gmailの受信トレイ、特定のラベル内のメールを条件を絞って自動削除する方法

Gmailにアクセスする(5/7):初心者のためのGoogle Apps Scriptプログラミング入門 - libro

[asin:B00RXWOZT0:detail]