Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
11 KiB
AriMail — mail.arihakdang.com / mail.heart-m.com
AriMail(1.0.0 까지의 이름은 mail-gateway, 저장소 https://source.ibit.kr/OZ-Group/AriMail)은 웹 메일함과 IMAP·POP3·SMTP 서버를 갖춘 메일 게이트웨이입니다.
수신·발신은 Resend 또는 내장 Haraka(직접 수신 MX / 직접 발송) 또는 외부 SMTP 중계 중에서 설정으로 고릅니다. www.arihakdang.com 관리자 메일함(server/mailbox.mjs)을 참고해
별도 사이트로 분리했고, 다음을 더합니다.
-
설정 파일과 초기 설정 페이지(1.0.0~): Resend 키·중계 서버·Haraka·사이트 정보 같은 운영 설정은
data/config.json에 두고, 배포 뒤 전용 포트(8791, 토큰)의 초기 설정 페이지나/admin → 메일 서비스 설정에서 채웁니다(재시작 없음). 환경 파일에는 배포에 필요한 값만 남습니다. -
발송 모듈화(1.0.0~):
server/providers/(resend · smtp 중계 · 내장 Haraka)와sendMail()한 지점. 새 서비스는 모듈 하나를 더해 끼웁니다. -
자동 설정·DNS 모듈(1.0.5~): 설정 화면의 "자동 설정" 이 Resend 도메인 등록·검증·웹훅(비밀키 자동 저장), DNS 레코드(Google Cloud DNS / AWS Route 53 자동 적용, 그 밖에는 안내), 내장 Haraka 준비(DKIM·PTR·설치)를 진단·실행하고 상황별 안내 끝에 "메일 사용 준비 완료" 를 알립니다.
-
내장 Haraka(1.0.0~):
haraka/(run.mjs 관리 프로세스 + arimail 플러그인)와deploy/haraka-apply.sh. 수신(25 → 게이트웨이 저장)과 발신(로컬 제출 포트 → MX 직접 배달, DKIM 서명)을 설정으로 켭니다. -
이중 수신: Resend 웹훅(
email.received) + 1시간마다 수신 목록 동기화(웹 메일함을 열어 두면 1분마다 빠른 확인). 같은 메일은 한 번만 저장. -
원본 보관: Resend 가 서명 URL 로 주는 원본
.eml을 그대로 저장(없으면 본문·헤더·첨부로 재구성). 첨부 바이트도 함께 보관. -
웹 메일함: 3단(폴더·목록·읽기 창) 레이아웃, 중요 표시·읽지 않음·첨부 필터, 일괄 삭제/이동/읽음, 답장·전체답장·전달, 원본 다운로드, 첨부.
-
HTML 편집기: 글꼴·크기·색·강조·정렬·목록·링크·인용·구분선·본문 이미지(cid 인라인 첨부로 발송)·HTML 소스 편집, 임시 저장 자동화.
-
관리자 페이지
/admin(0.8.4~): 별도 로그인(같은 관리자 계정)을 거치는 고정 주소. 게이트웨이 사용자 계정(로그인 ID·이름·비밀번호·역할·상태·POP/IMAP 허용)을 추가·수정·삭제하고 서버 상태를 봅니다. 메일함 주소는로그인ID@도메인으로 자동 지정. 웹·POP·IMAP·SMTP 동일 인증. -
IMAP:
mail.arihakdang.com:993(TLS)/143(STARTTLS). INBOX/Sent/Drafts/Trash 가 웹 메일함과 같은 저장소. 읽음·플래그·이동·삭제 공유, IDLE·MOVE·UIDPLUS·APPEND. -
POP3:
mail.arihakdang.com:995(TLS)/110(STLS, 관리자 설정에 따라 일반 접속 로그인도 허용 — Gmail 의 POP 가져오기용). 계정은 www 관리자 계정 그대로. 한 번 내려준 메일은 다시 주지 않음. -
SMTP 제출(0.8.1~):
mail.arihakdang.com:465(TLS)/587(STARTTLS). 웹 메일과 같은 아이디·비밀번호로 인증하고, 실제 발송은 서버 내부의 Resend API 키로 합니다(키는 사용자에게 노출되지 않음). 보낸 메일은 보낸 메일함에 바로 저장. -
기한 없는 보관(0.8.0~): 메일은 휴지통에서 영구 삭제할 때만 원본·첨부와 함께 지우고, 지운 메일은 재수신하지 않음.
-
설정 화면: IMAP·SMTP·POP 메일 프로그램 설정 안내, 화면 기본값, 계정별 POP/IMAP 접속 허용 스위치. 로그인 화면의 (?) 접속 안내. 화면 상단에 버전 표시.
-
메일 전달·자동 응답(0.8.16~): 설정 화면에서 받은 메일을 지정 주소(최대 5개)로 전부 전달하고, 지정한 메시지로 자동 회신(기한 없음 또는 날짜·시간 단위 기간)합니다. 되풀이 방지(전달 표시 헤더·
Auto-Submitted), 같은 상대 24시간 1회, 자동 발송 메일 제외, 처리 기록은 메일 상세에 표시. -
독립 설치(0.8.18~):
WWW_DB_FILE을 비우면 www 사이트 없이 게이트웨이 계정만으로 동작합니다(첫 관리자admin/adminpasswd자동 생성(0.8.24~),server/user-cli.mjs로 계정 추가·비밀번호 재설정,SITE_TITLE/SITE_BRAND로 화면 이름 변경). -
비밀번호 정책(0.8.24~): 관리자 페이지에서 최소 글자 수(6~64, 기본 6)와 대·소문자 혼용·숫자·특수문자 요구를 켜고 끕니다. 예전의 10자 고정 규칙을 대체.
-
비밀번호 변경 보호·도메인 기반 서비스 이름·자동 새로고침(0.8.25~): 자기 비밀번호 변경은 현재 비밀번호 확인 + 두 번 입력 + 보기 단추. 왼쪽 위 이름은 메일 도메인에서(
heart-m.com→ "HEART-M 메일"). 배포 뒤 열어 둔 화면은X-App-Version을 보고 스스로 새로 고침. 배포 파일은deploy/sites/<이름>.env사이트 설정 +.in템플릿이며, 현재 mail.arihakdang.com(www 연동)과 mail.heart-m.com(독립) 두 사이트가 있습니다.
의존성 없음(Node 22.13+ 의 node:sqlite, node:tls). 문구는 lang/ko.json 한 곳에 둡니다.
npm test # 인증·웹훅·동기화·보관·발송·POP3·IMAP·SMTP·설정/발송 모듈/Haraka 수신/초기 설정 회귀 테스트
DB_FILE=./data/mail-gateway.sqlite MAILBOX=admin@example.test node server/index.mjs # 운영 설정은 ./data/config.json 과 초기 설정 페이지(8791)
설치·운영은 docs/SETUP.md, 배포 파일은 deploy/, 변경 이력은 CHANGELOG.md 를 보세요.
구조
| 파일 | 역할 |
|---|---|
server/index.mjs |
HTTP(127.0.0.1:8790) + POP3 + 주기 작업 |
server/api.mjs |
로그인, 메일함 API, 설정 API, Resend 웹훅 |
server/store.mjs |
수신 저장(웹훅/동기화), 원본, 시각 정규화, 세션 정리, 초안·발송 |
server/automation.mjs |
수신 메일 자동 처리(0.8.16~): 메일 전달·자동 응답, 되풀이 방지 규칙, 처리 기록(auto_actions) |
server/smtp.mjs |
SMTP 제출 서버(EHLO/STARTTLS/AUTH PLAIN·LOGIN/MAIL/RCPT/DATA), 로그인 인증 후 내부 키로 Resend 발송·보낸 메일함 저장 |
server/pop3.mjs |
POP3 서버(USER/PASS, AUTH PLAIN, STLS, UIDL, TOP), 전달 기록 |
server/imap.mjs |
IMAP4rev1 서버(SELECT/FETCH/STORE/SEARCH/MOVE/COPY/EXPUNGE/APPEND/IDLE, STARTTLS) |
server/imap-mime.mjs |
원본 MIME 해석: ENVELOPE, BODYSTRUCTURE, 섹션 추출, APPEND 요약 |
server/auth.mjs |
www 관리자 인증(PBKDF2, 별칭 admin) + 게이트웨이 계정(mail_users) 관리(회원 가입·승인 대기 포함), 세션, 계정별 설정(prefs: 외부 이미지·POP/IMAP·전달·자동 응답) |
server/files.mjs |
0.9.3: 대용량 첨부파일 — 디스크 스트리밍 업로드, 발송 시 토큰 링크(/dl/<토큰>)와 본문 블록, 랜딩 페이지·횟수 차감 다운로드, 기한·횟수 만료 삭제·정리, 시스템 상한(LIMIT_LARGE_FILE_*)·관리자 설정(50% 기본) |
server/limits.mjs |
0.9.0: 시스템 제한(환경 변수 LIMIT_*)·관리자 제한·계정별 메일함 크기, 사용량(MIME 기준)·발송/수신 제한 검사, POP/IMAP 서비스 스위치, 회원 가입 설정, 메일 현황 집계(일·주·월) |
server/user-cli.mjs |
계정 명령줄 도구(0.8.18~): 독립 설치의 첫 관리자 생성, 비밀번호 재설정, 목록 |
server/config.mjs |
1.0.0: 운영 설정 파일(config.json) — 스키마, 환경 변수 가져오기·우선순위, 저장 즉시 적용, 비밀값 가림, 초기 설정 토큰, DKIM 키·DNS 레코드 |
server/domains.mjs |
1.0.7: 다중 도메인 — 도메인 등록부(data/domains.json)와 테넌트(도메인별 env: DB·설정·파일), Host·로그인 ID·주소로 도메인 고르기, 추가·중지·삭제, "메일 서비스 없음" 안내 화면 |
server/usage.mjs |
1.0.9: 메일 사용량 정보 제공 API(/api/usage) — 도메인·계정별 디스크 사용량·메일 수·발송량(일/주/월·일별 추이), 비밀 키(Bearer)·허용 IP·시도 제한으로 보호된 읽기 전용(docs/USAGE-API.md) |
server/webmaker.mjs, server/webmaker-snapshot.mjs |
1.0.8: webmaker 인증 모드 — 웹메이커(WebHosting_AI_agent) 데이터 디렉터리를 읽기 전용 스냅샷으로 읽어(직접 또는 sudo 도우미) 같은 scrypt 로 비밀번호 검사, 도메인 ↔ 사이트 대응(사이트 사용자·소유자·웹메이커 관리자 → 아이디@도메인), 관리자 페이지의 읽기 전용 행 |
server/setup.mjs |
1.0.0: 초기 설정 페이지 API(/api/setup/*)와 전용 포트(8791, 토큰) 서버, Haraka 상태 읽기. 1.0.7: 전체 설정(도메인 목록·추가·중지, ?domain= 으로 도메인별 설정) |
server/dns/ |
1.0.5: DNS 모듈 — index.mjs(모듈 선택·필요한 레코드 계산·SPF 병합·적용·반영 확인), google.mjs(Cloud DNS, 서비스 계정 JWT), route53.mjs(Route 53, SigV4), common.mjs(공개 조회·PTR) |
server/provision.mjs |
1.0.5: 자동 설정 계획 — 단계별 진단(buildPlan)과 실행(runPlan): Resend 도메인·검증·웹훅, DNS 적용, Haraka DKIM·설치·PTR, SMTP 중계 확인 |
server/providers/ |
1.0.0: 발송·수신 서비스 모듈 — index.mjs(sendMail 선택·상태), resend.mjs(Resend API, 옛 server/resend.mjs; 1.0.11: 발신 도메인 검증 상태 진단 mail_domain_unverified/mail_domain_missing — 레코드별 없음/값 다름, 자동 재검증), smtp.mjs + smtp-client.mjs(SMTP 중계·내장 Haraka 제출) |
haraka/ |
1.0.0: 내장 Haraka — package.json(Haraka + dkim 플러그인), run.mjs(설정 파일을 보고 Haraka 설정 생성·실행·상태 기록), plugins/arimail.js(게이트웨이 연결: relay 판정·RCPT 확인·원본 전달) |
web/setup.* |
1.0.0: 메일 서비스 설정 화면(전용 포트와 /setup 공용). 1.0.7: 전용 포트에서는 전체 설정(도메인 카드 + 고른 도메인의 설정) |
server/mime.mjs |
RFC 5322 메시지 생성, POP 전송 정규화 |
server/sanitize.mjs |
수신 HTML 정제(www 의 sanitize_mail.py 와 같은 허용 목록) |
web/ |
웹 메일 화면(로그인·회원 가입·접속 안내, 3단 메일함, HTML 편집기(8색 팔레트), 설정(비밀번호 변경·사용량·전달·자동 응답))과 관리자 페이지(/admin: 계정 관리·회원 가입/제한/서비스 설정, 서버 상태·메일 현황) |
deploy/ |
사이트 설정(sites/*.env, new-site.sh 로 생성), nginx-apply.sh(vhost 만 다시 적용, 0.9.5), haraka-apply.sh(내장 Haraka npm 설치·서비스 등록, 1.0.0), domain-nginx.sh(추가 도메인 호스트의 nginx vhost·인증서, 1.0.7), webmaker-access.sh(웹메이커 계정 읽기 도우미·sudoers, 1.0.8), site-mail-path.sh(사이트의 /mail 을 웹 메일로 — nginx/mail-path.conf.in, 1.0.8)과 템플릿(systemd·nginx·certbot 훅·환경 파일 .in), setup/deploy 스크립트(끝에 초기 설정 페이지 주소 출력), 인증서 자동 발급 타이머(tls-when-ready.sh). 설치 옵션 LOGIN_MODE(standalone 기본 / www / webmaker)와 시스템 제한 LIMIT_* |