![[파이썬 08] 이메일 발송 자동화하기](https://img.thenullpage.com/posts/5386/5386_1_0b888b.webp)
반복적으로 같은 형식의 이메일을 여러 명에게 보내야 하는 업무는 자동화하기 딱 좋은 대상이다. 파이썬에는 이메일 발송을 위한 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는 파이썬 표준 라이브러리만으로 이메일 발송을 자동화할 수 있게 해주며, 지메일을 쓸 경우 반드시 앱 비밀번호를 별도로 발급받아야 한다는 점이 핵심이다. 소규모 알림 메일이나 정기 리포트 발송에는 충분하지만, 대량 발송이 필요하다면 전용 서비스로 넘어가는 게 낫다.