본문 바로가기

Python

[Python] 이메일에 파일 첨부하기 - smtplib

728x90

메일 객체 생성

이메일 발송을 하려면 먼저 `smtplib`모듈이 필요하다.

import smtplib

발송할 메시지는 email 모듈을 이용하여 작성한다. 메시지에는 파일을 첨부해야 하므로 다음과 같은 `MIMEMultipart`클래스를 사용해야 한다.

from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()

보내는 사람과 받는 사람을 설정

그리고 생성한 메시지 객체에 보내는 사람과 받는 사람을 설정한다.

msg['From'] = 'local@gmail.com'
msg['To'] = 'local@gmail.com'

 

더보기

이메일을 여러명에게 발송하려면

수신인이 한 명이 아닌 여러 명이라면 다음과 같이 `쉼표+공백` 으로 구분하여 추가한다.

msg['To'] = 'local@gmail.com, admin@gmail.com'

그러나 다음과 같이 `COMMASPACE`를 활용하는 것이 더 안전한 방법이다. 

from email.utils import COMMASPACE
msg['To'] = COMMASPACE.join(['local@gmail.com', 'admin@gmail.com'])

날짜

그리고 `날짜`는 다음과 같이 설정한다.

from email.utils import formatdate
msg['Date'] = formatedate(localtime=True)

localtime=True 로 설정했으므로 다음처럼 현재 지역에 맞는 날짜가 설정될 것이다.

msg['Date']
'Sun, 06, Jun 2021 09:49:03 +0900'

제목

'제목'은 다음과 같이 Header 클래스를 사용하여 설정한다. 이 클래스를 사용해야 한글이 깨지는 인코딩 문제가 발생하지 않는다.

from email.header import Header
msg['Subject'] = Header(s='파일첨부 메일 송신 테스트', charset='utf-8')

본문

메시지 본문 내용은 다음과 같이 `MIMEText`를 사용하여 작성한다.

from email.mime.text import MIMEText
body = MIMEText('첨부된 파일 2개를 확인해 주세요.', _charset='utf-8')

작성한 body를 출력해 보면 다음과 같은 결과를 볼 수 있다.

print(body)
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

7LKo67aA65CcIO2MjOydvCAy6rCc66W8IO2ZleyduO2VtCDso7zshLjsmpQu

 

`MIMEText`가 이메일 규약에 맞는 메시지 본문을 만들었음을 확인할 수 있다. 만든 body는 다음과 같이 메시지(`MIMEMutlipart`)에 추가한다.

msg.attach(body)

첨부파일

이제 파일을 첨부하여 메시지 작성을 마무리한다. 먼저 메일에 첨부할 파일 목록을 다음과 같이 작성한다.

files = list()
files.append('c:/projects/pylib/test.pdf')
files.append('c:/projects/pylib/test.jpg')

그리고 다음과 같이 `MIMEBase` 클래스를 이용하여 생성한 파일 내용을 메시지에 추가한다.

import os
from email.mime.base import MIMEBase
from email.encoders import encode_base64
for f in files:
part = MIMEBase('application', 'octet-stream')
    part.set_payload(open(f,"rb").read())
    encdoe_base64(part)
    part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(f))
    msg.attach(part)

`encode_base64()` 함수는 추가한 파일을 Base64로 인코딩하는 역할을 한다.

더보기

MIME 타입 지정

MIMEBase(maintype, subtype)

 

주요 MIME타입 예시:

#1. 일반 파일
part = MIMEBase('application', 'octet-stream') #일반적인 바이너리 파일

#2.PDF 파일
part = MIMEBase('application', 'pdf') #pdf 파일

#3. MS Office 파일
part = MIMEBase('application', 'msword') #word(.doc)
part = MIMEBase('application', 'vnd.ms-excel') #excel(.xls)
part = MIMEBase('application', 'vnd.ms-outlook') #outlook(.msg)

#4. 이미지 파일
part = MIMEBase('image', 'jpeg') #JPEG 이미지
part = MIMEBase('image', 'png') #PNG 이미지

#5. 텍스트 파일
part = MIMEBase('text', 'plain') # 일반 텍스트
part = MIMEBase('text', 'html') # HTML 문서

 

메일 발송

그리고 SMTP 서버를 사용하여 작성한 메시지를 발송한다. 먼저 다음과 같이 SMTP_SSL 객체를 생성한다.

mailServer = smtplib.SMTP_SSL('smtpserver')
더보기
SSL을 지원하지 않는 SMTP 서버라면 `SMTP_SSL()`대신 `SMTP()`를 사용해야한다.

객체를 생성했다면 다음과 같이 해당 메일 서버의 계정과 비밀번호로 로그인한다. 로그인에 성공하면 다음과 같은 메시지가 표시될 것이다.

mailServer.login('local@gmail.com', 'xxxxxxxxx') # 본인에 맞는 계정과 비밀번호 사용
(235, b'2.7.0 Accepted 7dbNhST8R7GfNtSAx2FCVw - nsmtp')

 

그리고 send_message()함수를 사용하여 메일을 발송한다.

mailServer.send_message(msg)
{}

모든 작업이 끝났다면 메일 서버와의 접속을 종료한다.

mailServer.quit()

 


지금까지의 내용을 종합한 최종 코드

import os
import smtplib
form email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate

msg = MIMEMulitipart()

msg['From'] = 'local@gmail.com'
msg['To'] = 'local@gmail.com'
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = Header(s='파일첨부 메일 송신 테스트', charset='utf-8')
body = MIMEText('첨부된 파일 2개를 확인해주세요.', _charset= 'utf-8')
msg.attach(body)

files = lsit()
files.append('c:/projects/pylib/test.pdf')
files.append('c:/projects/pylib/test.jpg')

for f in files:
    part = MIMEBase('application', "octet-stream")
    part.set_payload(open(f, "rb").read())
    encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
    msg.attach(part)
    
mailServer = smtplib.SMTP_SSL('smtp.naver.com')
mailServer.login('pahkey@naver.com', 'xxxxxxxx')  # 본인 계정과 비밀번호 사용.
mailServer.send_message(msg)
mailServer.quit()

 

 

 

728x90