다음(Daum) 메일함을 주기적으로 폴링해서 새로 도착한 메일을 Gmail 받은편지함(Inbox)에 실제 받은 메일처럼 넣어주는 서버입니다.
- Daum 메일 수신: IMAP
- Gmail 전달: Gmail API
messages.insert로 받은편지함에 직접 삽입 (원본 발신자/제목/날짜 유지, 안읽음 처리) - 실행 방식: 주기적 폴링 (기본 2분)
cd daum-to-gmail
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env- Daum 메일 웹사이트 → 설정 → POP3/IMAP 설정에서 IMAP 사용을 켭니다.
- 앱 비밀번호(또는 IMAP 전용 비밀번호)를 발급받습니다. (일반 로그인 비밀번호는 IMAP에서 거부될 수 있습니다.)
.env파일에DAUM_EMAIL,DAUM_APP_PASSWORD를 채워 넣습니다.
- Google Cloud Console에서 새 프로젝트를 만듭니다.
- "API 및 서비스 → 라이브러리"에서 Gmail API 를 활성화합니다.
- "API 및 서비스 → OAuth 동의 화면"을 구성합니다. 게시 상태를 "테스트"로 두지 말고 "프로덕션"으로 게시하세요. 테스트 상태로 두면 발급된 refresh token이 7일 뒤 만료되어, 무인으로 오래 돌리는 서버에서는 일주일 뒤부터 조용히 전달이 멈춥니다. 개인 사용 목적으로 게시해도 별도 심사 없이 바로 적용됩니다.
- "API 및 서비스 → 사용자 인증 정보 → 사용자 인증 정보 만들기 → OAuth 클라이언트 ID"에서 애플리케이션 유형을 데스크톱 앱으로 선택해 생성합니다.
- 다운로드한 JSON 파일을
daum-to-gmail/client_secret.json으로 저장합니다. - 아래 명령을 실행하면 브라우저가 열리고, 로그인/동의 후
token.json이 생성됩니다.
python oauth_setup.pypython main.py- 최초 실행 시에는 과거 메일을 모두 넣지 않도록, 실행 시점 이후에 도착하는 메일부터 전달합니다.
- 어떤 메일까지 처리했는지는
state.json에 저장되며, 서버를 재시작해도 중복 전달되지 않습니다. - 새 메일이 오면 제목 앞에
[Daum]을 붙이고, 원본 발신자/날짜/본문을 유지한 채로 Gmail 받은편지함에 안읽음 상태로 삽입합니다. - 실행 중 로그는 콘솔과 함께 프로젝트 폴더의
daum_to_gmail.log파일에도 남습니다 (5MB씩 최대 4개 순환 보관). 서비스로 조용히 돌아가는 중 문제가 생겼는지 확인할 때 이 파일을 먼저 확인하세요. - Daum IMAP 접속 실패, Gmail 인증 실패 등 일시적인 오류는 자동으로 다음 폴링 주기에 재시도합니다.
NSSM을 쓰면 일반 프로그램을 Windows 서비스로 등록할 수 있습니다. 부팅 시 자동 시작되고, 프로세스가 죽어도 자동으로 재시작됩니다.
- NSSM을 다운로드해 압축을 풀고,
nssm.exe를 PATH에 추가하거나 해당 폴더에서 명령을 실행합니다. - 관리자 권한 명령 프롬프트(PowerShell)에서 서비스를 등록합니다.
C:\path\to\daum-to-gmail은 실제 프로젝트 경로로 바꿉니다.
nssm install DaumToGmail "C:\path\to\daum-to-gmail\venv\Scripts\pythonw.exe" "main.py"
nssm set DaumToGmail AppDirectory "C:\path\to\daum-to-gmail"
nssm set DaumToGmail AppExit Default Restart
nssm set DaumToGmail Start SERVICE_AUTO_START
nssm start DaumToGmailAppExit Default Restart: 프로세스가 어떤 이유로든 종료되면 자동 재시작합니다.Start SERVICE_AUTO_START: Windows 부팅 시 로그인 여부와 상관없이 자동 시작합니다.- 로그는 표준출력이 파일로 남지 않으므로, 필요하면
nssm set DaumToGmail AppStdout "C:\path\to\daum-to-gmail\service.log"와AppStderr도 같은 파일로 지정해두면 좋습니다. - 서비스 제거:
nssm remove DaumToGmail confirm - 서비스 상태 확인/중지:
nssm status DaumToGmail,nssm stop DaumToGmail
NSSM 설치가 부담스러우면 Windows 기본 작업 스케줄러로도 비슷하게 만들 수 있습니다 (단, 크래시 시 자동 재시작은 GUI에서 "실패 시 다시 시작" 옵션을 별도로 켜야 합니다).
schtasks /create /tn "DaumToGmail" /tr "\"C:\path\to\daum-to-gmail\venv\Scripts\pythonw.exe\" \"C:\path\to\daum-to-gmail\main.py\"" /sc onstart /ru SYSTEM /rl highestmessages.insert는 SPF/스팸 검사를 거치지 않고 그대로 받은편지함에 들어가므로, 원본 발신자 표시를 그대로 유지합니다 (실제로 그 주소에서 보낸 것은 아님에 유의).- 계속 실행되어야 하므로 서버/PC를 상시 켜두거나, systemd/pm2/cron 또는 위 Windows 서비스 등록 방법으로 상주 프로세스로 등록하는 것을 권장합니다.
- IMAP
UIDVALIDITY변경(메일함 재구성 등 드문 서버 이벤트)은 감지하지 않습니다. 발생 시last_uid기준이 어긋나 메일이 중복되거나 누락될 수 있습니다 (매우 드문 케이스). state.json이 손상되면(정전 등으로 인한 것이 아니어도) 자동 복구하지 않고 에러를 남긴 채 재시도를 반복합니다. 로그에서 이 메시지가 보이면 파일을 직접 확인해야 합니다.