본문 바로가기
Python

[Python] smtplib로 이메일 발송하기

by teamnova 2025. 2. 18.
728x90

안녕하세요.

이번 글에서는 Python의 smtplib 라이브러리를 사용해 이메일을 보내는 방법을 배워보겠습니다.

 

1. SMTP 서버란?

이메일을 보내는 과정은 단순히 "내가 작성한 이메일이 바로 상대방에게 전달된다"라고 생각하기 쉽지만, 실제로는 여러 단계를 거쳐야 합니다. 이 과정에서 중요한 역할을 하는 것이 바로 SMTP 서버입니다.

 

SMTP(Simple Mail Transfer Protocol)는 이메일을 전송하기 위한 표준 프로토콜입니다. 즉, 이메일을 작성하고, 전송하고, 수신자의 메일 서버로 전달하는 과정을 처리하는 규칙입니다. 이 프로토콜을 구현한 서버가 바로 SMTP 서버입니다.

 

SMTP 서버는 이메일 전송 과정에서 다음과 같은 역할을 합니다.

  1. 발신자 인증: 이메일을 보낼 때, 발신자가 유효한 사용자(예: 이메일 계정 소유자)인지 확인합니다.
  2. 이메일 라우팅: 작성된 이메일을 적절한 경로를 통해 수신자의 메일 서버로 전달합니다.
  3. 전송 오류 처리: 이메일이 잘못된 주소로 전송되거나 문제가 발생했을 때 이를 발신자에게 알립니다.

다양한 이메일 서비스 제공자들은 각자의 SMTP 서버를 제공합니다.

이메일 서비스  SMTP 서버 주소  포트 번호
Gmail  smtp.gmail.com  587
Naver smtp.naver.com 587
Outlook smtp.office365.com 587
Yahoo smtp.mail.yahoo.com 465

 

2. smtplib 라이브러리

Python의 표준 라이브러리인 **smtplib**는 SMTP 서버와 연결하여 이메일을 전송할 수 있도록 도와줍니다.

아래는 기본적인 이메일 전송 절차입니다.

import smtplib  # 이메일 전송을 위한 라이브러리
from email.mime.text import MIMEText  # 이메일 본문 작성 도구

# SMTP 서버 설정
smtp_server = "smtp.gmail.com"  # Gmail SMTP 서버 주소
smtp_port = 587  # TLS 포트 번호
sender_email = "your_email@gmail.com"  # 발신자 이메일 주소
sender_password = "your_password"  # 발신자 이메일 비밀번호

# 이메일 내용 작성
subject = "테스트 이메일"
body = "안녕하세요, 이 메일은 Python을 사용해 보낸 테스트 메일입니다."
msg = MIMEText(body, "plain")  # 단순 텍스트 형식의 이메일 작성
msg["Subject"] = subject  # 이메일 제목
msg["From"] = sender_email  # 발신자
msg["To"] = "recipient_email@gmail.com"  # 수신자

# 이메일 전송
try:
    # SMTP 서버 연결
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()  # TLS(보안 연결) 시작
        server.login(sender_email, sender_password)  # 로그인
        server.send_message(msg)  # 이메일 전송
        print("이메일이 성공적으로 전송되었습니다!")
except Exception as e:
    print(f"이메일 전송 중 오류가 발생했습니다: {e}")

 

  1. SMTP 서버 설정
    • SMTP 서버 주소와 포트를 설정합니다.
    • Gmail을 사용하는 경우, 서버 주소는 smtp.gmail.com이고 포트는 587입니다.
  2. 이메일 작성
    • MIMEText 클래스를 사용해 이메일 본문을 작성합니다.
    • 제목, 발신자, 수신자를 설정합니다.
  3. 이메일 전송
    • smtplib.SMTP를 사용해 SMTP 서버에 연결하고, 로그인 후 이메일을 전송합니다.
    • starttls()는 보안 연결을 활성화합니다.
  4. 발신자 인증
    • 발신자의 이메일 주소와 비밀번호를 사용해 SMTP 서버에 로그인합니다.
    • Gmail의 경우, 보안 설정에 따라 앱 비밀번호를 생성해야 할 수 있습니다.

 

3. HTML 이메일 작성

단순한 텍스트 이메일 대신 HTML 형식의 이메일을 보낼 수도 있습니다. HTML 이메일은 더 풍부한 스타일과 구조를 제공하며, 예를 들어 텍스트를 굵게 표시하거나 링크를 추가할 수 있습니다.

from email.mime.text import MIMEText

# HTML 이메일 내용
html_content = """
<html>
  <body>
    <h1 style="color:blue;">안녕하세요!</h1>
    <p>이 메일은 <b>Python</b>을 사용해 보낸 HTML 이메일입니다.</p>
    <p><a href="https://www.python.org">Python 공식 웹사이트</a>를 방문해보세요!</p>
  </body>
</html>
"""

# HTML 형식의 이메일 작성
msg = MIMEText(html_content, "html")  # HTML 형식으로 이메일 작성
msg["Subject"] = "HTML 이메일 테스트"
msg["From"] = sender_email
msg["To"] = "recipient_email@gmail.com"

 

4. 첨부파일 추가

이메일에 파일을 첨부하려면 email.mime.multipart.MIMEMultipartemail.mime.base.MIMEBase를 사용합니다.

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 이메일 작성
msg = MIMEMultipart()  # 다중 파트 이메일 생성
msg["Subject"] = "첨부파일 테스트"
msg["From"] = sender_email
msg["To"] = "recipient_email@gmail.com"

# 이메일 본문 추가
body = "이 메일에는 첨부파일이 포함되어 있습니다."
msg.attach(MIMEText(body, "plain"))

# 첨부파일 추가
file_path = "example.pdf"  # 첨부할 파일 경로
with open(file_path, "rb") as attachment:
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())  # 파일 내용을 읽어와 첨부
encoders.encode_base64(part)  # 파일을 Base64 형식으로 인코딩
part.add_header(
    "Content-Disposition",
    f"attachment; filename={file_path}",  # 첨부파일 이름 설정
)
msg.attach(part)  # 이메일에 첨부파일 추가