본문 바로가기
[업무 지식]/Python

[SMTP] 이메일 자동화

by 에디터 윤슬 2025. 2. 13.

.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 계정과 앱 비밀번호를 사용하여 인증합니다.