카테고리: 업무 자동화

파이썬 이메일 자동 발송하기 - 지메일(Gmail) 자동화 스크립트 (smtplib)

목차8개 항목

안녕하세요! Mojangcam입니다 😎

지난번 파이썬 업무 자동화 #1 - 엑셀 자동화 입문(openpyxl) 에서 엑셀 보고서를 자동으로 만들어봤는데요. 그럼 이제 이런 생각이 들죠. "만든 보고서를 매번 손으로 메일에 첨부해서 보내야 하나…?" 아니죠! 오늘은 파이썬으로 지메일을 자동 발송하는 스크립트를 만들어볼게요. 첨부파일까지 붙여서요!

이거 하나면 매일 아침 보고서 발송, 서버 장애 알림, 일일 리포트 전송 같은 반복 업무가 전부 자동이 돼요 💡

📌 준비물

  • Python 3.8+ (작성 기준: Python 3.14.6) — smtplib와 email 모두 기본 내장이라 pip 설치가 필요 없어요!
  • 지메일 계정 + 2단계 인증 활성화
  • 앱 비밀번호(App Password) — 아래 1단계에서 발급법 설명

가상환경을 쓰고 있다면 파이썬 가상환경(venv) 완벽 정리 글도 참고하세요!

📌 1단계 - 지메일 앱 비밀번호 발급

예전에는 "보안 수준이 낮은 앱 허용"으로 일반 비밀번호를 썼지만, 이 방식은 2025년 5월부로 완전히 종료됐어요. 이제는 반드시 앱 비밀번호(또는 OAuth)를 써야 합니다.

  1. 구글 계정 → 보안 → 2단계 인증 켜기 (이미 켜져 있으면 패스)
  2. 계정 검색창에 "앱 비밀번호" 검색 → 이름을 적당히 입력(예: python-mail) → 만들기
  3. 화면에 뜨는 16자리 코드를 복사해두기 (다시 볼 수 없으니 주의!)

⚠️ 이 16자리는 비밀번호랑 똑같이 취급해야 해요. 코드에 직접 박아서 깃허브에 올리면 안 돼요!

📌 2단계 - 기본 메일 발송 코드

Python
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["Subject"] = "파이썬 자동 발송 테스트 📧"
msg["From"] = "본인주소@gmail.com"
msg["To"] = "받는사람@example.com"
msg.set_content("안녕하세요!\n이 메일은 파이썬이 자동으로 보냈어요.")

with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
    smtp.login("본인주소@gmail.com", "16자리앱비밀번호")
    smtp.send_message(msg)

print("발송 완료! ✅")

하나씩 뜯어볼게요 💡

  • EmailMessage : 제목·보내는사람·받는사람·본문을 담는 메일 객체예요. 한글 인코딩도 알아서 처리해줘요.
  • SMTP_SSL("smtp.gmail.com", 465) : 지메일 SMTP 서버에 SSL로 접속해요. 587 포트 + starttls() 방식도 있는데 둘 중 하나만 쓰면 돼요.
  • login(주소, 앱비밀번호) : 여기에 일반 비밀번호를 넣으면 무조건 실패해요. 꼭 1단계의 16자리 코드를 넣으세요.
  • with 문 : 발송이 끝나면 연결을 자동으로 닫아줘요.

📌 3단계 - 첨부파일 + 여러 명에게 보내기

엑셀 보고서 같은 파일을 붙여볼게요.

코드
with open("보고서.xlsx", "rb") as f:
    file_data = f.read()

msg.add_attachment(
    file_data,
    maintype="application",
    subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    filename="보고서.xlsx",
)
  • add_attachment : 파일을 바이너리(rb)로 읽어 첨부해요. maintype/subtype은 파일 종류 표시인데, 잘 모르겠으면 application/octet-stream을 써도 돼요.
  • 여러 명에게 보내려면 msg["To"] = "a@x.com, b@y.com" 처럼 쉼표로 이어주면 돼요.

📌 전체 코드 (복붙 OK)

코드
# Python 3.8+ (작성 기준: 3.14.6) / 표준 라이브러리만 사용 (설치 불필요)
import smtplib
from email.message import EmailMessage

SENDER = "본인주소@gmail.com"
APP_PASSWORD = "16자리앱비밀번호"  # 절대 일반 비밀번호 아님!
TO = "받는사람@example.com"

msg = EmailMessage()
msg["Subject"] = "[자동] 오늘의 보고서입니다 📧"
msg["From"] = SENDER
msg["To"] = TO
msg.set_content("안녕하세요!\n오늘자 보고서를 첨부합니다.\n좋은 하루 보내세요!")

# 첨부파일 (없으면 이 블록은 지워도 돼요)
with open("보고서.xlsx", "rb") as f:
    msg.add_attachment(
        f.read(),
        maintype="application",
        subtype="octet-stream",
        filename="보고서.xlsx",
    )

with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
    smtp.login(SENDER, APP_PASSWORD)
    smtp.send_message(msg)

print("발송 완료! ✅")

📌 실행 결과

코드
발송 완료! ✅

📌 자주 나는 에러

  1. SMTPAuthenticationError (535 / 534-5.7.9) — 원인: 일반 비밀번호를 썼거나, 예전 튜토리얼의 "보안 수준이 낮은 앱" 방식을 따라한 경우예요 (2025년 5월 종료). 해결: 2단계 인증 활성화 후 앱 비밀번호 16자리로 로그인하세요.
  2. 발송은 되는데 스팸함으로 들어감 — 원인: 제목/본문이 너무 짧거나 같은 내용을 단시간에 반복 발송한 경우예요. 해결: 본문을 성의있게 채우고, 대량 발송은 간격(time.sleep)을 두세요. 지메일 일일 발송 한도(일반 계정 기준 약 500통)도 주의!
  3. UnicodeDecodeError / 첨부파일 이름 깨짐 — 원인: 파일을 텍스트 모드(r)로 열었거나 구버전 방식(MIMEText 조합)을 쓴 경우예요. 해결: 첨부는 반드시 rb 모드로 열고, 위 코드처럼 EmailMessage + add_attachment를 쓰면 한글 파일명도 안 깨져요.

📌 마무리

오늘은 파이썬 표준 라이브러리만으로 지메일 자동 발송 + 첨부파일까지 완성했어요! 엑셀 자동화(#1)와 조합하면 "보고서 생성 → 메일 발송"이 완전 자동이 됩니다 🙌 다음 업무 자동화 글에서는 웹 크롤링 입문(requests + BeautifulSoup)으로 웹에서 데이터를 자동 수집하는 법을 다뤄볼게요. 기대해주세요!

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그