파이썬자동화

[파이썬 업무자동화] 첨부파일 각각 다르게! 수십 명에게 메일 5초 만에 대량 발송하는 법

mumuverse 2026. 5. 28. 20:43
반응형

안녕하세요! 지난 시간(Step 10)에는 수만 행짜리 거대한 통계 마스터 엑셀 파일 하나를 읽어서, 내가 원하는 기준에 따라 단 1초 만에 수십 개의 지점별·부서별 파일로 칼같이 분할 저장하는 놀라운 판다스(Pandas) 기술을 마스터했습니다.

자, 이제 내 컴퓨터 폴더 안에 이쁘게 쪼개진 엑셀 파일 30~40개가 다다닥 생성되어 있을 텐데요. 진짜 지옥은 지금부터 시작됩니다. 이 파일들을 각 지점 담당자들에게 보내기 위해 메일 창을 켜고, [쓰기] 버튼을 누르고, 담당자 주소를 찾고, "서울지점 실적입니다"라고 쓴 뒤 서울 파일을 첨부하고 발송... 이 짓을 수십 번 반복하다 보면 머리가 지끈거리고 "내가 지금 무얼 하고 있나" 자괴감이 밀려옵니다.

오늘 완성할 프로그램은 이 지루한 복사 붙여넣기 배포 과정을 단 5초 만에 끝내버리는 '이메일 개별 대량 발송 자동화 시스템'입니다. 파이썬이 스스로 네이버, 다음, 또는 구글 메일 서버에 접속하여 담당자 리스트를 읽고, 각 담당자에 맞는 첨부파일을 자석처럼 정확하게 매칭하여, 단 몇 초 만에 수십 명에게 개별 메일을 동시다발적으로 쏴주는 마법입니다. 이번에도 초등학생 눈높이로 한 줄 한 줄 묵직하게 풀어드릴 테니 나만의 무기를 장착해 보세요!

💡 잠깐! 메일로 보낼 수십 개의 분할 파일들이 아직 준비되지 않으셨나요?
오늘 실습은 내 컴퓨터 안에 담당자별로 '이미 쪼개져 있는 파일들'이 존재해야 완벽하게 구동할 수 있습니다. 수만 줄짜리 대형 마스터 시트에서 마우스 클릭 한 번 없이 지점별 조각 파일을 다다닥 만들어내는 자동 분할 치트키를 아직 안 보셨다면, 무조건 지난 Step 10 연재 글을 먼저 정독하고 오셔야 오늘 코드와 결합해 백점짜리 무인 시스템을 완성할 수 있습니다!
 

[파이썬 업무자동화] 대용량 마스터 엑셀 파일, 클릭 한 번에 지점별·팀별 파일 수십 개로 자동

안녕하세요! 지난 시간(Step 9)에는 여러 팀이나 지점에서 제각각 보낸 수십 개의 엑셀 파일들을 파이썬 판다스(Pandas)를 이용해 눈 깜짝할 사이인 '단 1초' 만에 완벽한 하나의 마스터 표로 합치고

mumuverse.tistory.com

 

※ 기업 업무 규정 및 메일 보안 가이드라인
본 포스팅에서 다루는 이메일 발송 스크립트는 네이버, 구글 등 공인된 대형 포털의 표준 암호화 통신망(SSL/TLS)을 준수합니다. 사내 인트라넷이 아닌 외부 범용 메일 주소를 활용한 순수 업무 효율화 목적의 로컬 실행 스크립트이며, 발송에 필요한 비밀번호(앱 비밀번호)는 외부 서버가 아닌 오직 본인의 PC 메모리 내부에서만 안전하게 처리되므로 보안 가이드라인 내에서 안심하고 실습하실 수 있습니다.

1. 메일 자동화의 핵심 엔진: SMTP와 MIME 이해하기

파이썬으로 이메일을 자동으로 보낼 때는 별도의 복잡한 프로그램을 설치할 필요가 없습니다. 파이썬이 기본으로 제공하는 두 가지 강력한 내장 라이브러리만 있으면 됩니다.

  • smtplib (가상 우체부): SMTP(Simple Mail Transfer Protocol)는 인터넷을 통해 메일을 보낼 때 사용하는 전 세계 표준 통신 규칙입니다. 이 라이브러리는 파이썬이 직접 네이버나 구글 우체국 서버로 찾아가 "이 메일 좀 전송해 주세요!" 하고 편지를 접수하는 가상 우체부 역할을 담당합니다.
  • email 라이브러리 (편지 봉투와 상자): 글자만 들어있는 단순한 쪽지가 아니라 제목, 본문, 그리고 결정적으로 '첨부파일'까지 이쁘게 포장해서 우체부에게 넘겨주어야 겠죠? 편지 내용물과 첨부파일을 단단하게 포장해 주는 택배 상자 역할을 하는 도구입니다.

2. 사전 준비: 네이버/구글 메일 '앱 비밀번호' 발급받기

파이썬 코드를 돌리기 전, 가장 중요하고 초보자가 가장 많이 헤매는 필수 단계입니다. 메일 사이트에 로그인할 때 쓰는 일반 비밀번호를 코드에 그대로 넣으면 보안 차단 에러가 발생합니다. 반드시 아래 설정을 통해 '파이썬 전용 일회용 비밀번호'를 얻어야 합니다.

[네이버 메일 기준 세팅법]

  1. 네이버 로그인 후 [내 정보] -> [보안설정] -> [2단계 인증]을 먼저 설정합니다.
  2. 2단계 인증 메뉴 바로 아래에 있는 [기기별 애플리케이션 비밀번호 관리]로 들어갑니다.
  3. 종류 선택에서 '종류 선택(기타)'을 누르고 이름을 '파이썬자동화'라고 적은 뒤 [생성]을 누릅니다.
  4. 화면에 발급된 영문 대소문자가 섞인 16자리 비밀번호를 메모장에 잘 복사해 둡니다. 이 값을 코드의 패스워드 칸에 넣어주면 만사형통입니다!

3. 이메일 개별 첨부 대량 발송 전체 소스 코드

아래 코드는 네이버 메일 서버를 엔진으로 삼아, 준비된 명단 리스트를 돌며 각각 다른 첨부파일을 장착해 발송하는 마스터 소스 코드입니다. 연두색 주석을 한 줄씩 읽어보시면 누구나 쉽게 이해하고 본인 정보로 커스텀할 수 있습니다.


import smtplib  # 메일 서버와 연결하는 가상 우체부 도구
import os
from email.mime.multipart import MIMEMultipart # 메일의 제목, 본문, 첨부파일을 포장하는 큰 상자
from email.mime.text import MIMEText           # 메일 본문 글자를 담는 속상자
from email.mime.application import MIMEApplication # 첨부파일을 안전하게 포장하는 특수 주머니

# =========================================================================
# [사용자 설정 영역] 보내는 사람의 메일 계정 정보와 포털 세팅을 주입합니다.
# =========================================================================
SMTP_SERVER = "smtp.naver.com"  # 네이버 메일 발송 서버 주소 (구글은 smtp.gmail.com)
SMTP_PORT = 465                 # 네이버 암호화 통신 포트 번호
SENDER_EMAIL = "본인아이디@naver.com"  # 보내는 사람의 실제 네이버 메일 주소
SENDER_PASSWORD = "발급받은_16자리_앱비밀번호" # 위에서 메모장에 적어둔 애플리케이션 비밀번호

# [핵심 업무 명단 데이터] 누구에게 어떤 파일명을 보낼지 정의한 리스트 배열입니다.
# 실무에서는 이 명단을 지난 9단원에서 배운 엑셀 파일에서 한 번에 읽어와 반복문을 돌릴 수도 있습니다!
target_list = [
    {"name": "서울지점", "email": "seoul_manager@naver.com", "file": "매출출력_서울지점.xlsx"},
    {"name": "부산지점", "email": "busan_manager@gmail.com", "file": "매출출력_부산지점.xlsx"},
    {"name": "대구지점", "email": "daegu_manager@daum.net", "file": "매출출력_대구지점.xlsx"}
]

print("⚙️ 이메일 개별 대량 발송 시스템을 가동합니다.")

try:
    # 1. 암호화 보안망(SMTP_SSL)을 구축하여 네이버 메일 서버에 안전하게 접속합니다.
    print("-> 우체국 서버에 접속을 시도하는 중...")
    server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
    
    # 2. 내 아이디와 전용 앱 비밀번호로 당당하게 통신망 로그인을 수행합니다.
    server.login(SENDER_EMAIL, SENDER_PASSWORD)
    print("👉 로그인 성공! 순차적으로 개별 맞춤 메일 발송을 시작합니다.\n")
    
    # 3. 명단 리스트를 한 명씩 순서대로 돌며 맞춤 편지를 조립합니다.
    for target in target_list:
        print(f"   [발송 대기] -> 받는 이: {target['name']} ({target['email']})")
        
        # 메일 내용물을 통틀어 담을 대형 겉상자(MIMEMultipart) 개설
        msg = MIMEMultipart()
        msg['From'] = SENDER_EMAIL
        msg['To'] = target['email']
        # 받는 사람의 이름을 제목에 자동으로 합성하는 개인화 빌드업!
        msg['Subject'] = f"📢 [실적 보고] {target['name']} 당월 매출 통계 및 정산 서식 송부"
        
        # 메일 본문 내용 작성 (글자 포장)
        body_content = (
            f"안녕하세요, {target['name']} 담당자님.\n\n"
            "본사 자동화 시스템에서 발송하는 메일입니다.\n"
            f"요청하신 당월 [{target['name']}]의 정산 보고서 파일을 첨부해 드립니다.\n"
            "내용을 확인하신 뒤 이상이 없을 경우 회신 부탁드립니다.\n\n"
            "감사합니다.\n본사 자동화 시스템 비서 드림."
        )
        msg.attach(MIMEText(body_content, 'plain', 'utf-8'))
        
        # 4. [첨부파일 조립 영역] 파일이 실제로 존재하는지 체크한 뒤 봉투에 담습니다.
        file_path = f"./분할결과폴더/{target['file']}" # 파일이 살고 있는 로컬 주소
        
        if os.path.exists(file_path):
            # 파일을 바이너리(컴퓨터 언어) 모드로 열어서 주머니에 담아 붙입니다.
            with open(file_path, "rb") as f:
                attachment = MIMEApplication(f.read())
                
            # 이메일에 찍힐 순수한 첨부파일명의 인코딩과 레이블을 지정합니다.
            attachment.add_header('Content-Disposition', 'attachment', filename=target['file'])
            msg.attach(attachment)
            print(f"   [파일 첨부] ✔ '{target['file']}' 파일 결합 완료")
        else:
            print(f"   ⚠️ 경고: 첨부파일 '{target['file']}'을 찾을 수 없어 파일 없이 발송을 시도합니다.")
            
        # 5. 완성된 택배 상자(msg)를 문자열 형태로 벼려내어 최종 발송을 쾅 찌릅니다!
        server.sendmail(SENDER_EMAIL, target['email'], msg.as_string())
        print(f"   [발송 완료] 👉 {target['name']}님에게 편지 배달 성공!\n")
        
    print("==================================================")
    print("🎉 [종합 발송 완수] 모든 담당자에게 맞춤형 메일 배포를 마쳤습니다!")
    print("==================================================")

except Exception as e:
    print(f"❌ 서버 통신 중 치명적인 에러 발생: {e}")
    
finally:
    # 6. 모든 우편 접수 업무가 끝나면 서버와의 연결을 안전하게 차단하여 마무리합니다.
    server.quit()
    print("\n메일 서버와의 연결을 안전하게 종료했습니다.")
    
🎯 "메일 발송 결과와 에러 알림을 실시간으로 내 핸드폰으로 받고 싶다면?"
수십 명에게 대량 메일을 보낼 때, 혹시나 중간에 주소가 틀려서 전송이 실패했거나 전 과정이 무사히 끝났다는 완료 보고를 PC 모니터 앞이 아닌 내 스마트폰 메신저로 실시간 띵동! 소리와 함께 원격 수신하고 싶다면 지난 단원에서 마스터했던 API 통신 봇 연동 코드를 이 루프(for문) 끝자락에 조립해 보세요. 완벽한 양방향 지능형 비서가 완성됩니다.
 

[파이썬 업무자동화] 관리비 명세서 확인을 내 폰으로! 실시간 메신저 알림 봇 연동 가이드

안녕하세요! 지난 시간(Step 6)에 파이썬이 사람 대신 아파트 관리비 조회 사이트에 알아서 접속하고, 아이디와 비밀번호를 입력해 당월 청구 금액을 싹 가로채 오는 짜릿한 실전 자동화 프로그램

mumuverse.tistory.com

 

4. 대량 메일 발송 시 차단당하지 않는 프로들의 필수 노하우

  • 발송 간격 조절(time.sleep)은 필수: 파이썬의 연산 속도는 무시무시하게 빠르기 때문에 0.1초 만에 메일 50개를 동시에 찌를 수 있습니다. 하지만 네이버나 구글 서버 입장에서는 짧은 순간에 무차별적으로 편지가 인입되면 '악성 스팸 매크로 공격'으로 오인하여 내 계정을 영구 정지시킬 위험이 있습니다. 발송 코드가 끝나는 지점에 time.sleep(2)를 추가하여 2~3초씩 매너 있는 휴식 시간을 주는 것이 실무형 프로들의 철칙입니다.
  • html 서식 본문 확장: 투박한 일반 텍스트가 아닌, 글자에 색상을 입히거나 로고 이미지가 들어간 회사 양식의 메일을 보내고 싶다면 MIMEText("내용", 'html', 'utf-8') 옵션을 주어 HTML 태그를 본문에 그대로 주입하여 화려한 안내 메일을 쏠 수도 있습니다.

당신을 위한 실무 자동화 가이드

마치며

여러 지점의 파일들을 취합하고(Step 9), 마스터 파일을 지점별로 쪼개고(Step 10), 마지막으로 오늘 각각의 첨부파일을 담아 이메일 대량 발송(Step 11)까지 완벽하게 완수해 냈습니다! 이로써 '사내 정산 및 배포 자동화 파이프라인'이라는 거대한 실무 자동화의 큰 줄기가 마침내 완성되었습니다.

지금까지 파일과 메일을 주무르는 고차원 기술을 배웠으니, 다음 단계에는 직장인들이 보고서 작성을 위해 매일 만지는 또 하나의 거대한 장벽을 허물어 볼까 합니다. 바로 '웹사이트 화면이나 엑셀 표 데이터를 기반으로 깔끔한 워드(.docx) 보고서나 파워포인트(PPT) 슬라이드 수십 장을 마우스 조작 없이 텍스트 타이핑만으로 자동 생성하고 인쇄 포맷까지 잡아주는 문서 자동화 시스템'의 세계가 펼쳐집니다. 다음 단원인 [Step 12: 복사 붙여넣기 탈출! 파이썬으로 Word 보고서 자동 작성 및 서식 서플라이 엔진 만들기] 편에서 만나요. 오늘 수십 명에게 이메일 꽂아 넣기 성공하신 분들은 통쾌한 성공 소감을 댓글로 공유해 주세요. 감사합니다!

반응형