From 4dac89e313c4046ce1810fe18c778236a041c422 Mon Sep 17 00:00:00 2001 From: sp-lab Date: Tue, 30 Jun 2026 08:14:34 +0000 Subject: [PATCH] =?UTF-8?q?fix(mailsync):=20impersonation=20=EB=B6=88?= =?UTF-8?q?=EA=B0=80=20=EB=A9=94=EC=9D=BC=EB=B0=95=EC=8A=A4=EB=8A=94=20?= =?UTF-8?q?=EC=8A=A4=ED=82=B5=20(=EB=8F=99=EA=B8=B0=ED=99=94=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=8B=A4=ED=8C=A8=20=EB=B0=A9=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 멤버 목록에 개인 Gmail(theorose49@gmail.com) 등 Workspace 도메인 밖 계정이 섞여 있으면 도메인 전체 위임 token 교환이 unauthorized_client로 실패하는데, 기존엔 이 한 계정 실패가 firstErr로 잡혀 프로젝트 전체 동기화가 오류로 마크됐다(나머지 멤버 메일은 정상 수집됐는데도). 이제 해당 메일박스만 로그 남기고 건너뛴다. Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/mailsync/mailsync.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/mailsync/mailsync.go b/internal/mailsync/mailsync.go index df857b2..9adffa1 100644 --- a/internal/mailsync/mailsync.go +++ b/internal/mailsync/mailsync.go @@ -163,6 +163,14 @@ func (s *Service) FetchForDomain(ctx context.Context, mailboxes []string, domain if box == "" { continue } + // 도메인 전체 위임은 이 서비스계정이 속한 Workspace 도메인 사용자만 impersonate 가능. + // 멤버 목록에 섞인 개인 Gmail(@gmail.com)이나 아직 프로비저닝 안 된 계정은 + // token 교환이 unauthorized_client로 실패한다. 그 메일박스만 건너뛰고, 프로젝트 + // 전체 동기화를 실패로 마크하지 않는다(나머지 멤버 메일은 정상 수집). + if _, err := s.accessToken(ctx, box); err != nil { + log.Printf("mailsync: 메일박스 %s 건너뜀 (impersonation 불가): %v", box, err) + continue + } pageToken := "" fetched := 0 for {