콘텐츠로 이동
한국어

SMTP로 메일 보내기

연결 전 준비

메일함의 사용자 이름과 비밀번호로 SMTP에 인증하여 애플리케이션에서 메일을 보내세요. API 키와 계정 토큰은 SMTP에 사용할 수 없습니다.

연결된 도메인에 활성 메일함을 만들고 DNS 레코드 검증을 완료하세요. 사용자 이름은 [email protected]과 같은 전체 이메일 주소입니다. 메일 계정 비밀번호가 아닌 해당 메일함의 비밀번호를 사용하세요. 예제 주소를 실제 주소로 바꾸세요. 비밀번호는 실행 시 입력하며 화면에 표시되지 않습니다.

서버, 포트 및 암호화

연결된 모든 도메인에서 mail.adapt-mail.com을 사용하세요. 465 포트는 연결 즉시 TLS를 시작하고, 587 포트는 STARTTLS 후 인증합니다. 한 가지 방식을 선택하고 인증서 검증은 활성화된 상태로 유지하세요.

예제의 From 주소와 SMTP 봉투 발신자는 메일함 사용자 이름과 같습니다. 발신자 표시 이름은 변경할 수 있습니다. 25 포트는 메일 서버 간 통신용입니다. 애플리케이션에서는 465 또는 587을 사용하세요.

SMTP_HOST = "mail.adapt-mail.com"
SMTP_PORT = 465
SMTP_USER = "[email protected]"
SMTP_PASSWORD = "<mailbox-password>"
SMTP_FROM = "[email protected]"
SMTP_FROM_NAME = "Example"
465: implicit TLS
587: STARTTLS

Python: 465 포트로 보내기

이 예제는 Python 3 표준 라이브러리만 사용합니다. send_mail.py로 저장한 뒤 python3 send_mail.py를 실행하세요. 자동 발송 시에는 애플리케이션의 보안 설정에서 비밀번호를 가져오고 Git이나 로그에 저장하지 마세요.

import smtplib
import ssl
from getpass import getpass
from email.message import EmailMessage
from email.utils import formataddr, make_msgid, formatdate
username = "[email protected]"
password = getpass("SMTP password: ")
recipient = "[email protected]"
message = EmailMessage()
message["From"] = formataddr(("Example", username))
message["To"] = recipient
message["Subject"] = "SMTP test"
message["Date"] = formatdate(localtime=False, usegmt=True)
message["Message-ID"] = make_msgid(domain=username.split("@")[1])
message.set_content("Hello! This message was sent through Adapt Mail SMTP.")
with smtplib.SMTP_SSL(
"mail.adapt-mail.com", 465, timeout=30,
context=ssl.create_default_context(),
) as smtp:
smtp.login(username, password)
refused = smtp.send_message(
message, from_addr=username, to_addrs=[recipient],
)
print("Rejected recipients:", refused)

Python: 587 포트로 연결하기

STARTTLS를 사용하려면 이전 예제의 메시지 준비 코드를 유지하고 with smtplib.SMTP_SSL 블록을 아래 코드로 바꾸세요. smtplib.SMTP에서는 STARTTLS가 성공한 후에만 비밀번호가 전송됩니다.

with smtplib.SMTP("mail.adapt-mail.com", 587, timeout=30) as smtp:
smtp.ehlo()
smtp.starttls(context=ssl.create_default_context())
smtp.ehlo()
smtp.login(username, password)
refused = smtp.send_message(
message, from_addr=username, to_addrs=[recipient],
)
print("Rejected recipients:", refused)

HTML 및 첨부파일

set_content 뒤에 HTML 버전을 추가하고 발송 전에 첨부파일을 추가하세요. HTML을 지원하지 않는 클라이언트를 위해 일반 텍스트 버전도 유지하세요. 신뢰할 수 있는 HTML만 사용하거나 삽입할 데이터를 이스케이프 처리하세요.

message.add_alternative(
"<p>Hello! This message was sent through <strong>Adapt Mail</strong>.</p>",
subtype="html",
)
with open("document.pdf", "rb") as attachment:
message.add_attachment(
attachment.read(), maintype="application", subtype="pdf",
filename="document.pdf",
)

결과, 제한 및 보낸 메일

send_message 성공은 SMTP 서버가 메일을 수락했다는 뜻이며 수신자의 받은편지함에 도착했다는 뜻은 아닙니다. refused 딕셔너리에는 거부된 수신자가 포함됩니다. 모든 수신자가 거부되면 Python은 SMTPRecipientsRefused 예외를 발생시킵니다.

SMTP와 API는 메일함별 제한을 공유합니다. 최근 60초 동안 최대 30통, 메일당 최대 50명, 최근 24시간 동안 최대 1000명의 수신자에게 보낼 수 있으며 상향된 제한이 활성화되면 5000명입니다. To, Cc, Bcc의 모든 수신자를 계산합니다.

SMTP로 직접 보내면 보낸편지함에 사본이 자동 저장되지 않습니다. 메일 클라이언트는 IMAP으로 사본을 저장하며, Adapt Mail API는 발송 시 사본을 별도로 저장합니다.

SMTP 오류

535
인증 실패: 전체 주소, 메일함 비밀번호 및 메일함 사용 가능 여부를 확인하세요.
451
발송 제한 초과 등을 포함한 일시적인 실패입니다. 잠시 기다린 뒤 재시도하세요.
550 / 5xx
영구적인 거부: 주소, 발신자 권한 및 응답 내용을 확인하세요. 수신자가 50명을 넘으면 DATA 이후 거부됩니다. 원인을 해결한 후 재시도하세요.
TLS / timeout
mail.adapt-mail.com, 포트, TLS 모드 및 애플리케이션 서버의 외부 연결 가능 여부를 확인하세요. 465에서는 SMTP_SSL, 587에서는 STARTTLS를 사용하는 SMTP를 이용하세요.

SMTP 서버의 전체 응답을 확인하세요. 일시적인 실패는 기다린 뒤 재시도하세요. 메시지 전송 후 연결이 끊겨 결과를 알 수 없다면 무작정 다시 보내지 마세요. SMTP에는 Idempotency-Key가 없어 재시도로 중복 메일이 발생할 수 있습니다.