GAS에서 Gmail에서 수신하는 특정 이메일을 LINE으로 보내기

이 기사는 마이 네비게이션 Advent Calendar 2019 23일째 기사입니다.

목적



Gmail에서받은 중요한 이메일
Google Apps Script(GAS)와 LINE의 Messaging API를 사용하여 LINE에 알리도록 하는 것입니다.

계기



Gmail 수신 메일 중에서 빨리 알고 싶은 메일이 있습니다 (이번 예에서는 화재시 알림 메일)
LINE에 통지를 받게 하면, 편리하다고 느끼 작성했습니다.

개발



개발 공정으로 크게 나누어
  • LINE측 설정
  • GAS 개발
  • 프로덕션 도입 (트리거 설정)

  • 가 있으므로 각각 설명하겠습니다.

    LINE측 설정



    서버에서 LINE으로 메시지를 보내려면 Messaging API이 필요합니다.

    Messaging API로 할 수 있는 것은 두 가지가 있습니다.
  • 푸시 메시지 보내기
  • 응답 메시지 보내기 ※대화 bot 등 만들 경우 필요

  • 프리 플랜에서는 2019/12 시점에서 1월 1,000통까지 송신 가능합니다.
    htps //w w.ぃねび… 이 m/ぃねあt_みgらちおん/

    이번에는 푸시 메시지를 보내는 방법에 대해 설명합니다.

    아래에 따라 등록합니다. ※LINE Developer 계정이 없는 경우는 계정 등록에서
    ぇぺぺrs. 네. 비 · 자 / 도 cs / 메사 긴 g 아피

    공급자 만들기



    LINE Developer에 로그인, 아래 순서대로 등록합니다.
  • 사이드 메뉴 공급자를 클릭
  • 만들기를 클릭
  • 프로바이더명을 입력
    ※ 앱을 제공하는 회사, 고객, 브랜드 또는 기타 조직의 이름이 적절합니다
  • 만들기를 클릭

  • 채널 만들기



    만든 공급자의 채널 설정 탭에서 Messaging API를 클릭하고,
    아래가 필수이므로 임의의 것을 입력합니다.
  • 채널 이름
  • 채널 설명
  • 대업종
  • 소업종
  • 이메일 주소

  • 약관에 동의하고 만들기를 클릭하면 채널이 만들어집니다.

    사용자 ID, 액세스 토큰 발급



    푸시 메시지를 보내려면 채널의 사용자 ID, 액세스 토큰이 필요합니다.
    유저 ID는 채널 작성시에 부여되고 있으므로, 액세스 토큰의 발행을 여기에서 실시합니다.

    방금 만든 채널 중에서 Messaging API 설정의 탭을 클릭하십시오.
    맨 아래 채널 액세스 토큰 발행을 클릭하면 발행됩니다.

    GAS 개발



    notification.js
    function main() {
      const gmailSearchString = "[email protected]"; //Gmailで検索する際の文字列を入れる
    
      //メール内容を取得
      const threads = GmailApp.search(gmailSearchString, 0, 1); //最新の一件
      const latestMail = GmailApp.getMessagesForThreads(threads)[0][0];
    
      const mailBody = latestMail.getPlainBody(); //メール本文
      const mailId = latestMail.getId(); //メールID
    
      // シートに同じメールがある場合は処理終わり
      if(isExistMailInSheet(mailId)){
        return;
      }
    
      const response = LINEMessagingApiPush(mailBody);
      //response.getContentText("UTF-8"); //デバッグ用、正常なら空の配列が返る
    
      writeMailInSheet(latestMail);
    }
    
    // シートにメールが存在するか
    function isExistMailInSheet(mailId){
      const sqlTarget = SpreadSheetsSQL.open("(SpreadSheetのID)", "SpreadSheetのシート名");
      const data = sqlTarget.select(["メールID"]).filter('メールID = ' + mailId).result();
    
      if(data.length >= 1){
        return true;
      }
    
      return false;
    }
    
    // シートにデータの書き込み
    function writeMailInSheet(mail){
      const sheet = SpreadsheetApp.getActive().getSheetByName("火災メール一覧");
      sheet.insertRowAfter(1); //空行の差し込み
    
      sheet.getRange("A2").setValue(mail.getId()); //メールID
      sheet.getRange("B2").setValue(mail.getDate()); //送信日時
      sheet.getRange("C2").setValue(mail.getPlainBody()); //メール本文
    }
    
    //LINE通知
    function LINEMessagingApiPush(text) {
      const accessToken = "(LINE DevelopersのChannel Access Token)"
      const to = "(LINE DevelopersのuserID)"
    
      const url = "https://api.line.me/v2/bot/message/push";
      const headers = {
        "Content-Type" : "application/json; charset=UTF-8",
        'Authorization': 'Bearer ' + accessToken,
      };
    
      const postData = {
        "to" : to,
        "messages" : [
          {
            'type':'text',
            'text':text,
          }
        ]
      };
    
      const options = {
        "method" : "post",
        "headers" : headers,
        "payload" : JSON.stringify(postData)
      };
    
      return UrlFetchApp.fetch(url, options);
    }
    

    처리 내용
  • 검색 조건에 맞는 메일 1개 가져오기
  • 과거에 전송 된 경우 처리 종료
  • LINE에 push 보내기
  • 스프레드 시트에 전송 데이터 쓰기

  • 이번 스프레드시트를 DB로 취급하여 과거에 전송된 것의 관리를 실시했습니다.
    2. 중복 체크에 대해 SpreadSheetSQL 라이브러리를 사용했습니다.

    참고로 한 기사 :
    htps : // 코 m / 카지노 후 / ms / 1 8 8 d4 굳 bfb5c3c886db
    htps : // 코 m / 로아나 0229 / ms / 후아 931f 또는 bc57f193620
    htps : // 코 m / n_ 오시미 / ms / 아 1 아 02 03093825 f41 01

    프로덕션 도입(트리거 설정)



    GAS의 트리거는 가능한 한 실시간으로 설정하고 싶기 때문에, 1분 간격으로 설정했습니다.

    이렇게 짧은 간격으로 설정할 수 있는 GAS 대단하다.

    결과



    LINE Developer 채널의 Messaging API 설정에 있는 QR 코드에서
    친구를 등록하고 GAS를 이동합니다.


    이것으로 현장으로 빨리 갈 수 있을거야…
    불의 근원에는 조심하십시오.

    좋은 웹페이지 즐겨찾기