Go+GmailAPI로 서비스 계정에서 이메일 보내기

12401 단어 5GSuitegmail

소개



GO에서 GmailAPI에서 이메일을 보내려고 할 때,
서비스 계정을 사용하려고하면 단번에 정보가 없어져 고전했기 때문에 메모

하고 싶은 일


  • GSuite 도메인의 사용자가 보내는 메일 자동화
  • 사용자가 인증하지 않고 사용자의 주소에서 보낸 것처럼 보이기를 원합니다.

    좋은 것


  • 서비스 계정에 도메인 권한을 위임하자
  • 서비스 계정 클라이언트에게 GSuite 권한을 위임하자
  • JWT를 이용한 인증을 하자

  • 이번 샘플 리포지토리
    htps : // 기주 b. 코 m / 시로 33950 / 고센 dg 마이 l - mp ぇ

    서비스 계정이란?



    사용자가 조작하지 않고도 다양한 권한을 부여할 수 있는 계정
    htps : // c ぉ d. 오, ぇ. 코 m/아 m/도 cs/세 rゔぃ세 아코응 ts? hl = 그럼

    서비스 계정은 개별 최종 사용자가 아닌 애플리케이션 및 가상 머신(VM)에 속한 특수 Google 계정입니다.
    애플리케이션은 서비스 계정을 사용하여 사용자 참여 없이 Google 서비스 API를 호출할 수 있습니다.

    서비스 계정을 이용하면 다음과 같은 이점이 있습니다.
  • 사용자가 OAuth 인증을하지 않고 권한을 부여 할 수 있습니다
  • Token 끊김 등에 대해 걱정하지 마세요

  • 서비스 계정 생성


  • GCP에서 IAM 및 관리 -> 서비스 계정 -> 서비스 계정 만들기 및 이동
  • 서비스 계정 이름만 입력하고 다른 옵션은 기본적으로 생성
  • 지금 만든 서비스 계정의 상세 화면으로 이동
  • 'G Suite 도메인 전체 위임 사용' 확인
  • '키 만들기'에서 JOSN 키 만들기
  • 키가 생성되었는지 확인한 후 설정 저장

  • 서비스 계정에 권한 위임


  • GSuite에서 보안 -> 설정 -> 고급 설정 -> API 클라이언트 액세스 관리로 이동
  • 클라이언트 ID에 서비스 계정의 이메일 주소, 범위에 사용하려는 API의 범위를 기재하여 승인
    범위는 여기에 나열되어 있습니다.

  • 키를 이용한 인증



    방금 만든 JSON을 사용하여 인증
    GmailAPI 패키지 에서는 4종류 정도 인증 방법이 기재되어 있지만,
    이번에 하고 싶은 것은 어떤 방법도 잘 되지 않기 때문에, JWT를 이용한 인증을 한다
    import (
        "context"
        "golang.org/x/oauth2/google"
        "google.golang.org/api/gmail/v1"
        "google.golang.org/api/option"
        "io/ioutil"
        "log"
    )
    
    func createService() (service *gmail.Service, err error) {
        // サービスアカウント作成時にダウンロードしたJSONを読み込む
        json, err := ioutil.ReadFile("./credential.json")
        if err != nil {
            log.Printf("[ERROR] Failed to process read file: %s", err)
            return nil, err
        }
    
        // スコープはGSuiteで指定した物をそのまま記述する
        config, err := google.JWTConfigFromJSON(json, gmail.MailGoogleComScope)
        if err != nil {
            log.Printf("[ERROR] Failed to process get jwt config: %s", err)
            return nil, err
        }
        // 送信元のアドレスを指定
        // 別のアドレスを指定すると実行時エラーになる
        config.Subject = "[email protected]"
    
        ctx := context.Background()
        tokenSource := config.TokenSource(ctx)
        return gmail.NewService(ctx, option.WithTokenSource(tokenSource))
    }
    

    이메일 보내기


    import (
        "encoding/base64"
        "google.golang.org/api/gmail/v1"
        "log"
        "strings"
    )
    
    func sendMail() {
        // サービス作成
        service, err := createService()
        if err != nil {
            log.Printf("[ERROR] Failed to process create service: %s", err)
            return
        }
    
      // 本文を作成
      // FROMはSubjectに指定したアドレスか、そのアドレスが利用できるaliasを指定する
        temp := []byte("From: [email protected]\r\n" +
            "To: [email protected]\r\n" +
            "Subject: testSubject\r\n" +
            "\r\ntestBody")
        var message gmail.Message
        message.Raw = base64.StdEncoding.EncodeToString(temp)
        message.Raw = strings.Replace(message.Raw, "/", "_", -1)
        message.Raw = strings.Replace(message.Raw, "+", "-", -1)
        message.Raw = strings.Replace(message.Raw, "=", "", -1)
    
      // 送信
        _, err = service.Users.Messages.Send("me", &message).Do()
        if err != nil {
            log.Printf("[ERROR] Failed to process send message: %s", err)
            return
        }
    }
    

    참고



    htps : // 이 m / t하지만 3000 / ms / 3d210582bc7f1 또는 218cc
    htps: //아이 c. 오 rg/오오 gぇ. 미안해. 오 rg/아피/g마이 l/v1

    좋은 웹페이지 즐겨찾기