[업무 지식]/Python
[SMTP] 이메일 자동화
에디터 윤슬
2025. 2. 13. 22:30
.env 파일 저장
my_email = "****"
password = "****"
발송 코드(내용 및 파일)
import os
import smtplib
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from dotenv import load_dotenv
# 환경 변수 로드
load_dotenv()
my_email = os.getenv("my_email")
to_email = os.getenv("to_email")
password = os.getenv("password")
image_paths = ["learning_distribution.png"] # 본문에 포함할 이미지 경로
file_paths = ["learning_distribution.png", "enem_scores.csv"] # 첨부할 파일 경로
# 이메일 메시지 생성
msg = MIMEMultipart("mixed") # "mixed"는 본문, 이미지, 파일을 함께 포함하기 위한 설정
msg['From'] = my_email
msg['To'] = to_email
msg['Subject'] = '분포 신뢰구간 그래프입니다.'
# HTML 본문 작성 (이미지 포함)
html_body = f"""
<html>
<body>
<p>안녕하세요,</p>
<p>온라인 학습 그룹과 대면 학습 그룹의 분포를 시각화한 그래프입니다.</p>
<img src="cid:image1" alt="Graph" style="width:600px; height:auto;">
</body>
</html>
"""
msg.attach(MIMEText(html_body, "html"))
# 이미지 첨부 (Content-ID 설정)
for image_path in image_paths:
with open(image_path, "rb") as img_file:
img = MIMEImage(img_file.read())
img.add_header("Content-ID", "<image1>") # HTML에서 "cid:image1"로 참조
img.add_header("Content-Disposition", "inline", filename=os.path.basename(image_path))
msg.attach(img)
# 여러 파일 첨부 (루프 사용)
for file_path in file_paths:
with open(file_path, "rb") as file:
part = MIMEBase('application', "octet-stream")
part.set_payload(file.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file_path))
msg.attach(part)
# SMTP 서버 연결 및 이메일 전송
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
server.login(my_email, password)
server.sendmail(my_email, to_email, msg.as_string())
print("이메일이 성공적으로 전송되었습니다!")
except Exception as e:
print(f"이메일 전송 중 오류 발생: {e}")
1. 필요 라이브러리
• `os`: 환경 변수 및 파일 경로 처리를 위한 라이브러리.
• `smtplib`: 이메일 전송을 위한 SMTP 프로토콜을 지원하는 표준 라이브러리.
• `email` 모듈: 이메일 메시지 작성과 관련된 다양한 클래스를 제공.
• `MIMEMultipart`: 이메일에 여러 부분(본문, 첨부파일 등)을 포함하기 위한 클래스.
• `MIMEText`: 텍스트 본문을 작성하기 위한 클래스.
• `MIMEBase`: 첨부파일을 처리하기 위한 클래스.
• `Header`: 이메일 제목과 같은 헤더를 설정할 때 사용.
• `encoders.encode_base64`: 첨부파일 데이터를 Base64로 인코딩.
• `dotenv.load_dotenv()`:
• `.env` 파일에서 환경 변수를 로드합니다. 이 파일에는 민감한 정보(예: 이메일, 비밀번호)가 저장되어 있습니다.
2. 환경 변수 로드
• `.env 파일 로드:
• `.env` 파일에서 `my_email`(이메일 주소)와 `password`(앱 비밀번호)를 가져옵니다.
• `.env` 파일 예시:
my_email=your_email@gmail.com
password=your_app_password
3. 이메일 메시지 객체 생성
• 이메일 메시지 객체 생성:
• `MIMEMultipart()`를 사용하여 본문과 첨부파일 등 여러 부분으로 구성된 이메일을 작성합니다.
• 헤더 설정:
• `msg'From'`: 발신자 이메일 주소(`my_email`)를 설정합니다.
• `msg'To'`: 수신자 이메일 주소(`9135jys@gmail.com`)를 설정합니다.
• `msg'Date'`: 이메일 발송 날짜를 현재 로컬 시간으로 설정합니다.
• `msg'Subject'`: UTF-8로 인코딩된 이메일 제목(`파일첨부 메일송신 테스트`)을 설정합니다.
4. 본문 추가
• 본문 작성:
• `MIMEText('안녕하세요. 테스트메일입니다.', _charset='utf-8')`: UTF-8로 인코딩된 텍스트 본문을 작성합니다.
• 본문 추가:
• `msg.attach(body)`: 작성한 본문을 이메일 메시지 객체에 추가합니다.
5. 첨부파일 추가
• 첨부파일 준비:
• `MIMEBase('application', "octet-stream")`: 첨부파일의 MIME 타입을 설정. `"octet-stream"`은 일반적인 바이너리 파일 형식을 의미합니다.
• `part.set_payload(open(file, "rb").read())`: 파일(`enem_scores.csv`)을 바이너리 모드(`rb`)로 읽어와 페이로드에 설정합니다.
• `encoders.encode_base64(part)`: 파일 데이터를 Base64로 인코딩하여 전송 가능한 형식으로 변환합니다.
• 첨부파일 헤더 설정:
• `part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))`: 첨부파일의 이름(`filename`)을 파일 경로에서 추출한 이름으로 설정합니다.
• 첨부파일 추가:
• `msg.attach(part)`: 작성한 첨부파일 객체를 이메일 메시지에 추가합니다.
6. SMTP 서버 연결 및 로그인
• SMTP 서버 연결:
• Gmail SMTP 서버(`smtp.gmail.com`)에 SSL(보안 연결)을 통해 연결합니다.
• 기본 포트 번호(SSL): `465`.
• 로그인:
• Gmail 계정과 앱 비밀번호를 사용하여 인증합니다.