파이썬의 smtplib라는 라이브러리를 통해 이메일을 보내는 프로그램을 짤 수 있는데요.
제가 쓰는 파이썬 3.9버전 기준으로 따로 라이브러리를 설치하지 않고도 작동되는걸 보아하니 기본 라이브러리에 포함되어 있는것 같습니다.
SMTP란?
먼저 SMTP라는 개념을 알아봐야 할텐데요. SMTP는 Simple Mail Transfer Protocol의 약자로 이메일 전송에 직접적으로 쓰이는 응용 계층의 프로토콜 입니다. 메일을 보낼때 쓰이는 프로토콜이라고 기억해주면 될것 같습니다.
메일 서버에서 메일을 가져올 때는 SMTP를 사용하지 않고 보통 아래와 같은 프로토콜을 이용합니다.
- Post Office Procotol Version 3(POP3): TCP/IP기반으로 메일을 정보를 가져옴니다. 사용자 기기로 이메일을 다운로드 하며, 다운르도한 내용은 서버에서 삭제됩니다
- Internet Message Access Protocol(IMAP): 서버에 저장된 정보를 가져와서 내용을 보여주고 변경 사항을 동기화합니다. POP3와 다르게 서버에 계속 메일이 저장되어 있기 때문에 여러 디바이스에서 접속해도 동일한 정보를 확인 할 수 있습니다.
- HTTP
최근엔 멀티 디바이스 환경을 지원하기 때문에 IMAP 방식이 더 선호되고 있습니다.
POP3의 경우 메세지를 계속해서 저장할 필요가 없기 때문에 더 저렴한 비용으로 유지보수가 된다는 장점이 있습니다.
카카오톡을 예를 들어 생각해 봅시다. 카카오톡은 일명 3일룰이라고 3일 동안 디바이스가 인터넷에 접속되지 않는 등의 이유로 카카오톡 메세지를 전달받지 못하면 자동으로 받아야할 메세지가 파기 됩니다.
하지만 우리가 핸드폰에서 메세지를 읽어도 다른 디바이스인 노트북에서도 같은 메세지를 받아서 볼 수 있습니다.
카카오톡은 POP3와 IMAP의 특성을 모두 지닌 방식으로 메세지를 관리하는 것을 알 수 있습니다.
파이썬으로 이메일 보내기
보내기전 세팅
smtp를 이용하여 메세징을 할 수 있도록 계정 보안 허용
구글 이메일을 사용하여 보낼 경우 설정
구글 프로필 계정 관리에 들어간 후
안전하지 않은 앱 허용을 해주셔야 메일을 보낼 수 있습니다
네이버 이메일을 통해 보낼경우 설정
네이버 메일로 들어온 후 설정 아이콘 아무데나 눌러주시고
POP3/SMTP 사용함으로 설정해주시면 됩니다
아래 값들이 우리가 메일을 보낼때 사용할 값들입니다.
아이디, 비밀번호에 대한 환경변수 설정
'id', 'pw', 'email'에 대한 값을 소스코드에 그대로 넣을 경우 찜찜하니 환경변수에 넣어주도록 하겠습니다
윈도우 키를 누르고 '환경 변수'라고 입력해주세요
그 후 방금 말한 세가지 변수 'id', 'pw', 'email'에 대한 환경 변수를 설정해 줍니다
email의 경우 email과 id는 같으며
네이버의 경우 id는 로그인 할때 아이디를 적어주시면 됩니다
전부 만들었다면 확인 해주시면 세팅은 끝났습니다
주의! 환경변수 적용전 기존에 켜져있는 파이참 같은 IDE는 껐다 키셔야 생성한 환경변수가 적용이 됩니다.
환경변수는 프로세스가 생성될 당시 할당 되기 때문에 기존에 켜져있는 프로세스는 생성한 환경변수가 적용되지 않습니다.
소스코드
import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
import os
def send_mail(send_from, send_to, subject, message, mtype='plain', files=[],
server="localhost", port=587, username='', password='',
use_tls=True):
"""Compose and send email with provided info and attachments.
Args:
send_from (str): from name
send_to (list[str]): to name(s)
subject (str): message title
message (str): message body
mtype (str): choose type 'plain' or 'html'
files (list[str]): list of file paths to be attached to email
server (str): mail server host name
port (int): port number
username (str): server auth username
password (str): server auth password
use_tls (bool): use TLS mode
"""
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = ', '.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(message, mtype))
for path in files:
part = MIMEBase('application', "octet-stream")
with open(path, 'rb') as file:
part.set_payload(file.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment', filename=Path(path).name)
msg.attach(part)
smtp = smtplib.SMTP(server, port)
if use_tls:
smtp.starttls()
smtp.login(username, password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.quit()
id = os.environ['id']
pw = os.environ['pw']
email = os.environ['email']
# 네이버의 경우 server='smtp.naver.com'
send_mail(send_from=email, send_to=['ghdic77@gmail.com', 'ghdic@naver.com'],
subject='smtp 테스트 발송 메세지 입니다', message=f'<h1>안녕하세요</h1>{id}입니다', files=['temp.txt'],
mtype='html', server='smtp.gmail.com', username=email, password=pw)
smtplib에 대해서는 너무 깊게 알필요는 없고, send_mail이라는 함수에 대해서만 이해하면 메일을 보내는데 큰 어려움이 없을 겁니다.
파라미터에 대해서 봅시다.
parameter | type | role |
send_from | str | 보내는 사람 이메일 주소 |
send_to | list[str] | 받는 사람 이메일 주소(리스트 형태) |
subject | str | 제목 |
message | str | 보내는 메세지 |
mtype | str | 이 값이 plain일 경우 텍스트 평문 그대로 보내짐 html일 경우 html 태그 적용 가능 |
files | list[str] | 첨부할 파일 경로(리스트 형태) |
server | str | 보낼 서버 도메인 구글: smtp.gmail.com 네이버: smtp.naver.com |
port | int | 특별한 일 없으면 587 고정 |
username | str | 로그인시 아이디 |
password | str | 로그인시 비밀번호 |
use_tls | bool | TLS(Transport Layer Security) 프로토콜을 사용하여 정보를 암호화하여 보안할 것인가 |
이제 temp.txt라는 파일을 생성후 실행해 보면
정상적으로 파일이 첨부되어 메세지가 보내진것을 확인 할 수 있다.
'Python' 카테고리의 다른 글
Python 이미지파일(jpg) pdf로 바꾸기 (0) | 2022.06.27 |
---|---|
파이썬 유튜브 영상 정보 다운로드하기 pytube (0) | 2022.06.20 |
파이썬 regex 정규표현식으로 match된 부분 while문으로 하나씩 변경하기 (0) | 2021.05.25 |
pymysql 특수문자 이모티콘 에러 발생 해결법 (0) | 2021.05.18 |
파이썬 Turtle을 사용해서 다양한 도형 그려보기 (1) | 2021.04.21 |