Gg / 透過LINE Notify推播Gmail特定的未讀信件通知

嘗試將Gmail裡特定的未讀信件透過LINE Notify來推播

程式可以分為2個部分

第1個部分是LINE Notify推播

除了Token之外,基本上這個程式是可以共用的

必須要留意的部分是“Bearer “,r後面有1個空格

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function send_line(gm) {
 var lineToken ='**********************************************';
 var payload = { 'message': gm };
 var options = {
   "method": "post",
   "payload": payload,
   "headers": { "Authorization": "Bearer " + lineToken }
 };
 UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
}

 

第2個部分就是串接Gmai

由於是透過Google Apps Script串接Gmail資料,因此直接使用內建的函式庫即可

主要流程是將搜尋的關鍵字串,例如:關鍵字、標籤、已讀、未讀、時間範圍等等,

透過GmailApp.search()傳入

如果有相對應的結果,會回傳GmailThread[]資料

每個Thread都是1個信件( GmailMessage[])組合

可以用GmailApp.getMessagesForThreads()取出其中所有的Message

又,因為未讀信件是最新/最後的一筆資料

因此透過slice(-1)[0]取得

(備註:slice()取得的是陣列資料,因為也只有一筆,所以用[0]取出)

特定的Message,可以用getPlainBody()取得信件內容、getSubject()取得信件主旨

其他的內容可以參考Class GmailMessage的說明

其中必須要注意的是搜尋字串內的時間範圍

如果用文字格式,例如:2021/11/2,最小單位就只能指定到「日」

如果用 UNIX epoch time格式,就可以指定到「時分秒」的時間範圍

UNIX epoch time是自 1970/01/01 以来的秒數

getTime()取得的是自 1970/01/01 以来的毫秒數

所以在程式碼必須進行轉換

備註:傳入的UNIX epoch time必須是整數值,所以毫秒數/1000之後,必須用Math.floor()取得小於給定數值的最大整數值

以下是不同時間格式的程式碼

版本1-時間範圍 年/月/日

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function time_termBy_day() {

  var now_time = new Date().getTime();                  //getTime()取得的是自 1970/01/01 以来的毫秒數
  Logger.log(new Date(now_time));
  var time_term = now_time - ( 1000 * 60 * 60 * 24 * 3 ); //間隔3天
  //var time_term = now_time - ( 60*1000*60*3 );
  Logger.log(new Date(time_term));
  
  var yyyy = new Date(time_term).getFullYear();
  var mm = new Date(time_term).getMonth()+1;
  var dd =new Date(time_term).getDay();
  var afterTime =yyyy+'/'+ mm +'/'+ dd;
  
  var strTerms = '(is:unread '+words+' after:'+afterTime+')' ;
  Logger.log(strTerms);
  
  var myThreads = GmailApp.search(strTerms);
  //Logger.log(myThreads);
  
  if(myThreads.length !== ''){
    var myMsgs = GmailApp.getMessagesForThreads(myThreads);

    for (var i = 0; i < myMsgs.length; i++) {
      Logger.log(myMsgs[i].length);
      Logger.log(myMsgs[i].slice(-1).length);
      Logger.log(myMsgs[i].slice(-1)[0].getPlainBody());
      Logger.log(myMsgs[i].slice(-1)[0].getSubject());
      
      //執行send_line()
      send_line('\n'+myMsgs[i].slice(-1)[0].getSubject());
      //send_line('\n\n'+myMsgs[i].slice(-1)[0].getPlainBody());    
      //for(var j = 0; j < myMsgs[i].length; j++){
        //Logger.log(myMsgs[i][j].getPlainBody());
      //}
    }
  } 

}

 

版本2-時間範圍 UNIX epoch time格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function time_termBy_millisecond() {

  var now_time = new Date().getTime();            //getTime()取得的是自 1970/01/01 以来的毫秒數
  Logger.log(now_time);
  var time_term = now_time - ( 1000*60*60*5 ); //間隔5小時=5*60分鐘*60秒*1000毫秒
  Logger.log(time_term);
      
  var strTerms = '(is:unread '+words+' after:'+ Math.floor(time_term / 1000) +')' ;
  Logger.log(strTerms);
  
  var myThreads = GmailApp.search(strTerms);
 
  var myMsgs = GmailApp.getMessagesForThreads(myThreads);

  for (var i = 0; i < myMsgs.length; i++) {
    Logger.log(myMsgs[i].length);
    Logger.log(myMsgs[i].slice(-1)[0].getPlainBody());
    Logger.log(myMsgs[i].slice(-1)[0].getSubject());
    
    //執行send_line()
    send_line('\n'+myMsgs[i].slice(-1)[0].getSubject());
    //for(var j = 0; j < myMsgs[i].length; j++){
      //Logger.log(myMsgs[i][j].getPlainBody());
    //}
  }
}

 

版本3-時間範圍 UNIX epoch time格式,外部程式處理UNIX epoch time

使用setHours(hoursValue, minutesValue, secondsValue) 設定UNIX epoch time的時 分 秒

再將新的時間傳入外部程序secondsSinceEpoch轉換成UNIX epoch time格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//-----------------------------------------------------------------------------外部程序處理UNIX epoch time時間
function secondsSinceEpoch(date){
  return Math.floor(date.getTime() / 1000);                                    //getTime()取得的是自 1970/01/01 以来的毫秒數
}

function time_termBy_millisecond_2() {

  var before = new Date();
  var before_hh = before.getHours();
  var before_mm =  before.getMinutes();
  var before_ss = before.getSeconds();

  var after =new Date();
  after.setHours(before_hh-10, before_mm, before_ss, 0);  //間隔10小時
 
  var strTerms = '(is:read '+words+' after:'+secondsSinceEpoch(after)+')' ; //執行外部程序 secondsSinceEpoch 處理UNIX epoch time時間
  Logger.log(strTerms);
  
  var myThreads = GmailApp.search(strTerms);
 
  var myMsgs = GmailApp.getMessagesForThreads(myThreads);

  for (var i = 0; i < myMsgs.length; i++) {
    Logger.log(myMsgs[i].length);
    Logger.log(myMsgs[i].slice(-1)[0].getPlainBody());
    Logger.log(myMsgs[i].slice(-1)[0].getSubject());
    
    //執行send_line()
    send_line('\n'+myMsgs[i].slice(-1)[0].getSubject());    
    //for(var j = 0; j < myMsgs[i].length; j++){
      //Logger.log(myMsgs[i][j].getPlainBody());
    //}
  }
}

 

程式完成之後,接下來就是依據時間設定自動觸發

 

參考資料

LINE BOT實用教學|用LINE接收GMAIL通知

How to Search Emails in Gmail by Specific Time