실무에서 SMTP 설정을 요청받거나 진행할 때, 보통 아래 5가지 정보를 세트로 관리합니다.
SMTP 호스트(Host): 이메일 서버의 주소입니다. (예: smtp.gmail.com, smtp.office365.com)
포트(Port): 통신 통로 번호입니다.
587: 보안 연결(STARTTLS)을 위한 표준 포트 (권장)
465: 암호화 연결(SSL/TLS)을 위한 포트
25: 서버 간 통신용 (대부분의 클라우드 환경에서 차단됨)
사용자 이름(Username): 보통 발신용 이메일 주소나 API 키 ID를 사용합니다.
비밀번호(Password): 계정 비밀번호 또는 보안을 위해 생성된 '앱 비밀번호(App Password)'를 사용합니다.
암호화 방식: TLS 또는 SSL 여부를 결정합니다.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 1. SMTP 자격 증명 설정 (환경 변수 사용 권장)
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
SMTP_USER = "your_email@gmail.com"
SMTP_PASSWORD = "your_app_password_here" # 실제 비번이 아닌 '앱 비밀번호'
def send_email(subject, body, to_email):
try:
# 2. 메시지 구성
msg = MIMEMultipart()
msg['From'] = SMTP_USER
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
# 3. 서버 접속 및 인증
server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls() # TLS 보안 시작
server.login(SMTP_USER, SMTP_PASSWORD) # 자격 증명 인증
# 4. 메일 발송 및 종료
server.send_message(msg)
server.quit()
print("메일 발송 성공")
except Exception as e:
print(f"메일 발송 실패: {e}")
# 실행 예시
send_email("업무 보고", "본문 내용입니다.", "receiver@example.com")
앱 비밀번호(App Password) 사용: 최근 Google(Gmail)이나 Microsoft(Outlook)는 보안상의 이유로 일반 계정 비밀번호를 통한 SMTP 접속을 차단합니다. 반드시 2단계 인증을 활성화한 후 '앱 비밀번호'를 별도로 생성해 사용해야 합니다.
하드코딩 금지: 코드 내에 자격 증명을 직접 적지 마세요. .env 파일이나 시스템 환경 변수(Environment Variables), 또는 AWS Secrets Manager 같은 자격 증명 관리 서비스를 활용해야 합니다.
IP 화이트리스트(Whitelist): 기업용 메일 서버(예: Hiworks, Works Mobile 등)를 쓸 경우, 특정 서버 IP에서만 SMTP 발송이 가능하도록 제한을 걸어 보안을 강화할 수 있습니다.
전용 계정 생성: 개인 업무용 계정보다는 noreply@company.com과 같은 발송 전용 시스템 계정을 만들어 사용하는 것이 관리와 보안 측면에서 유리합니다.
| 오류 메시지 | 원인 | 해결 방법 |
|---|---|---|
| 535 Authentication Failed | 아이디나 비밀번호 오입력 | 앱 비밀번호 확인 및 2단계 인증 여부 체크 |
| Connection Timed Out | 포트가 막혀 있음 | 방화벽 설정 확인 (특히 클라우드 환경에서 25번 포트 차단 여부) |
| 5.7.1 Client was not authenticated | 인증 단계 누락 | server.login() 함수 호출 전 server.starttls() 여부 확인 |
| 구분 | 장점 | 단점/주의사항 |
|---|---|---|
| 직접 구축(SMTP) | 표준 프로토콜로 구현이 쉽고 라이브러리가 풍부함 | 대량 발송 시 스팸함으로 빠질 확률이 높음 (SPF, DKIM 설정 필요) |
| 전문 서비스(SendGrid, AWS SES 등) | 대량 발송 안정성, 분석 대시보드 제공, 높은 도달률 | 추가 비용 발생, 서비스 종속성(Lock-in) |
실무 팁: 만약 하루에 수천 통 이상의 마케팅 메일을 보내야 한다면 일반 SMTP보다는 SendGrid, AWS SES, Mailgun 같은 전문 이메일 API 서비스를 사용하는 것이 자격 증명 관리와 도달률 측면에서 훨씬 유리합니다. 이 경우 자격 증명은 일반 비밀번호가 아닌 해당 서비스에서 발급한 API Key가 됩니다.

이메일은 발신(Send) 과 수신(Receive) 이라는 두 가지 흐름으로 동작하며, 이를 위해 각각 역할이 다른 표준 프로토콜을 사용합니다.
SMTP: 메일을 보내는 프로토콜
IMAP / POP3: 메일을 받는 프로토콜
SMTP는 이메일을 작성한 후 내 기기에서 메일 서버로,
또는 메일 서버 간에 이메일을 전달하는 역할을 합니다.
특징
메일 발송 시 반드시 필요한 프로토콜
발신 전용 (수신 기능 없음)
전송 후 메일은 서버의 보낸 편지함에 저장 가능
특징
메일은 서버에 저장
스마트폰, PC 등 여러 기기에서 동일한 메일함 확인 가능
읽음, 삭제, 이동 상태가 모든 기기에 즉시 반영
권장 사용 환경
모바일 + PC 등 다중 기기 사용
언제 어디서든 동일한 메일 상태를 유지해야 하는 경우
특징
메일을 다운로드한 해당 기기에서만 확인 가능
서버 용량 사용이 적음
오프라인 환경에서도 메일 확인 가능
설정에 따라 서버에 메일을 남길 수도 있음
적합한 환경
단일 기기에서만 메일을 확인하는 경우
서버에 메일 기록을 최소화해야 하는 경우
| 구분 | SMTP (발신) | IMAP (수신 / 동기화) | POP3 (수신 / 다운로드) |
|---|---|---|---|
| 주요 역할 | 메일 전송 | 서버 메일 동기화 | 메일 다운로드 |
| 사용 시점 | 메일 보낼 때 | 메일 받을 때 | 메일 받을 때 |
| 상태 공유 | 없음 | 모든 기기 동일 | 기기별 개별 |
| 서버 저장 | 보낸 메일 저장 가능 | 원본 유지 | 보통 삭제 |
| 다중 기기 | 해당 없음 | 가능 | 부적합 |
| 오프라인 확인 | 불가 | 제한적 | 가능 |