아침 첫 이메일, 전부 읽기 너무 힘들지 않으신가요
출근해서 (혹은 PC를 켜고), 우선 읽지 않은 이메일 더미를 위에서부터 순서대로 열어 나간다.
다 읽고 나면 30분이 지나 있고, 정작 중요한 업무는 아직 시작도 하지 않은 상태——.
이것은 요컨대 「매일 아침, 모르는 봉투를 100통 열어서 내용을 대충 훑어보는 역할」을 스스로 하고 있는 상태입니다. 본래 이 역할은 유능한 비서가 있다면 "오늘의 중요한 메일은 이 3건입니다, 요점은 이렇습니다"라고 전달해 주어야 합니다.
이 기사에서는 그 「비서」를 직접 고용하겠습니다. 고용할 대상은 두 명입니다.
Google Apps Script (GAS): Google 안에 살고 있는, 무료로 고용할 수 있는 작은 로봇 -
Gemini API: 문장을 읽고 요약해 주는, 똑똑한 파트너
이 두 명을 조합하여, 「매일 아침 7시, 읽지 않은 메일을 읽고 3줄로 요약하여 자신에게 정리해서 보내기」를 자동화합니다. 서버도 앱 설치도 필요 없습니다. 브라우저만으로 완결됩니다.
전체상을 「회사의 아침 조회」에 비유하면
구조를 회사의 아침 조회에 비유하면 등장인물은 다음과 같습니다.
GmailApp: 메일함 담당자. "읽지 않은 메일을 가져와"라고 하면 가져옴 -
Gemini: 요약 담당. 전달받은 문장을 "3줄로"라고 부탁하면 돌려줌 -
GAS 본체: 진행자. 담당자로부터 원고를 받아 요약 담당에게 전달하고, 완성본을 자신에게 보냄 -
트리거 (Trigger): 알람 시계. 매일 아침 정해진 시간에 "아침 조회 시작"이라며 진행자를 깨움
즉 해야 할 일은 진행자 (GAS)의 대본을 쓰고, 알람 시계 (트리거)를 설정하는 것뿐입니다. 어려워 보이지만 대본은 40줄 정도입니다.
준비 1: Gemini API 키를 무료로 받기
Google AI Studio에 Google 계정으로 로그인하여 「Create API key (API 키 생성)」를 누르면, AIza...로 시작하는 문자열을 받을 수 있습니다. 이것이 Gemini를 호출할 때의 「암호」입니다.
무료 할당량(Free tier)이 마련되어 있으므로 개인적으로 테스트하는 범위라면 기본적으로 돈이 들지 않습니다. 단, 무료 할당량의 요청 제한이나 요금은 개정될 수 있으므로 정확한 수치는 반드시 공식 요금 페이지에서 확인하십시오 (본 기사 작성 시점의 구체적인 단가는 확인 필요).
준비 2: GAS 프로젝트 만들기
script.google.com을 열고 「새 프로젝트」를 클릭합니다. 이것만으로 코드를 작성하고 실행할 수 있는 화면이 나타납니다. 설치는 아무것도 필요 없습니다.
다음으로 받은 API 키를 안전한 금고에 보관합니다. 왼쪽 메뉴의 톱니바퀴 (프로젝트 설정) → 「스크립트 속성 (Script Properties)」 → 「속성 추가」에서,
를 입력하고 저장합니다. 이렇게 하면 코드 본문에 키를 직접 쓰지 않아도 됩니다.
최소 작동 예시: 우선 Gemini가 한마디 하게 만들기
갑자기 전부 만들면 어디서 실패했는지 알 수 없게 됩니다. 우선은 「Gemini가 응답하는가」만을 확인하는 최소한의 코드부터 시작합니다. 에디터에 다음을 붙여넣으세요.
function callGemini(prompt) {
// 금고 (스크립트 속성)에서 API 키를 가져옴
const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
...
한 줄씩 요점을 보충하겠습니다.
PropertiesService...getProperty('GEMINI_API_KEY'): 금고에서 키를 꺼냄. 코드에 직접 쓰지 않기 위한 장치 -
url: Gemini의 창구. gemini-1.5-flash가 2024년 기준 현행 모델 (공식 퀵스타트에서 확인) -
payload: 보낼 문장을 Gemini가 받을 수 있는 「상자 형태」로 다시 담는 과정 -
UrlFetchApp.fetch: GAS에서 인터넷으로 편지를 보내는 명령. 이것이 GAS의 심장부 -
json.candidates[0]...: 응답은 중첩(nest) 구조가 깊음. candidates (후보)의 0번째 안에 있는 본문을 추출함
함수를 test로 전환하고 「실행」을 누르면, 처음 한 번만 Google 권한 확인 창이 뜹니다. 이것은 「이 스크립트가 인터넷에 접속하거나 Gmail을 만져도 되는지」에 대한 허가입니다. 허가했을 때 실행 로그에 「안녕하세요」가 나오면 성공입니다.
실전: 읽지 않은 메일을 요약하여 나에게 보내기
최소 단위의 예제가 작동했다면, 드디어 실전입니다. Gmail에서 읽지 않은 메일을 가져와, 한 통씩 Gemini에게 요약을 시킨 뒤, 한데 모아 나에게 보냅니다.
function summarizeMorningMails() {
// 최근 1일간의 읽지 않은 메일을 최대 10건만 가져옴 (너무 많이 가져오는 것 방지)
const threads = GmailApp.search('is:unread newer_than:1d', 0, 10);
...
포인트를 자세히 살펴보겠습니다.
GmailApp.search('is:unread newer_than:1d', 0, 10)
: 검색창에 입력하는 것과 동일한 조건으로 가져옵니다. 0, 10은 "처음부터 10건까지"를 의미합니다.
.slice(0, 1000)
: 본문을 앞부분 1,000자에서 자릅니다. 긴 문장을 통째로 보내면 속도가 느려지고 비용이 높아지므로, 처음에는 짧게 설정하는 것이 안전합니다.
callGemini(...)
: 방금 만든 함수를 재사용합니다. 부품을 조합하는 감각입니다.
GmailApp.sendEmail(...)
: 자신의 주소로 요약본을 전송합니다.
summarizeMorningMails를 실행하여 자신에게 요약 메일이 도착하면 완성입니다.
자동화: 매일 아침 7시에 자동으로 실행하기
마지막으로 알람 시계를 설정합니다. 왼쪽 메뉴의 시계 아이콘(트리거) → 「트리거 추가」를 클릭합니다.
- 실행할 함수:
summarizeMorningMails
- 이벤트 소스: 시간 기반
- 유형: 날짜 기반 타이머
- 시간: 오전 7시 ~ 8시
저장하면, 이제 PC를 켜두지 않아도 매일 아침 Gemini가 요약본을 보내줍니다.
작동하지 않을 때 확인하는 방법
제대로 작동하지 않을 때 무턱대고 코드를 수정하는 것이 가장 위험합니다. 다음 순서에 따라 원인을 분리해 보세요.
먼저 에러 위치를 확인하기: 실행 후, 에디터 하단의 「실행 로그」나 「실행 수」 화면에 빨간색 에러가 뜹니다. 우선 그것을 읽으세요. 영어로 되어 있더라도 마지막 줄에 원인이 적혀 있는 경우가 많습니다.
최소 단위로 되돌려 분리하기: 실전 코드가 작동하지 않는다면, 먼저 test(최소 단위 예제)로 돌아가 callGemini 단독으로 작동하는지 확인합니다. 여기가 작동한다면 Gemini 측은 문제가 없다는 뜻이며, 즉 원인은 Gmail 측이나 트리거 측으로 좁혀집니다. 최소 단위로 되돌려 분리하는 것이 철칙입니다.
반환된 내용 들여다보기: Logger.log(response.getContentText())를 일시적으로 추가하면 Gemini의 가공되지 않은 응답을 볼 수 있습니다. error라고 적혀 있다면, 그 message가 정답입니다.
환경(설정) 의심하기: 코드가 맞는데도 안 된다면, 스크립트 속성(Script Property)의 이름이 GEMINI_API_KEY와 토씨 하나 틀리지 않고 일치하는지, 키를 복사할 때 실수하지 않았는지 다시 확인합니다.
자주 발생하는 에러 읽기 예시:
400 / API key not valid: 키가 틀렸거나 속성 이름의 철자 오류
403 / permission: Gmail 권한을 허용하지 않음. 한 번 수동으로 실행하여 다시 승인할 것
429 / quota: 무료 할당량 초과. 시간을 조금 두거나 건수를 줄일 것
Cannot read properties of undefined: candidates가 비어 있음. 대부분 보낸 문장이 비어 있거나, 안전 필터(Safety Filter)에 의해 차단된 경우
자주 하는 실수 · 낭비되는 작업 · 하지 말아야 할 것
마지막으로 초보자가 빠지기 쉬운 함정들을 정리합니다.
처음부터 전부 다 쓰지 말 것: 최소 단위 예제로 "호출할 수 있는지"를 먼저 확인한 뒤 실전으로 넘어갑니다. 이것이 결국 가장 빠릅니다.
읽지 않은 메일 전체 · 본문 전체를 보내지 말 것: 매일 아침 100통의 긴 문장을 던지면 속도도 느려지고 무료 할당량도 금방 소진됩니다. 우선은 10건, 1,000자 정도로 충분합니다.
요약 결과를 맹신하지 말 것: AI의 요약은 편리하지만, 중요한 계약 내용, 금액, 날짜는 반드시 원문을 열어 확인해야 합니다. 요약은 "메일을 열어볼 순서를 정하기 위한 지도" 정도로 생각하세요.
모델 이름을 마음대로 옛날 것으로 바꾸지 말 것: 인터넷의 오래된 글에는 gemini-pro 등의 구형 명칭이 남아 있습니다. 작동하지 않을 때는 공식 현재 모델명(gemini-1.5-flash 등)을 확인하세요.
낭비되기 쉬운 작업: 에러를 읽지 않고 코드를 여기저기 수정하는 것. 90%는 로그에 답이 적혀 있습니다.
요약
우리가 한 일은 단 두 개의 부품을 조립한 것뿐입니다.
callGemini: 문장을 전달하면 요약을 돌려주는 "파트너"
summarizeMorningMails: 매일 아침 메일을 가져와 요약하고 보내는 "관리자"
:읽지 않은 메일을 모아 파트너에게 전달하고, 자신에게 전달하는 "진행자"
여기에 알람 시계(Trigger)를 더하면, 매일 아침 메일 분류가 자동화됩니다. 동일한 callGemini는 스프레드시트의 감상문을 분류하거나, 문의 메일의 답장 초안을 작성하는 등 얼마든지 응용이 가능합니다.
"자동화"라고 하면 어렵게 느껴질 수 있지만, 정체는 작은 부품들을 조합하여 알람 시계를 맞추는 것입니다. 우선 최소한의 예제를 한 번 실행하는 것부터, 옆에서 함께 시작해 봅시다.
Discussion