[파이썬 08] 이메일 발송 자동화하기


반복적으로 같은 형식의 이메일을 여러 명에게 보내야 하는 업무는 자동화하기 딱 좋은 대상이다. 파이썬에는 이메일 발송을 위한 smtplib 모듈이 기본 내장돼 있어서, SMTP(간이 우편 전송 프로토콜)를 통해 어떤 이메일 서버로도 프로그래밍 방식으로 메일을 보낼 수 있다.


1. 지메일 앱 비밀번호부터 발급받기


지메일을 예로 들면, 2단계 인증을 켠 상태에서 구글 계정의 앱 비밀번호 발급 페이지로 이동해 애플리케이션용 16자리 비밀번호를 따로 발급받아야 한다. 평소 로그인용 비밀번호로는 최근 구글 보안 정책상 로그인이 거부되는 경우가 많기 때문에, 반드시 이 앱 비밀번호를 발급받아 코드에 사용해야 한다.


2. 기본 텍스트 메일 보내기


import smtplib

from email.mime.text import MIMEText


my_email = "내계정@gmail.com"

app_password = "발급받은16자리비밀번호"

to_email = "받는사람@gmail.com"


msg = MIMEText("안녕하세요, 자동으로 발송된 메일입니다.")

msg['Subject'] = "자동 발송 테스트"

msg['From'] = my_email

msg['To'] = to_email


with smtplib.SMTP('smtp.gmail.com', 587) as server:

server.ehlo()

server.starttls() # 보안 연결(TLS) 시작

server.login(my_email, app_password)

server.send_message(msg)


print("메일 발송 완료")


starttls()는 통신 구간을 암호화하는 역할을 하고, 지메일 같은 서비스는 보안을 위해 SSL/TLS 암호화 연결을 요구하기 때문에 이 과정이 빠지면 로그인 자체가 거부된다.


3. 첨부파일 붙이기


보고서 파일을 첨부해서 보내야 하는 경우, MIMEMultipart와 MIMEBase 클래스를 조합해서 파일을 이메일에 실어 보낼 수 있다.


from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders


msg = MIMEMultipart()

msg['Subject'] = "월간 보고서 첨부드립니다"

msg['From'] = my_email

msg['To'] = to_email


with open("월간보고서.xlsx", "rb") as f:

part = MIMEBase("application", "octet-stream")

part.set_payload(f.read())

encoders.encode_base64(part)

part.add_header("Content-Disposition", "attachment; filename=월간보고서.xlsx")

msg.attach(part)


with smtplib.SMTP('smtp.gmail.com', 587) as server:

server.starttls()

server.login(my_email, app_password)

server.send_message(msg)


4. 여러 명에게 자동으로 발송하기


앞서 다룬 리스트/반복문을 조합하면, 엑셀에서 읽어온 수신자 목록에 맞춰 이메일을 자동으로 순회 발송하는 것도 가능하다.


recipients = ["[email protected]", "[email protected]", "[email protected]"]


with smtplib.SMTP('smtp.gmail.com', 587) as server:

server.starttls()

server.login(my_email, app_password)

for r in recipients:

msg = MIMEText(f"{r}님, 안내드립니다.")

msg['Subject'] = "안내 메일"

msg['From'] = my_email

msg['To'] = r

server.send_message(msg)


다만 짧은 시간 안에 너무 많은 이메일을 연속으로 보내면 스팸으로 분류되거나 발송 속도 제한에 걸릴 수 있어서, 발송 사이에 약간의 지연 시간(time.sleep())을 두는 것이 안전하다는 의견이 일반적이다. 또한 대량으로, 수백~수천 통 이상을 보내야 하는 경우엔 smtplib보다 전용 이메일 발송 서비스(SendGrid 등)를 쓰는 게 더 적합하다는 점도 참고할 만하다.


5. 정리


smtplib는 파이썬 표준 라이브러리만으로 이메일 발송을 자동화할 수 있게 해주며, 지메일을 쓸 경우 반드시 앱 비밀번호를 별도로 발급받아야 한다는 점이 핵심이다. 소규모 알림 메일이나 정기 리포트 발송에는 충분하지만, 대량 발송이 필요하다면 전용 서비스로 넘어가는 게 낫다.