실무에서 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가 됩니다.