B2G 납품확인서 문서 자동화하기 — 2주차: 실행 편

001_삼성웰스토리_구로사업소_빽사리_납품확인서.pdf
83.73KB


**소개**

지난 1주차에서 Claude Plan Mode로 기획서와 프로세스 구조도를 완성했습니다.
이번 2주차에서는 기획을 실제 동작하는 코드로 구현하고, 테스트 발송까지 완료했습니다.
"기획이 탄탄하면 실행은 빠르다"는 걸 이번 주에 몸소 체감했습니다.

---

**이번 주 목표**

- 납품확인서 양식을 그대로 재현한 PDF 자동 생성
- 서명 이미지 자동 삽입
- Gmail을 통한 개별 메일 자동 발송
- 사람이 각 단계를 검토·승인하는 구조 구현

---

**핵심 원칙 재확인 — Reference 넣기**

1주차에서 세운 3가지 원칙 중 이번 주 가장 효과를 본 것은 "세부 업무마다 참고 자료(Reference) 넣기" 였습니다.

Claude에게 납품확인서 양식을 그냥 설명하는 게 아니라, 실제 파일 자체를 던져줬습니다.

제공한 Reference:
- 납품확인서 양식.pdf — 실제 사용 중인 양식 원본
- 납품확인서 양식.xlsx — 동일 양식의 엑셀 버전
- 서명.jpg — 납품 담당자 서명 이미지

Claude가 PDF를 직접 읽고 레이아웃, 색상, 테이블 구조, 서명 위치까지 분석한 뒤
동일한 디자인의 PDF를 생성하는 코드를 작성했습니다.
설명으로 지시하는 것보다 훨씬 정확하고 빠르게 결과가 나왔습니다.

---

**실행 과정**

**1단계 — 폴더 구조 설계**

Claude가 제안한 파일 구조는 아래와 같습니다.

```
delivery-note/
├── data/
│   └── recipients.xlsx        ← 수신자 목록 (사람이 직접 관리)
├── output/pdf/                ← 생성된 PDF 저장
├── logs/
│   └── send_log.csv           ← 발송 결과 로그
├── config.py                  ← 이메일 계정, 경로 설정
├── step1_generate_pdf.py      ← PDF 생성
└── step2_send_email.py        ← 메일 발송
```

파일을 단계별로 분리한 덕분에 PDF 생성과 메일 발송을 독립적으로 실행·검토할 수 있었습니다.
이게 바로 사람이 주도권을 갖는 구조입니다.

---

**2단계 — PDF 생성**

수신자 목록 엑셀(`recipients.xlsx`)을 읽어 담당자별 납품확인서를 자동으로 PDF로 생성합니다.

실행 명령어는 단 한 줄입니다.

```
python step1_generate_pdf.py
```

생성 결과:

```
[1] 001_삼성웰스토리_구로사업소_빽사리_납품확인서.pdf
PDF 1건 생성 완료 → output/pdf/
```

생성된 PDF를 열어보니 원본 양식과 거의 동일하게 재현되었고,
서명 이미지도 검수담당자 서명란 정확한 위치에 자동으로 들어갔습니다.

*[PDF 생성 결과 — 원본 양식과 동일한 레이아웃, 서명 이미지 자동 삽입]*

---

**⏸ 사람 검토 ① — PDF 샘플 육안 확인**

전체 발송 전에 생성된 PDF를 직접 열어 확인했습니다.

체크한 항목:
- 납품처명, 담당자명 정확히 들어갔는지
- 품목·수량·금액 오류 없는지
- 서명 이미지 위치와 크기
- 전체 레이아웃 깨짐 없는지

문제 없으면 다음 단계로 진행, 문제 있으면 양식 수정 후 재생성합니다.
**이 검토 단계가 있어서 100건을 발송해도 실수가 없습니다.**

---

**3단계 — Gmail 연동 설정**

일반 Gmail 비밀번호는 Python 코드에서 직접 사용할 수 없습니다.
Google이 프로그램의 직접 접속을 보안상 막아두기 때문입니다.

해결 방법은 Gmail App Password(앱 비밀번호) 발급입니다.

```
myaccount.google.com/security 접속
② 2단계 인증 활성화 확인
myaccount.google.com/apppasswords 접속
④ 앱 이름 입력 → [만들기] → 16자리 비밀번호 복사
config.py 에 붙여넣기
```

발급된 비밀번호를 config.py에 한 줄 입력하면 설정 완료입니다.

```python
SENDER_APP_PASSWORD = "발급받은 16자리 비밀번호"
TEST_MODE = True   # 테스트 중엔 True 유지
```

`TEST_MODE = True` 상태에서는 모든 메일이 지정된 테스트 주소로만 발송됩니다.
실수로 100명에게 테스트 메일을 보내는 사고를 방지하는 안전장치입니다.

---

**4단계 — 테스트 발송**

```
python step2_send_email.py
```

실행하면 아래처럼 발송 진행 상황이 실시간으로 출력됩니다.

```
=== STEP 2: 납품확인서 메일 발송 [테스트 모드] ===
  모든 메일 → [email protected] 으로만 발송됩니다.
 
발송 건수: 1건

  계속하려면 Enter 를 누르세요 (Ctrl+C 로 취소) ...
  Gmail 연결 성공

  [1] 삼성웰스토리 구로사업소 빽사리 → [email protected]  [OK]

발송 완료: 성공 1건 / 실패 0건
로그 저장 완료 → logs/send_log.csv
```

---

**⏸ 사람 검토 ② — 수신 메일 최종 확인**

네이버 메일로 수신된 테스트 메일을 직접 확인했습니다.

확인 항목:
- 제목: [납품확인] 삼성웰스토리 구로사업소 납품확인서 송부의 건
- 본문: 담당자명·부대명·납품일자가 개별화된 메일 문구
- 첨부파일: 납품확인서 PDF 정상 첨부

*[수신 메일 화면 — 개별화된 제목, 본문, PDF 첨부 확인]*

---

**결과물**

이번 주에 완성된 산출물입니다.

- step1_generate_pdf.py — 수신자 목록에서 개인별 납품확인서 PDF 자동 생성
- step2_send_email.py — Gmail을 통한 개별 메일 자동 발송 (첨부 포함)
- config.py — 발송 계정, 경로, 메일 문구 템플릿 통합 관리
- logs/send_log.csv — 발송 성공/실패 자동 기록

---

**배운 점**

**Reference를 파일로 직접 제공하면 설명이 필요 없다.**
납품확인서 디자인을 말로 설명하는 대신, 실제 PDF 파일을 Claude에게 주었습니다.
Claude가 레이아웃부터 색상, 서명 위치까지 직접 분석해서 완벽하게 재현했습니다.
앞으로 자동화할 문서가 있다면 원본 파일을 먼저 챙기는 게 핵심이라는 걸 배웠습니다.

**단계를 쪼개면 사람이 통제권을 갖는다.**
PDF 생성과 메일 발송을 별도 스크립트로 분리했습니다.
덕분에 PDF를 검토한 뒤 발송하고, 발송 전에 목록을 다시 한 번 확인하는 흐름이 자연스럽게 만들어졌습니다.
AI가 다 처리하는 게 아니라 사람이 각 단계의 OK를 내리는 구조입니다.

**TEST_MODE 하나가 심리적 안전망이 된다.**
100명 발송 전에 내 메일로 먼저 받아보는 과정이 있다는 것만으로도 마음이 편했습니다.
실수로 잘못된 파일이 전송되거나, 문구에 오류가 있을 때 막아주는 마지막 방어선입니다.

---
 

3
2개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.