엑셀 파일을 읽어서 수강생 목록의 상태 중 "결제 완료"인 상태의 수강생에게 결제가 완료되었다는 메일을 수강 파일을 첨부해서 메일을 보내는 예제. 이메일을 보내기 위해서 사용하는 파이썬 라이브러리 = smtplib. smtplib 라이브러리는 메일 정보를 SMPT 형태로 보내기 위한 라이브러리이고 email 라이브러리는 메일 발송을 위해 필요한 정보를 관리하기 위한 라이브러리. 메일을 보내기 위해서는 SMTP 라이브러리에서 메일을 보내는 주체의 포트와 서버를 알아야 한다. 포트 번호는 대부분 "465"이고 서버의 경우 "smtp.naver.com" 형식으로 작성한다.
메일의 내용 중 파일 첨부가 있는 경우 MIMEBase를 이용하여 파일을 읽고 메일 서버에 보낼 수 있는 형식으로 변경한 후 encoder을 해줘야 한다. basename으로 파일명을 읽어들이고 add_header로 헤더를 추가해주는데 헤더는 내용이 시작되기 전에 이 헤더에 파일명을 알려주는 코드를 추가하여 파일명을 알려줄 수 있다.
사용한 라이브러리/클래스
from email.mime.text import MIMEtext
- 메일 서버에 텍스트 정보를 보내기 위해 사용하는 클래스.
from email.mime.multipart import MIMEMultipart
- 메일을 주고받을 때 사용하는 약속된 형태를 자동으로 생성하는 클래스.
from smtplib import SMTP_SSL
- SMTP를 활용하여 메일을 발송하기 위한 smtp 라이브러리로부터 SMTP_SSL 클래스 사용.
from email.mime.base import MIMEBase
- 텍스트 내용을 추가할 때처럼 파일을 추가하기 위해 사용하는 클래스.
from email import encoders
- 파일을 메일 서버가 받을 수 있는 형태로 변환하기 위한 라이브러리.
예제
1. my_email.py
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from smtplib import SMTP_SSL
SMTP_SERVER = 'smtp.naver.com'
SMTP_PORT = 465
SMTP_USER = '{naver의 실제 이메일 주소}'
SMTP_PASSWORD = '{실제 비밀번호 입력}'
def send_mail(name, addr, contents, attachment=False):
msg = MIMEMultipart('alternative')
if attachment:
msg = MIMEMultipart('mixed')
msg['From'] = '보내는 사람 이름 <%s>'%SMTP_USER
msg['To'] = addr
msg['Subject'] = name + '님, 메일이 도착했습니다.'
text = MIMEText(contents)
msg.attach(text)
if attachment:
from email.mime.base import MIMEBase
from email import encoders
file_data = MIMEBase('application', 'octet-stream')
f = open(attachment, 'rb')
file_contents = f.read()
file_data.set_payload(file_contents)
encoders.encode_base64(file_data)
from os.path import basename
filename = basename(attachment)
file_data.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(file_data)
smtp = SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp.login(SMTP_USER, SMTP_PASSWORD)
smtp.sendmail(SMTP_USER, addr, msg.as_string())
smtp.close()
2. auto_email.py
from my_email import send_mail
from openpyxl import load_workbook
xlsx = load_workbook('수강생_결제정보.xlsx', read_only=True)
sheet = xlsx.active
for row in sheet.iter_rows():
name = row[0].value
mail = row[1].value
status = row[3].value
if status == '결제완료':
contents = '결제완료가 확인되어 커리큘럼을 안내해드립니다.'
send_mail(name, mail, contents, '커리큘럼.xlsx')
'개발 언어 > python' 카테고리의 다른 글
selenium으로 네이버 뉴스 가장 많이 본 기사 제목 크롤링하기 (0) | 2025.06.03 |
---|---|
웹 사이트 태그 구조 selenium, google webdriver, 예외 처리 (1) | 2025.06.01 |
구글 뉴스 기사 수집 엑셀 정리 - RSS 구조 feedparser 라이브러리 활용 (0) | 2025.06.01 |