이메일 첨부파일을 자동으로 수신, 분류, 파싱하여 데이터베이스에 저장하는 n8n 워크플로우입니다.
이 워크플로우는 IMAP을 통해 수신된 이메일의 PDF 첨부파일을 처리합니다. 문서 유형을 자동 분류하고 OCR 및 AI 기반 파싱을 수행하여 구조화된 데이터로 변환합니다.
- 이메일 수신: IMAP 프로토콜을 통한 실시간 이메일 모니터링
- 첨부파일 처리: PDF 첨부파일 자동 추출 및 분리
- 텍스트 추출: 내장 PDF 파서 + Upstage OCR API 지원
- AI 문서 분류: OpenAI GPT-4.1-mini를 활용한 문서 유형 분류
- 파일 저장: SFTP를 통한 파일 저장 (SHA256 해시 기반 파일명)
- 데이터 저장: MySQL 데이터베이스 저장
- 실시간 알림: Redis Pub/Sub을 통한 알림 발행
| 카테고리 | 설명 |
|---|---|
bizlicense |
사업자등록증 |
quotation |
견적서 |
purchase_order |
발주서 |
bank_statement |
통장사본 |
contract |
계약서 (용역, 공급, 유지보수 등) |
other |
기타 문서 |
imap_trigger
│
▼
if_attachements ──(첨부파일 없음)──> [종료]
│
▼
split_attachments
│
▼
filter_pdf ──(PDF 아님)──> [종료]
│
▼
setup (gid, uid 설정)
│
▼
extract_attachments
│
├──────────────────────────────┐
▼ ▼
hash_file loop
│ │
▼ ▼
restore_binary_file1 extract_pdf
│ │
▼ ▼
sftp (파일 업로드) clean_text
│ │
▼ ▼
mapping1 if_ocr
│ ┌───┴───┐
│ ▼ ▼
│ [텍스트O] [텍스트X]
│ │ │
│ │ restore_binary_file
│ │ │
│ │ upstage_ocr
│ │ │
│ └───┬───┘
│ ▼
│ mapping
│ │
└──────────────────────────────┘
│
▼
merge_info
│
▼
get_file_info (AI 분류/파싱)
│
▼
split_out
│
┌───────────┴───────────┐
▼ ▼
convert_item_db convert_item_redis
│ │
▼ ▼
insert_db publish_redis
- Email Read IMAP
- Code
- If / Filter
- Set
- Extract From File
- HTTP Request
- FTP (SFTP)
- Merge
- MySQL
- Redis
- LangChain (Chain LLM, OpenAI Chat Model, Structured Output Parser)
- IMAP 이메일 서버: 이메일 수신용
- Upstage API: OCR 처리 (Document Digitization API)
- OpenAI API: 문서 분류 및 파싱 (GPT-4.1-mini)
- SFTP 서버: 파일 저장
- MySQL 데이터베이스: 메타데이터 저장
- Redis 서버: 실시간 알림
n8n에서 다음 credentials를 설정해야 합니다:
- IMAP: 이메일 서버 접속 정보
- HTTP Bearer Auth: Upstage API 키
- OpenAI API: OpenAI API 키
- SFTP: 파일 서버 접속 정보
- MySQL: 데이터베이스 접속 정보
- Redis: Redis 서버 접속 정보
files 테이블이 필요합니다:
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
gid INT,
uid INT,
saleser VARCHAR(255),
fname VARCHAR(255),
hashed_fname VARCHAR(255),
fpath VARCHAR(512),
fsize BIGINT,
format VARCHAR(50),
category VARCHAR(50),
parsed TINYINT,
source VARCHAR(50),
ocr_result LONGTEXT,
parsing_result JSON,
metadata JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);SFTP 서버에 다음 디렉토리 구조가 필요합니다:
/data/saleser/files/{gid}/_email/
{
"gid": 1,
"uid": 0,
"saleser": "",
"fname": "견적서_2024.pdf",
"hashed_fname": "a1b2c3d4...xyz.pdf",
"fpath": "/data/saleser/files/1/_email/a1b2c3d4...xyz.pdf",
"fsize": 123456,
"format": "pdf",
"category": "quotation",
"parsed": 1,
"source": "email",
"ocr_result": "문서 전체 텍스트...",
"parsing_result": {
"documentType": "quotation",
"parsedData": {
"project": "프로젝트명",
"name": "발행업체명",
"recv": "수신업체명",
"date": "2024-01-15",
"total": 11000000,
"items": [...]
}
},
"metadata": "{\"sender\":\"sender@example.com\",\"receiver\":\"receiver@example.com\"}"
}채널: noti:group:{gid}:email
{
"gid": 1,
"type": "email",
"title": "이메일 제목",
"message": "이메일 본문",
"data": "[...파싱된 첨부파일 배열...]",
"timestamp": "2024-01-15 10:30:00"
}- PDF 텍스트 추출 실패: Upstage OCR API로 자동 전환
- OCR 실패:
parsed: 0,category: "other"로 저장 - AI 파싱 실패: 기본 "other" 카테고리로 분류
MIT License