메일 객체 생성
이메일 발송을 하려면 먼저 `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')
객체를 생성했다면 다음과 같이 해당 메일 서버의 계정과 비밀번호로 로그인한다. 로그인에 성공하면 다음과 같은 메시지가 표시될 것이다.
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()
'Python' 카테고리의 다른 글
[Python] APScheduler 가이드 (0) | 2025.02.18 |
---|---|
[Python] strftime과 strptime (0) | 2025.01.23 |
[Python] 파이썬 날짜 표현 한글 에러 (1) | 2024.11.14 |
[Python] UIAutomation for Windows 객체 컨트롤하기 (0) | 2024.10.22 |
[Python] Selenium으로 웹 브라우저 제어하기 - (1) (0) | 2024.10.18 |