์•„์นจ 8์‹œ์— ์ž๋™ ๋ฉ”์ผ ์ •๋ฆฌ๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ, ์กฐํšŒ๋Š” ๋˜๋Š”๋ฐ Draft ์ €์žฅ๋งŒ ์‹คํŒจํ•˜๋Š” ๋‚ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์€ ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ถŒํ•œ ์Šค์ฝ”ํ”„, ์‹คํ–‰ ์œ„์น˜, ํ† ํฐ ์ƒํƒœ 3์ถ•์—์„œ ํ„ฐ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์‹ค์ œ๋กœ ์ž์ฃผ ๋งŒ๋‚˜๋Š” 7๊ฐ€์ง€๋ฅผ โ€œ์ƒํ™ฉ โ†’ ์›์ธ โ†’ ๋ฐ”๋กœ ์กฐ์น˜โ€๋กœ ์ •๋ฆฌํ•œ ์‹ค์ „ํŒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋‚ด: ๋ณธ๋ฌธ์€ ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ •๋ฆฌํ–ˆ์œผ๋ฉฐ, ๋ฏผ๊ฐ์ •๋ณด(ํ† ํฐ/๊ฐœ์ธ์‹๋ณ„์ž)๋Š” ์˜ˆ์‹œ์—์„œ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

flowchart TD
A[Gmail ๋™์ž‘ ์ด์ƒ] --> B{์กฐํšŒ๋Š” ๋˜๋Š”๊ฐ€?}
B -- ์•„๋‹ˆ์˜ค --> C[ํ† ํฐ/์ธ์ฆ ์ ๊ฒ€]
B -- ์˜ˆ --> D{Draft ์ €์žฅ ๋˜๋Š”๊ฐ€?}
D -- ์•„๋‹ˆ์˜ค --> E[compose ์Šค์ฝ”ํ”„ ์ ๊ฒ€]
D -- ์˜ˆ --> F{์ฝœ๋ฐฑ/์‹คํ–‰ํ™˜๊ฒฝ ์ •์ƒ?}
F -- ์•„๋‹ˆ์˜ค --> G[ํฌํŠธํฌ์›Œ๋”ฉ/์‹คํ–‰์œ„์น˜ ์ ๊ฒ€]
F -- ์˜ˆ --> H[๊ฒ€์ƒ‰์กฐ๊ฑด/๊ธฐ๊ฐ„ ์ตœ์ ํ™”]

๋จผ์ € 60์ดˆ ์ฒดํฌ

openclaw status
openclaw gateway status
python3 - <<'PY'
import json
from pathlib import Path
p=Path('~/.openclaw/gmail/token.json').expanduser()
print('token_exists=', p.exists())
if p.exists():
    print('scopes=', json.loads(p.read_text()).get('scopes'))
PY

์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ ๋ณผ ํ•ต์‹ฌ:

  • gmail.compose๊ฐ€ ์—†์œผ๋ฉด Draft ์ €์žฅ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ ํผ
  • ํ† ํฐ ํŒŒ์ผ์ด ์žˆ์–ด๋„ ์Šค์ฝ”ํ”„๊ฐ€ ํ‹€๋ฆฌ๋ฉด ๋™์ž‘์ด ๋ฐ˜์ชฝ๋งŒ ๋จ

Gmail ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… 7๊ฐ€์ง€

1) ์กฐํšŒ๋Š” ๋˜๋Š”๋ฐ Draft ์ €์žฅ ์‹œ 403

์ƒํ™ฉ: ๋ฉ”์ผ ๋ชฉ๋ก์€ ์ฝํžˆ๋Š”๋ฐ ์ž„์‹œ๋ณด๊ด€ ์ƒ์„ฑ๋งŒ ์‹คํŒจ
์›์ธ: gmail.compose ์Šค์ฝ”ํ”„ ๋ˆ„๋ฝ
๋ฐ”๋กœ ์กฐ์น˜: OAuth ์žฌ์ธ์ฆ ํ›„ readonly + compose๋กœ ํ†ต์ผ

2) ์–ด์ œ๋Š” ๋๋Š”๋ฐ ์˜ค๋Š˜ ๊ฐ‘์ž๊ธฐ readonly๋กœ ํšŒ๊ท€

์ƒํ™ฉ: ์ž๋™ํ™” ๋Œ๋ฆฐ ๋’ค ๊ถŒํ•œ์ด ๋‹ค์‹œ ์ค„์–ด๋“ฆ
์›์ธ: ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ readonly ๋‹จ๋… ํ† ํฐ์„ ๋ฎ์–ด์”€
๋ฐ”๋กœ ์กฐ์น˜: Gmail ๊ด€๋ จ ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด ์Šค์ฝ”ํ”„ ์ •์ฑ…์„ ํ•˜๋‚˜๋กœ ๊ณ ์ •

3) OAuth ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ˆ ์—ด๋ฆฌ๊ฑฐ๋‚˜ ์ฝœ๋ฐฑ ์‹คํŒจ

์ƒํ™ฉ: ์ธ์ฆ ์‹œ์ž‘์€ ๋˜๋Š”๋ฐ ๋งˆ์ง€๋ง‰ ์Šน์ธ ๋‹จ๊ณ„์—์„œ ๋ฉˆ์ถค
์›์ธ: ์›๊ฒฉ ํ™˜๊ฒฝ์—์„œ loopback ํฌํŠธ ๋ฏธ์—ฐ๊ฒฐ
๋ฐ”๋กœ ์กฐ์น˜:

ssh -N -L 8765:127.0.0.1:8765 <server>

ํฌํŠธ ์—ฐ๊ฒฐ ํ›„ ๋กœ์ปฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ธ์ฆ ์žฌ์‹œ๋„

4) Browser Relay๊ฐ€ ๋“ค์ญ‰๋‚ ์ญ‰

์ƒํ™ฉ: ์–ด๋–ค ๋‚ ์€ ๋˜๊ณ  ์–ด๋–ค ๋‚ ์€ ์‹คํŒจ
์›์ธ: OpenClaw ์‹คํ–‰ ๋จธ์‹ ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰ ๋จธ์‹  ๋ถˆ์ผ์น˜
๋ฐ”๋กœ ์กฐ์น˜: โ€œ๊ฐ™์€ ๋กœ์ปฌ ๋จธ์‹ โ€์—์„œ ํ™•์žฅ + OpenClaw ๋™์‹œ ์šด์˜

5) ํŠน์ • ๋ฐœ์‹ ์ž ๋ฉ”์ผ๋งŒ ์•ˆ ์žกํž˜

์ƒํ™ฉ: ์ผ๋ถ€ ์ค‘์š” ๋ฉ”์ผ ๋ˆ„๋ฝ
์›์ธ: ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋„ˆ๋ฌด ์ข๊ฒŒ ๊ฑธ์–ด๋‘ 
๋ฐ”๋กœ ์กฐ์น˜: ๋จผ์ € ๋„“๊ฒŒ(newer_than:3d) ํ™•์ธ ํ›„ ์ ์ง„์ ์œผ๋กœ ์ขํžˆ๊ธฐ

6) ํ† ํฐ ํŒŒ์ผ์€ ์žˆ๋Š”๋ฐ ์ธ์ฆ ์˜ค๋ฅ˜ ๋ฐ˜๋ณต

์ƒํ™ฉ: token.json ์กด์žฌํ•˜์ง€๋งŒ ๊ณ„์† ์‹คํŒจ
์›์ธ: ์†์ƒ/๊ตฌ๋ฒ„์ „ ํ† ํฐ
๋ฐ”๋กœ ์กฐ์น˜:

mv ~/.openclaw/gmail/token.json ~/.openclaw/gmail/token.backup.$(date +%s).json

๋ฐฑ์—… ํ›„ ์žฌ๋ฐœ๊ธ‰

7) ์•Œ๋ฆผ ์ž๋™ํ™”๋Š” ๋˜๋Š”๋ฐ ๋ฉ”์ผ ์ œ์•ˆ ์ž‘์„ฑ๋งŒ ์‹คํŒจ

์ƒํ™ฉ: ์ฝ๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ OK, ์“ฐ๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ FAIL
์›์ธ: ์กฐํšŒ ์Šคํฌ๋ฆฝํŠธ์™€ Draft ์Šคํฌ๋ฆฝํŠธ์˜ ๊ถŒํ•œ ์ •์ฑ… ๋ถ„๋ฆฌ
๋ฐ”๋กœ ์กฐ์น˜: ๊ฐ™์€ ํ† ํฐ/๊ฐ™์€ ์Šค์ฝ”ํ”„ ๊ธฐ์ค€์œผ๋กœ ์šด์˜ ํ†ตํ•ฉ

์˜ค๋Š˜ ๋ฐ”๋กœ ์ ์šฉํ•  ์šด์˜ ๋ฃฐ 3๊ฐœ

  1. ํ† ํฐ ๊ฒฝ๋กœ ๊ณ ์ •: ~/.openclaw/gmail/token.json
  2. ๊ณตํ†ต ์Šค์ฝ”ํ”„ ๊ณ ์ •: readonly + compose
  3. ๋ฐฐํฌ ์ „ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ 2๊ฐœ ๊ณ ์ •
    • ์ตœ๊ทผ ๋ฉ”์ผ ์กฐํšŒ 1ํšŒ
    • Draft ์ €์žฅ 1ํšŒ

5๋ถ„ ๋ณต๊ตฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • openclaw status/gateway status ํ™•์ธ
  • token.json ์กด์žฌ + compose ํฌํ•จ ํ™•์ธ
  • OAuth ์ฝœ๋ฐฑ ํฌํŠธ(8765) ๊ฒฝ๋กœ ํ™•์ธ
  • ์กฐํšŒ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต
  • Draft ์ €์žฅ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต

๊ด€๋ จ ๋ฌธ์„œ