์์นจ 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๊ฐ
- ํ ํฐ ๊ฒฝ๋ก ๊ณ ์ :
~/.openclaw/gmail/token.json - ๊ณตํต ์ค์ฝํ ๊ณ ์ :
readonly + compose - ๋ฐฐํฌ ์ ์ค๋ชจํฌ ํ
์คํธ 2๊ฐ ๊ณ ์
- ์ต๊ทผ ๋ฉ์ผ ์กฐํ 1ํ
- Draft ์ ์ฅ 1ํ
5๋ถ ๋ณต๊ตฌ ์ฒดํฌ๋ฆฌ์คํธ
-
openclaw status/gateway statusํ์ธ - token.json ์กด์ฌ + compose ํฌํจ ํ์ธ
- OAuth ์ฝ๋ฐฑ ํฌํธ(8765) ๊ฒฝ๋ก ํ์ธ
- ์กฐํ ํ ์คํธ ์ฑ๊ณต
- Draft ์ ์ฅ ํ ์คํธ ์ฑ๊ณต