이메일 첨부파일 일일이 저장하지 마세요! 파이썬으로 자동 다운로드하기

이메일 첨부파일 일일이 저장하지 마세요! 파이썬으로 자동 다운로드하기 (완성 코드 공개)

파이썬으로 이메일 첨부파일을 자동으로 다운로드하는 모습


"거래처마다 매일 보내오는 발주서 첨부파일을 하나씩 다운로드해서 폴더에 저장한다", "특정 제목의 이메일에 첨부된 엑셀만 골라서 받아야 한다", "며칠치 밀린 이메일 첨부파일을 한꺼번에 다운로드해야 한다"…

이전 게시글 이메일 자동 발송 편에서는 메일을 "보내는" 자동화를 다뤘습니다. 이번에는 반대로 메일함에 도착한 이메일에서 첨부파일을 자동으로 "받아서" 저장하는 방법을 소개합니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

이번 스크립트는 파이썬 기본 내장 라이브러리(imaplib, email)만 사용합니다. 별도 설치가 필요 없습니다. IMAP 프로토콜로 메일 서버에 직접 접속하는 방식이라 구글 API 발급 같은 복잡한 절차도 필요 없습니다.

⚠️ 지메일 사용 시 필수 설정: 지메일 계정으로 접속하려면 일반 로그인 비밀번호가 아닌 앱 비밀번호가 필요합니다. 구글 계정 관리 → 보안 → 2단계 인증 활성화 후 → "앱 비밀번호"에서 16자리 비밀번호를 발급받아 사용하세요.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, email_download.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import imaplib
import email
from email.header import decode_header
from pathlib import Path
from datetime import datetime

# ① 설정
IMAP_SERVER   = "imap.gmail.com"        # ← 네이버는 imap.naver.com
EMAIL_ADDRESS = "내이메일@gmail.com"     # ← 본인 이메일 주소
EMAIL_PASSWORD = "16자리앱비밀번호"       # ← 앱 비밀번호 (일반 비밀번호 아님)
SAVE_DIR      = r"C:\Users\내이름\Desktop\첨부파일_다운로드"  # ← 저장 폴더

SEARCH_KEYWORD = "발주서"    # ← 제목에 이 단어가 포함된 메일만 처리 (빈칸이면 전체)
MAX_EMAILS     = 20          # ← 최근 몇 개까지 확인할지

# ② 저장 폴더 준비
save_dir = Path(SAVE_DIR)
save_dir.mkdir(parents=True, exist_ok=True)

# ③ 메일 서버 접속
print("  ▶ 메일 서버 접속 중...")
mail = imaplib.IMAP4_SSL(IMAP_SERVER)
mail.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
mail.select("inbox")
print("  ✔ 접속 완료")

# ④ 메일 검색 (제목에 키워드 포함, 없으면 전체)
if SEARCH_KEYWORD:
    status, messages = mail.search(None, f'(SUBJECT "{SEARCH_KEYWORD}")')
else:
    status, messages = mail.search(None, "ALL")

email_ids = messages[0].split()
email_ids = email_ids[-MAX_EMAILS:]   # 최근 N개만
print(f"  ✔ 검색된 이메일: {len(email_ids)}개")

# ⑤ 각 메일에서 첨부파일 추출
downloaded_count = 0

for eid in email_ids:
    status, msg_data = mail.fetch(eid, "(RFC822)")
    raw_email = msg_data[0][1]
    msg = email.message_from_bytes(raw_email)

    # 제목 디코딩 (한글 깨짐 방지)
    subject, encoding = decode_header(msg["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding or "utf-8")

    # 발신자, 날짜 정보
    sender = msg.get("From", "알수없음")
    date_str = msg.get("Date", "")

    # 첨부파일 탐색
    for part in msg.walk():
        if part.get_content_maintype() == "multipart":
            continue
        if part.get("Content-Disposition") is None:
            continue

        filename = part.get_filename()
        if filename:
            # 파일명 디코딩
            decoded_name, enc = decode_header(filename)[0]
            if isinstance(decoded_name, bytes):
                decoded_name = decoded_name.decode(enc or "utf-8")

            # 중복 방지를 위해 날짜 접두어 추가
            today = datetime.now().strftime("%Y%m%d")
            save_name = f"{today}_{decoded_name}"
            save_path = save_dir / save_name

            with open(save_path, "wb") as f:
                f.write(part.get_payload(decode=True))

            print(f"  ✔ 다운로드: {decoded_name}  (제목: {subject[:20]}...)")
            downloaded_count += 1

mail.logout()
print(f"\n✅ 완료! 총 {downloaded_count}개 첨부파일 다운로드 → {SAVE_DIR}")

3단계: 실행 방법

  1. 코드 ① 설정의 EMAIL_ADDRESSEMAIL_PASSWORD(앱 비밀번호)를 입력합니다.
  2. SAVE_DIR에 첨부파일을 저장할 폴더 경로를 입력합니다.
  3. SEARCH_KEYWORD에 원하는 제목 키워드를 입력하거나, 전체 메일을 확인하려면 빈 문자열("")로 둡니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python email_download.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ▶ 메일 서버 접속 중...
  ✔ 접속 완료
  ✔ 검색된 이메일: 4개
  ✔ 다운로드: 6월_발주서_A상사.xlsx  (제목: [발주] 6월 발주서 전달...)
  ✔ 다운로드: 발주내역_확인요청.pdf  (제목: 발주서 확인 부탁드립니다...)

✅ 완료! 총 2개 첨부파일 다운로드 → C:\Users\내이름\Desktop\첨부파일_다운로드

4단계: 자주 발생하는 오류와 해결법

오류 1: imaplib.IMAP4.error: [AUTHENTICATIONFAILED]

일반 로그인 비밀번호를 입력한 경우입니다. 지메일은 반드시 앱 비밀번호를 사용해야 합니다. 1단계의 설정 방법을 다시 확인하세요.

오류 2: 첨부파일이 하나도 다운로드되지 않음

SEARCH_KEYWORD와 일치하는 메일이 없거나, 해당 메일에 실제 첨부파일이 없는 경우입니다. SEARCH_KEYWORD = ""로 비워서 전체 메일을 대상으로 먼저 테스트해보세요.

오류 3: 한글 파일명이 깨짐

코드에 이미 decode_header()로 파일명 디코딩 처리가 포함되어 있습니다. 그래도 깨진다면 발신 메일 프로그램이 비표준 인코딩을 사용했을 가능성이 있습니다. enc or "utf-8" 부분을 enc or "cp949"로 바꿔서 시도해보세요.


응용: 특정 발신자의 메일만 골라서 다운로드하기

제목이 아닌 발신자 기준으로 필터링하고 싶다면 코드 ④의 검색 조건을 아래처럼 바꾸면 됩니다.

SENDER_EMAIL = "partner@example.com"   # ← 특정 발신자 이메일

status, messages = mail.search(None, f'(FROM "{SENDER_EMAIL}")')
💡 이전 게시글과 결합하면: 다운로드된 첨부파일이 엑셀이라면 엑셀 자동 병합 편과 연결해 여러 거래처의 발주서를 하나로 합치거나, 스케줄러 편과 결합해 매일 아침 자동으로 새 첨부파일을 확인하는 것도 가능합니다.

핵심 요약

  • 준비물: Python 기본 내장 라이브러리만 사용 (별도 설치 불필요) + 지메일 앱 비밀번호 발급
  • 설정: EMAIL_ADDRESS, EMAIL_PASSWORD, SAVE_DIR, SEARCH_KEYWORD 수정
  • 실행: 터미널에서 python email_download.py 입력
  • 결과: 조건에 맞는 메일의 첨부파일이 날짜 접두어와 함께 자동 저장

이 코드를 응용하면 다운로드한 첨부파일을 발신자별로 폴더를 나눠 저장하거나, 다운로드 완료 후 자동으로 확인 답장을 보내는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁