전용 메일함을 사용하여 IMAP을 통해 Qwen Code에 작업을 전송하고 일반 텍스트 SMTP 회신을 받습니다. 첫 연결에서는 선택한 폴더에 이미 있는 메일을 건너뜁니다. 이후 연결에서는 저장된 UID 커서부터 이어서 처리합니다.
설정 및 시작
메일함에서 IMAP과 SMTP를 활성화하고, Qwen Code를 실행하는 프로세스의 환경 변수로 자격 증명을 내보냅니다. settings.json에 다음 채널을 추가합니다.
{
"channels": {
"agent-mail": {
"type": "email",
"address": "agent @example.com",
"imapHost": "imap.example.com",
"imapUser": "agent @example.com",
"imapPassword": "$AGENT_IMAP_PASSWORD",
"smtpHost": "smtp.example.com",
"smtpUser": "agent @example.com",
"smtpPassword": "$AGENT_SMTP_PASSWORD",
"privatePolicy": "allowlist",
"allowedUsers": ["you @example.com"],
"sessionScope": "chat_thread",
"cwd": "/path/to/workspace"
}
}
}qwen channel start agent-mail를 실행합니다. 비밀번호 필드는 기존 $ENV_VAR 참조를 지원합니다. 평문 비밀번호는 설정에 보관하지 마십시오. 어댑터는 프로토콜 로깅을 비활성화하고 자격 증명 없이 연결 실패를 보고합니다.
암시적 TLS는 기본적으로 IMAP 포트 993과 SMTP 포트 465를 사용합니다. STARTTLS의 경우 imapSecure 또는 smtpSecure를 false로 설정하면 기본 포트가 각각 143과 587로 변경됩니다. STARTTLS와 인증서 검증은 여전히 필수입니다. 필요에 따라 imapPort와 smtpPort를 재정의하십시오. 비공개 CA의 경우 Qwen Code를 시작하기 전에 Node의 NODE_EXTRA_CA_CERTS를 구성하십시오.
| 옵션 | 기본값 | 의미 |
|---|---|---|
folder | INBOX | 읽기 전용 IMAP 폴더 하나 |
pollInterval | 60000 | 밀리초 단위의 폴링 간격 |
maxMessageBytes | 10485760 | 최대 원시 메시지 크기. 이보다 큰 메시지는 건너뜁니다 |
maxAttachmentBytes | 5242880 | 최대 개별 첨부 파일 크기. 이보다 큰 첨부 파일은 생략됩니다 |
maxTextLength | 32000 | 인용 기록/서명 트리밍 이전의 최대 텍스트 문자 수 |
proactiveRecipients | [] | 능동적 전달에 허용되는 정확한 베어 메일함 주소 |
최대 16개의 첨부 파일이 전달됩니다. PNG, JPEG, GIF, WebP 이미지는 기존 이미지 입력을 사용하며, 다른 파일은 작업 기간 동안 생성된 비공개 경로에 저장됩니다. 캘린더 및 캡슐화된 메시지/보고서 부분은 지원되지 않습니다. HTML은 원격 리소스를 로드하지 않고 텍스트로 변환됩니다. 공통 채널 옵션인 cwd, model, instructions, sessionScope가 적용됩니다. 기본 chat_thread 스코프는 발신자와 스레드를 분리하며, single을 선택하면 에이전트 세션이 명시적으로 공유됩니다.
접근 및 회신
privatePolicy는 allowlist(기본값), open, disabled를 지원하며, 레거시 senderPolicy도 인식됩니다. 페어링은 이 첫 버전에서는 지원되지 않습니다. allowedUsers와 operators의 주소는 소문자로 정규화되며, 표시 이름은 접근 권한을 부여하지 않습니다. 베어 ASCII 주소가 지원됩니다. 위조 메일을 필터링하는 메일함 제공자를 사용하십시오. From 허용 목록이 발신자를 인증하지는 않습니다.
에이전트의 이메일에 회신하여 대화를 계속합니다. Message-ID, In-Reply-To, References가 대화를 해당 발신자와 연결합니다. 회신은 해당 발신자에게만 전달되며, Reply-To, CC, BCC 및 작업 내 주소는 SMTP 수신자를 변경할 수 없습니다. 백그라운드 작업 결과는 시작 턴이 끝난 후 저장된 수락된 스레드를 통해 회신합니다. No-reply 발신자는 작업을 시작할 수 있지만 응답을 받지 못합니다. 에이전트가 생성한 메일, 자동 메일, 메일링 리스트 메일, 배달 보고서 메일은 무시됩니다.
/help, /status 등의 텍스트 명령어와 권한 회신은 이메일 본문에서 작동합니다. 이메일은 기본적으로 followup을 사용하며 steer를 지원합니다. collect는 거부됩니다. 버퍼링된 메시지는 어드미션 핸들러보다 오래 생존하며 개별 내구성 완료 클레임을 유지할 수 없기 때문입니다. 작업이 대기 중에도 어드미션은 활성 상태로 유지됩니다. 최대 32개의 일반 배달이 진행 중일 수 있으며, 추가 슬롯 하나에서 제어 회신과 busy 응답을 처리합니다. 용량 초과 시 새 작업은 활성 작업이 끝난 후 다시 보내달라는 요청을 받습니다.
능동적 전달은 proactiveRecipients에 정확한 대상이 포함되어 있지 않으면 비활성화됩니다. 스레드 기반 능동적 대상은 알려진 현재 허용된 발신자/스레드로도 확인되어야 합니다. 알 수 없는 대상은 다른 수신자를 선택하거나 대체 스레드를 생성하지 않고 실패합니다. 어댑터는 최근 회신 경로 256개, 경로당 최대 64개의 식별자, 최근 인바운드 아이덴티티 1024개를 유지합니다. 해당 메타데이터 항목이 만료된 후에도 IMAP UID 진행 상태가 계속되어 오래된 배달의 리플레이를 방지합니다. 제거된 스레드 경로는 다른 수락된 메시지가 복원할 때까지 능동적 회신을 받을 수 없습니다.
복구
상태는 $QWEN_HOME/channels/<workspace>/email-<account-hash>/state.json에 저장됩니다(기본 QWEN_HOME은 ~/.qwen). 채널 이름, 정규 워크스페이스, 메일함 엔드포인트/사용자/폴더가 스토어를 결정합니다. 오직 하나의 프로세스만 소유할 수 있습니다. 계정을 전환하면 별도의 베이스라인이 설정되며, UIDVALIDITY 변경 시에도 기존 폴더 내용이 건너뛰어집니다.
어댑터는 작업을 시작하기 전에 진행 중인 UID를 유지하고, 각 SMTP 전송 전에(능동적 전송 포함) outboundPending 메시지 ID를 유지합니다. 해당 작업이 완료되면 각 레코드를 제거합니다. 프로세스가 실행 중에 중단되거나 SMTP가 불확실한 결과를 반환하면 레코드가 남아 있습니다. 재시작 시 상태 경로, 대기 중인 UID, 발신 메시지 ID를 보고하며 이를 리플레이하지 않습니다. 채널을 중지하고 메일함과 작업 부작용을 확인한 후, 재시작 전에 조정된 UID만 상태의 pending 배열에서 제거하고 조정된 발신 ID만 outboundPending에서 제거하십시오. 커서와 스레드 메타데이터는 그대로 유지하십시오. 상태 파일을 재시도 메커니즘으로 삭제하지 마십시오. 삭제하면 새 베이스라인이 생성되어 기존 메일이 건너뛰어집니다.
이메일 스레드 식별자와 어드미션 진행 상태는 재시작 후에도 유지됩니다. 에이전트 기록 복원은 채널 런타임을 따릅니다. 현재 독립 실행형 channel start 경로는 콜드 스타트 시 저장된 에이전트 세션을 복원하지 않는 반면, 데몬 워커는 경로를 복원합니다.
에이전트 부작용, SMTP 수락, 로컬 커서는 하나의 트랜잭션으로 커밋할 수 없습니다. 채널을 중지하면 에이전트 작업을 시작하기 전에 대기 중인 턴이 차단됩니다. 이미 에이전트에서 실행 중인 작업은 여전히 완료될 수 있습니다. 이 복구 정책은 불확실한 작업의 자동 재실행을 방지하며, 중단 후 운영자의 조정이 필요합니다. 손상되거나 읽을 수 없는 상태도 시작을 차단합니다. 이전 첨부 파일 디렉토리는 조정 후 새 작업을 받기 전에 제거됩니다.
제공자 OAuth, 서식 있는 HTML 출력, 메일함 관리, S/MIME, PGP, 캘린더 처리는 이 버전에서 지원되지 않습니다.