지난 포스트에서 기본적인 메일 보내기를 다루어 본 적이 있습니다. 그러자 많은 분들이 저에게 이메일에 파일을 첨부하는 건 어떻게 하냐고 물어보시더라고요 ㅎㅎ 이번 시간에 이메일에 파일을 첨부하는 방법을 다루어 보겠습니다. 먼저 지난 시간에 간단한 내용만 있는 메일을 보내는 방법을 복습해 봅시다. (<문과의 파이썬> 이메일 보내기 링크)
smtplib 모듈로 네이버나 구글의 smtp서버로 접속하여 메일을 보낼 수 있었습니다. 여기에 MIMEText 모듈을 이용하여 메일 규격에 맞는 메시지를 작성할 수 있습니다. 이 두 가지를 조합하여 메시지만 있는 메일을 보낼 수 있었죠.
일단 여기서도 메일 서버를 위해 smtplib 모듈을 사용하는 것은 똑같습니다. 즉, 서버에 접속하고 로그인하고 sendmail 하는 것은 저번 시간과 똑같아요. 다만 이제는 내용에 파일 부분이 첨가가 되는 겁니다. 이제는 메시지뿐만 아니라 파일 첨부까지 해야 하므로 MIMEText만으로는 부족합니다.
먼저 메시지의 기본이 되는 MIMEBase 모듈을 임포트하고 해당 객체를 하나 생성합니다.
from email.mime.base import MIMEBase
msg = MIMEBase('multipart', 'mixed')
MIMEBase 객체를 하나 새로 생성할 때 인자로 maintype(내용 포맷)과 subtype(내용 형식)을 입력하는데, 여기서는 'multipart', 'mixed'를 각, 각 주었습니다. text와 첨부파일이 함께 들어가기 때문에 이렇게 준다고 생각하시면 됩니다. 이제 이 MIMEBase 객체에 메시지 내용과 첨부파일을 만들어 붙여주면(attach) 됩니다.
먼저 메시지 내용을 만들겠습니다. 이 부분은 지난번 이메일 부분과 같습니다. 다 만들어서 앞에서 만든 msg에 attach 합니다.
cont = MIMEText('~님께\n 안녕하세요 잘 지내셨는지요.\n 안녕히계세요.', 'plain', 'utf-8')
cont['Subject'] = 'test 메일'
cont['From'] = '보내는 매일 주소'
cont['To'] = '받는 메일 주소'
msg.attach(cont)
자, 이제는 파일 부분을 만들어 attach 시킬 차례입니다. 파일 부분은 MIMEBase 객체로 생성합니다. 이때 인자를 "application", "octet-stream"로 주어야 하는데, 이는 MIME가 application/octet-stream 타입이란 의미로 이는 이진 파일을 보낼 때 사용합니다. 형식이 정해져 있지 않기 때문에 엑셀이든 PDF든 이진 파일이면 모두 첨부가 가능합니다. 그리고 set_payload 함수를 이용하여 첨부하고 싶은 파일을 읽어 옵니다.
path = r'C:\Users\JK\Desktop\test11.xlsx'
part = MIMEBase("application", "octet-stream")
part.set_payload(open(path, 'rb').read() )
이어서 인코딩을 해야 합니다. 왜냐하면 MIME는 메시지 말고 다른 이진 파일들(워드나 엑셀 등)을 보내려면 인코딩하여 텍스트로 바꾸어 전달하고 나중에 다시 이진 파일로 디코딩을 하기 때문입니다. 그리고 이를 Content-Disposition헤더의 attachment 속성으로 명시해 줘야 하는데 아래와 같이 하면 됩니다. 마지막으로 첨부파일 부분도 attach 시켜 줍시다.
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"'% os.path.basename(path))
msg.attach(part)
이제 기존과 같이 sendmail을 이용하여 메일을 보내면 됩니다. 파일 첨부하여 메일 보내기도 크게 어렵지 않습니다 ㅎㅎ 마지막으로 전체 코드입니다.
import smtplib
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
naver_server = smtplib.SMTP_SSL('smtp.naver.com', 465)
naver_server.login('네이버 아이디', '네이버 비밀번호')
msg = MIMEBase('multipart', 'mixed')
cont = MIMEText('~님께\n 안녕하세요 잘 지내셨는지요.\n 안녕히계세요.', 'plain', 'utf-8')
cont['Subject'] = 'test 메일'
cont['From'] = '보내는 매일 주소'
cont['To'] = '받는 메일 주소'
msg.attach(cont)
path = r'C:\Users\JK\Desktop\test11.xlsx'
part = MIMEBase("application", "octet-stream")
part.set_payload(open(path, 'rb').read() )
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"'% os.path.basename(path))
msg.attach(part)
naver_server.sendmail('보내는 사람 메일주소', '받는 사람 메일 주소들', msg.as_string())
naver_server.quit()