안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
오늘은 파이썬으로 여러명에게 첨부파일이 포함된 메일을 보내는 방법에 대해 공부해보겠습니다.
<파이썬으로 이메일 보내기 관련 글>
2022.03.23 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈
2022.06.01 - [파이썬 패키지/이메일] - [python/imaplib] 파이썬으로 구글 Gmail 읽기
1. 구글 메일 자동화를 위한 설정
2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기
2. 네이버 메일 자동화를 위한 설정
2022.06.15 - [파이썬 패키지/이메일] - [#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정
이전 시간까지는 정말 단순하게 단 한명에게 메일 제목과 내용만 포함하여 메일을 보내는 것을 해보았습니다.
오늘 배워볼 내용은 한번에 여러명에게, 첨부파일을 포함시켜서 메일을 보내는 방법입니다.
1. 관련 모듈, 클래스 불러오기
우선 오늘 새로 등장하는 모듈과 클래스들이 많으므로 쉬운 이해를 위해서 기능에 따라 배치해보았습니다.
그림을 기준으로 소개드리자면,
MIMEBase:
첨부파일이 포함된 메일은 멀티파트(Multipart)로 구성되어 있으며, MIMEBase가 기본 포맷의 역할을 합니다. 즉, MIMEBase라는 종이 위에 텍스트도 넣고, 첨부파일도 넣는 느낌인 것입니다.
Header:
Header는 사람의 문장을 컴퓨터가 이해할 수 있는 문장으로 변환해줄 때 사용하는 모듈로 전반적으로 사용합니다.
MIMEText:
지난 시간에도 사용했던 MIMEText 클래스는 '본문 메세지'를 작성할 때 사용합니다.
MIMEApplication:
MIMEApplication 클래스는 파일을 첨부해줄 때 사용합니다.
2. 전체 코드
위의 개념도만 대략 이해하시면, 그 외의 부분은 주석을 읽어보시면서 따라해보시면 되리하 생각합니다.
(더 친절하지 못해 죄송합니다..ㅜㅜ)
#step1.관련 모듈, 클래스 불러오기
import os
import smtplib
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
#step2.SMTP 서버를 dictionary로 정의
smtp_info = {
'gmail.com': ('smtp.gamil.com', 587),
'naver.com': ('smtp.naver.com', 587),
'outlook.com': ('smtp-mail.outlook.com', 587),
'hotmail.com': ('smtp-mail.outlook.com', 587),
'yahoo.com': ('smtp.mail.yahoo.com', 587),
'nate.com': ('smtp.mail.nate.com', 465),
'daum.net': ('smtp.daum.net', 465),
'hanmail.net': ('smtp.daum.net',465)
}
#step3.메일 보내는 함수 정의 (발신 메일, 수신 메일(여러개 가능), 제목, 본문, 첨부파일 경로, 비밀번호)
def send_email(From, To, subject, message, attach_files=(), passwd='', subtype='plain'):
#step4.멀티파트로 메일을 만들기 위한 포맷 생성
form = MIMEBase('multipart', 'mixed')
#step5.입력받은 메일주소와 제목, 본문 등의 문자열을 인코딩해서 form에 입력
form['From'] = From
form['To'] = ', '.join(To) #수신 메일 리스트를 문자열로 변환 (,와 한칸 공백을 추가해서 구분)
form['Subject'] = Header(subject.encode('utf-8'), 'utf-8')
msg = MIMEText(message.encode('utf-8'), _subtype=subtype, _charset='utf-8')
form.attach(msg)
#step6.여러개의 파일을 하나씩 첨부
for fpath in attach_files:
folder, file = os.path.split(fpath) # 파일의 절대 경로를 입력하면, 두 가지 문자열을 나눠서 반환
# (ex./home/User/Desktop/file.txt --> (/home/User/Desktop/, file.txt)
with open(fpath, 'rb') as f: # 첨부 파일을 열어서 내용을 가져옴
body = f.read()
msg = MIMEApplication(body, _subtype=subtype)
msg.add_header('Content-Disposition', 'attatchment',
filename=(Header(file, 'utf-8').encode()))
form.attach(msg)
#step7.SMTP 서버 로그인 및 작성된 메일 보내기
id, host = From.rsplit("@",1) #발신인 메일 주소의 @를 기준으로 id와 host로 나눔
smtp_server, port = smtp_info[host] #step2의 dict를 이용해서 host와 port 정보들을 받아옴
# SMTP 서버 접속 여부 확인
if port == 587:
smtp = smtplib.SMTP(smtp_server, port)
rcode1, _ = smtp.ehlo()
rcode2, _ = smtp.starttls()
else:
smtp = smtplib.SMTP_SSL(smtp_server, port)
rcode1, _ = smtp.ehlo()
rcode2 = 220
if rcode1 != 250 or rcode2 != 220:
smtp.quit()
return '연결에 실패하였습니다.'
smtp.login(From, passwd)
smtp.sendmail(From, To, form.as_string())
smtp.quit
#step8.실제 함수 실행 부분
me = 'continent9@naver.com'
receivers = ['codingswson@gmail.com','sonsangwoo91@gmail.com']
subject = '파이썬으로 메일 보내기 테스트'
message = """
안녕하세요, 코딩유치원에서 제작한 '메일 전송 봇'입니다.
첨부드리는 파일 참고 부탁드립니다.
감사합니다.
"""
attatch_files = ['5.png', 'test_excel.xlsx','Excel_sum.py','text파일.txt']
send_email(me, receivers, subject, message, attatch_files, passwd='네이버 로그인 비밀번호')
글을 마치며, 제가 네이버 메일로 발신했을 땐 정상작동 하는 코드가, 이상하게도 구글 메일로 발신하려고 하면 에러가 납니다. 당연히 구글 비밀번호를 '앱 비밀번호'로 하였는데도 말이죠.
혹시 여러분들은 되신다면 댓글을 달아주시면 감사하겠습니다!
'파이썬 패키지 > 이메일' 카테고리의 다른 글
[#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정 (0) | 2022.06.15 |
---|---|
[python/imaplib] 파이썬으로 구글 Gmail 읽기 (0) | 2022.06.01 |
[python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈 (0) | 2022.03.23 |
[python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기 (1) | 2022.03.17 |