이메일, iMessage, Linq, 자동화
IMAP/SMTP 및 Gmail Push 이메일, macOS iMessage, Linq SMS/RCS, 웹훅/MQTT/Notion 자동화 채널.
이 페이지는 Revka를 이메일, 네이티브 메시징, 자동화 시스템에 연결하는 채널들의 레퍼런스입니다. 채팅 앱이 아닌 채널들로 구성되어 있으며, IMAP/SMTP 기반 Email, Google Cloud Pub/Sub 기반 Gmail Push, macOS 네이티브 iMessage, iMessage/RCS/SMS용 Linq, Generic Webhook 어댑터, SOP(표준 운영 절차) 이벤트 트리거로서의 MQTT, 그리고 Notion 태스크 큐 채널이 포함됩니다. 에이전트가 받은 편지함에서 동작하거나, 전화번호를 구동하거나, IoT 이벤트를 집계하거나, 외부 시스템에 연결되어야 할 때 이 채널들을 활용하세요.
이 페이지의 모든 채널은 ~/.revka/config.toml의 [channels_config] 아래에서 설정합니다. 파일을 직접 편집하거나 revka onboard --channels-only를 실행한 뒤, 데몬을 재시작하여 변경 사항을 적용하세요. 공통 트레이트 모델, 전달 모드, 허용 목록 의미론에 대해서는 채널 개요를 참조하세요. 처음 채널을 설정하는 경우라면 메시징 채널 연결하기를 먼저 읽어보세요.
한눈에 보기
섹션 제목: “한눈에 보기”| 채널 | 수신 방식 | 공개 인바운드 포트 필요 여부 | 허용 목록 필드 |
|---|---|---|---|
| Email (IMAP/SMTP) | IMAP IDLE | 아니요 | allowed_senders |
| Gmail Push | Pub/Sub 웹훅 | 예 | allowed_senders |
| iMessage | macOS AppleScript 브리지 | 아니요 (macOS 전용) | allowed_contacts |
| Linq | 웹훅 (푸시) | 예 | allowed_senders |
| Generic Webhook | HTTP 서버 | 보통 예 | — |
| MQTT | 브로커 구독자 | 아니요 (아웃바운드 연결) | — |
| Notion | 폴링 | 아니요 | — (Notion 통합 공유로 접근 제어) |
웹훅 기반 채널(Gmail Push, Linq)은 게이트웨이가 공개 HTTPS로 접근 가능해야 합니다 — 터널로 게이트웨이 노출하기를 참조하세요. Generic Webhook 채널은 설정 가능한 포트에서 자체 HTTP 리스너를 실행합니다. 나머지 채널들은 아웃바운드로 연결되므로 NAT 뒤에서도 동작합니다.
Email (IMAP/SMTP)
섹션 제목: “Email (IMAP/SMTP)”Email 채널은 실시간 푸시를 위해 IMAP IDLE로 수신 대기하고 SMTP로 발송합니다. 양방향 모두 TLS(rustls로 검증)를 사용합니다. 멀티파트 MIME을 파싱하고, 주소 또는 도메인으로 발신자를 제한하며, Message-ID 및 In-Reply-To 헤더를 통해 답장 스레드를 추적합니다. RFC 2177에 따라 IDLE 연결은 약 29분 주기로 재연결하여 중간 장치 뒤에서도 연결이 유지됩니다. 공개 인바운드 포트는 필요하지 않습니다.
이메일 설정
섹션 제목: “이메일 설정”[channels_config.email]imap_host = "imap.example.com"imap_port = 993imap_folder = "INBOX"smtp_host = "smtp.example.com"smtp_port = 465smtp_tls = trueusername = "[email protected]"password = "email-password"from_address = "[email protected]"idle_timeout_secs = 1740allowed_senders = ["*"]default_subject = "Revka Message"| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
imap_host | string | — | IMAP 서버 호스트명. 필수. |
imap_port | number | 993 | IMAP 포트 (암묵적 TLS). |
imap_folder | string | "INBOX" | 감시할 메일함 폴더. |
smtp_host | string | — | SMTP 서버 호스트명. 필수. |
smtp_port | number | 465 | SMTP 포트 (암묵적 TLS). |
smtp_tls | bool | true | SMTP 연결에 TLS 사용. |
username | string | — | IMAP 및 SMTP 인증용 계정 사용자명. 필수. |
password | string | — | 계정 비밀번호. 필수. Gmail/Outlook의 경우 앱 비밀번호를 사용하세요. |
from_address | string | — | 발신 메일의 From 헤더에 사용되는 주소. 필수. |
idle_timeout_secs | number | 1740 | IDLE 재연결 간격 (1740초 = 29분). 별칭: poll_interval_secs. |
allowed_senders | array | — | 인터랙션을 허용할 이메일 주소 또는 도메인. []는 모두 거부; ["*"]는 모두 허용. |
default_subject | string | "Revka Message" | 에이전트가 새 스레드를 시작할 때 사용하는 제목 줄. |
Gmail Push (Pub/Sub)
섹션 제목: “Gmail Push (Pub/Sub)”Gmail Push 채널은 IMAP 폴링을 Google Cloud Pub/Sub 푸시로 대체합니다. 감시 중인 메일함이 변경되면 Google이 게이트웨이에 알림을 전송하고, Revka는 Gmail History API를 사용해 새 메시지를 가져옵니다. 설정한 레이블(기본값 INBOX)을 감시하며, Gmail watch 구독이 7일 만료에 가까워지면 자동으로 갱신합니다.
이 채널은 웹훅 방식입니다. Google이 게이트웨이의 POST /webhook/gmail에 접근할 수 있어야 하므로, 공개 HTTPS URL이 필요합니다.
Gmail Push 설정
섹션 제목: “Gmail Push 설정”[channels_config.gmail_push]enabled = truetopic = "projects/my-project/topics/gmail-topic"oauth_token = "" # or GMAIL_PUSH_OAUTH_TOKEN env varlabel_filter = ["INBOX"]allowed_senders = ["*"]webhook_url = "https://example.com/webhook/gmail"webhook_secret = "" # or GMAIL_PUSH_WEBHOOK_SECRET env var| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
enabled | bool | false | 채널 마스터 스위치. |
topic | string | — | GCP Pub/Sub 전체 토픽 경로 (projects/<id>/topics/<name>). 필수. |
oauth_token | string | — | Gmail API OAuth2 토큰. GMAIL_PUSH_OAUTH_TOKEN 환경 변수로 대체 가능. |
label_filter | array | ["INBOX"] | 감시할 Gmail 레이블. |
allowed_senders | array | — | 인터랙션을 허용할 이메일 주소 또는 도메인. []는 모두 거부; ["*"]는 모두 허용. |
webhook_url | string | — | Pub/Sub 푸시 구독 엔드포인트로 등록할 공개 URL. |
webhook_secret | string | — | 인바운드 푸시 요청 인증에 사용하는 Bearer 토큰. GMAIL_PUSH_WEBHOOK_SECRET으로 대체 가능. |
Google Cloud 설정
섹션 제목: “Google Cloud 설정”푸시 경로를 구성하려면:
- GCP 프로젝트와 Pub/Sub 토픽을 생성합니다(토픽 경로가
topic값입니다). - Gmail 푸시 서비스 계정
[email protected]에 해당 토픽의 Pub/Sub 게시자 역할을 부여하여 Gmail이 변경 알림을 게시할 수 있도록 합니다. - 토픽에
webhook_url(https://<gateway>/webhook/gmail)을 엔드포인트로 하는 푸시 구독을 생성합니다. - Revka가 watch를 등록하고 메시지 히스토리를 읽을 수 있도록 Gmail API 범위가 포함된
oauth_token을 제공합니다.
Revka는 Gmail watch를 등록하고 만료가 가까워지면 자동으로 갱신을 재시도합니다. Gmail 계정의 경우 Gmail Push를 IMAP Email 채널의 보완 또는 대체로 사용할 수 있습니다.
iMessage (macOS AppleScript 브리지)
섹션 제목: “iMessage (macOS AppleScript 브리지)”iMessage 채널은 macOS 전용입니다. ~/Library/Messages/chat.db의 로컬 Messages 데이터베이스를 폴링하여 새 메시지를 감지하고, osascript(AppleScript)를 통해 Messages 앱을 구동하여 답장을 전송합니다. Ventura 이후의 최신 attributedBody typedstream 블롭과 이전 macOS의 레거시 text 컬럼 모두 지원합니다.
iMessage 설정
섹션 제목: “iMessage 설정”[channels_config.imessage]allowed_contacts = ["*"]| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
allowed_contacts | array | — | 인터랙션을 허용할 연락처 식별자 (전화번호 / Apple ID). []는 모두 거부; ["*"]는 모두 허용. |
전체 디스크 접근 권한 요구 사항
섹션 제목: “전체 디스크 접근 권한 요구 사항”~/Library/Messages/chat.db 읽기는 macOS 개인 정보 보호 정책에 의해 보호됩니다. Revka를 실행하는 프로세스에 전체 디스크 접근 권한이 부여되어야 하며, 그렇지 않으면 채널이 수신 메시지를 볼 수 없습니다.
- 시스템 설정 → 개인 정보 보호 및 보안 → 전체 디스크 접근을 엽니다.
- Revka를 실행하는 바이너리 또는 앱을 추가합니다. 터미널에서 Revka를 실행하는 경우 해당 터미널 애플리케이션(예: Terminal 또는 iTerm)에 전체 디스크 접근 권한을 부여하고, 백그라운드 서비스로 실행하는 경우 Revka 바이너리 자체에 권한을 부여하세요.
- 권한이 부여된 애플리케이션을 종료하고 다시 실행하여 새 권한을 적용한 뒤, 데몬을 재시작하세요.
Linq (iMessage/RCS/SMS)
섹션 제목: “Linq (iMessage/RCS/SMS)”Linq는 Linq Partner V3 API를 통해 iMessage, RCS, SMS를 라우팅하므로, Mac 없이도 하나의 전화번호로 Apple, Android, 통신사 SMS 수신자 모두에게 도달할 수 있습니다. 웹훅 모드로 동작합니다. Linq가 인바운드 메시지를 게이트웨이의 POST /linq로 전송하면, Revka는 https://api.linqapp.com/api/partner/v3로 답장을 발송합니다. 인바운드 요청은 HMAC-SHA256 서명과 300초 타임스탬프 신선도 검사로 인증됩니다. 웹훅을 위한 공개 HTTPS URL이 필요합니다.
Linq 설정
섹션 제목: “Linq 설정”[channels_config.linq]api_token = "linq-partner-api-token"from_phone = "+15551234567"signing_secret = "optional-signing-secret"allowed_senders = ["*"]| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
api_token | string | — | Linq Partner API 토큰. 필수. |
from_phone | string | — | E.164 형식의 발신자 전화번호. 필수. |
signing_secret | string | — | 인바운드 웹훅 검증용 HMAC 서명 시크릿. REVKA_LINQ_SIGNING_SECRET으로 재정의 가능. |
allowed_senders | array | — | 인터랙션을 허용할 발신자 전화번호(E.164 형식). []는 모두 거부; ["*"]는 모두 허용. |
웹훅 인그레스 및 서명
섹션 제목: “웹훅 인그레스 및 서명”Linq 대시보드의 웹훅 URL을 게이트웨이 인그레스 경로로 설정하세요:
POST /linqContent-Type: application/json서명 시크릿이 설정된 경우, 게이트웨이는 각 요청의 HMAC-SHA256 서명을 검증하고 타임스탬프가 300초를 초과한 페이로드를 거부합니다(재전송 공격 방지). 시크릿은 환경 변수를 우선하여 확인한 뒤 설정 파일을 참조합니다:
export REVKA_LINQ_SIGNING_SECRET="your-signing-secret"Linq는 is_from_me가 설정되거나 direction이 "outbound"인 메시지를 삭제하여 자체 에코를 방지합니다. 레거시 페이로드 형태와 최신 sender_handle.is_me 형태 모두 인식됩니다. image/* MIME 타입의 인바운드 media 파트는 [IMAGE:url] 마커로 변환되어 에이전트가 첨부 파일을 인식할 수 있습니다. 전체 게이트웨이 인그레스 엔드포인트 목록은 웹훅 인그레스를 참조하세요.
Generic Webhook
섹션 제목: “Generic Webhook”Generic Webhook 채널은 JSON을 POST할 수 있고 선택적으로 콜백을 수신하는 모든 시스템을 위한 범용 어댑터입니다. 설정 가능한 포트에서 자체 HTTP 리스너를 실행하고, 설정된 경로로 메시지를 수신하며, 아웃바운드 URL로 답장을 전송합니다. 인바운드 요청은 HMAC-SHA256 서명으로 인증할 수 있습니다.
웹훅 설정
섹션 제목: “웹훅 설정”[channels_config.webhook]port = 8080path = "/webhook"send_url = "https://target.example.com/callback"send_method = "POST"auth_header = "Bearer my-token"secret = "my-hmac-secret"| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
port | number | — | 웹훅 HTTP 서버가 수신 대기하는 포트. 필수. |
path | string | "/webhook" | 인바운드 메시지 POST를 수신하는 경로. |
send_url | string | — | 답장용 아웃바운드 콜백 URL. 수신 전용으로 운용 시 생략 가능. |
send_method | string | "POST" | 아웃바운드 답장에 사용할 HTTP 메서드 (예: POST, PUT). |
auth_header | string | — | 아웃바운드 요청의 Authorization 헤더에 전송되는 값. |
secret | string | — | 인바운드 서명 검증용 공유 HMAC-SHA256 시크릿. 미설정 시 검증을 수행하지 않습니다. |
페이로드 형태
섹션 제목: “페이로드 형태”인바운드 POST 본문:
{"sender": "user@example", "content": "hello", "thread_id": "opt-thread"}아웃바운드 답장 본문(send_url로 전송):
{"content": "reply text", "thread_id": "opt", "recipient": "user@example"}선택적 thread_id는 왕복 과정에서 유지되어 외부 시스템이 대화를 스레딩할 수 있습니다. secret을 설정하지 않으면 서명이 필요하지 않으므로, 프로덕션 환경에서는 반드시 HTTPS와 시크릿을 함께 사용하세요.
MQTT (SOP 이벤트 트리거)
섹션 제목: “MQTT (SOP 이벤트 트리거)”MQTT는 이 페이지의 다른 채널들과 다릅니다. 채팅 채널이 아닙니다. MQTT 브로커를 구독하여 수신된 메시지를 에이전트 채팅 루프가 아닌 SOP(표준 운영 절차) 엔진으로 라우팅합니다. IoT 및 자동화 이벤트를 SOP 워크플로우로 집계하는 데 사용하세요. 브로커에 아웃바운드로 연결하므로 인바운드 포트가 필요 없으며, TLS(mqtts://), 인증, 토픽별 QoS를 지원합니다.
MQTT로 SOP 트리거하기
섹션 제목: “MQTT로 SOP 트리거하기”SOP의 SOP.toml에서 매칭할 토픽과 선택적 JSONPath 조건을 포함한 MQTT 트리거를 선언합니다:
[[triggers]]type = "mqtt"topic = "sensors/pressure"condition = "$.value > 85"topic은 구독과 동일한 + 및 # 와일드카드를 지원하며, condition은 JSONPath 표현식으로 실패 시 닫힘 방식으로 동작합니다 — 페이로드가 없거나 유효하지 않으면 매칭되지 않습니다. SOP 트리거 모델(웹훅, 크론, 주변 장치, 수동) 및 실행 모드에 대한 자세한 내용은 SOP 레퍼런스: 문법, 트리거 및 실행을 참조하세요.
Notion (태스크 큐)
섹션 제목: “Notion (태스크 큐)”Notion 채널은 실시간 채팅 채널이 아닌 태스크 큐입니다. Notion 데이터베이스에서 상태 속성이 대기 중 값으로 설정된 행을 폴링하고, 각 행의 프롬프트를 에이전트에 전달한 뒤 결과를 해당 행에 다시 기록합니다. 시작 시 오래된 “running” 상태 행을 초기화하여 태스크 처리 중 충돌이 발생해도 복구할 수 있으며, 동시 실행 태스크 수를 제한합니다.
Notion 설정
섹션 제목: “Notion 설정”[channels_config.notion]api_key = "secret_..."database_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"poll_interval_secs = 5status_property = "Status"input_property = "Input"result_property = "Result"max_concurrent = 4recover_stale = true| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
api_key | string | — | Notion 통합 시크릿. 필수. |
database_id | string | — | 대상 데이터베이스 ID. 필수. |
poll_interval_secs | number | 5 | 대기 중인 행을 확인하기 위해 데이터베이스를 폴링하는 간격. |
status_property | string | "Status" | 태스크 상태를 보유하는 속성. select 및 status 속성 타입 모두 지원합니다. |
input_property | string | "Input" | 프롬프트 텍스트를 보유하는 속성. |
result_property | string | "Result" | 에이전트의 결과가 기록될 속성. |
max_concurrent | number | 4 | 병렬로 처리할 수 있는 최대 태스크 수. |
recover_stale | bool | true | 부팅 시 “running” 상태에 멈춰 있는 행을 초기화하여 재처리되도록 합니다. |
허용 목록 의미론
섹션 제목: “허용 목록 의미론”발신자 게이팅 필드는 채널마다 다르지만 규칙은 동일합니다:
| 채널 | 필드 |
|---|---|
| Email, Gmail Push, Linq | allowed_senders |
| iMessage | allowed_contacts |
- 빈 목록(
[])은 모든 발신자를 거부합니다. "*"항목 하나는 모든 발신자를 허용합니다.- 그 외의 경우 목록에 있는 ID만 허용됩니다. 이메일의 경우 전체 주소 또는 도메인만 입력할 수 있습니다.
Generic Webhook과 MQTT 채널에는 허용 목록 필드가 없습니다. 웹훅은 HMAC secret으로 게이팅되며, MQTT 신뢰는 브로커 연결과 선택적 username/password에서 옵니다. Notion 채널에는 발신자 허용 목록이 없으며, 접근은 통합이 공유된 Notion 데이터베이스로 제어됩니다.
["*"]로 시작하여 엔드투엔드 전달을 확인한 뒤, 명시적인 ID로 엄격하게 설정하세요.
관련 페이지
섹션 제목: “관련 페이지”- 채널 개요 — 채널 트레이트, 전달 모드, 허용 목록 모델.
- 메시징 채널 연결하기 — 채널 모델과
revka channel명령어. - 웹훅 인그레스 — 모든 게이트웨이 인그레스 엔드포인트(
/linq,/webhook/gmail,/webhook)와 서명 규칙. - 터널로 게이트웨이 노출하기 — Gmail Push와 Linq를 위한 공개 HTTPS URL 설정.
- SOP 레퍼런스: 문법, 트리거 및 실행 — SOP 트리거(MQTT 포함)와 실행 모드.
- 변수, 표현식 및 트리거 — 이 채널들과 연동되는 워크플로우 트리거.
- 설정: 채널, 도구 및 통합 — 모든 채널 설정 키를 한 곳에서 확인.
- macOS 업데이트 및 제거 — iMessage가 실행되는 macOS에서 Revka 프로세스 관리.