◼️ 코드
def sendmail(RECIPIENT , SENDER, SUBJECT , BODY_TEXT , BODY_HTML):
import os, sys , boto3
from botocore.exceptions import ClientError
ACCESS_KEY = "AAAAAAAAAAA"
SECRET_KEY = "BBBBBBBBBBBBBBBBBBBBBBBBBBB"
CONFIGURATION_SET = "my-first-configuration-set" # "ConfigSet"
client = boto3.client('ses',aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY,region_name="ap-northeast-2" )
try:
# Provide the contents of the email.
CHARSET = "UTF-8"
response = client.send_email(
Destination={ 'ToAddresses': [ RECIPIENT, ], },
Message={
'Subject': {'Charset': CHARSET, 'Data': SUBJECT, },
'Body': {
'Html': { 'Charset': CHARSET, 'Data': BODY_HTML,},
#'Text': {'Charset': CHARSET, 'Data': BODY_TEXT, },
},
},
Source=SENDER,
# If you are not using a configuration set, comment or delete the # following line
ConfigurationSetName=CONFIGURATION_SET,
)
# Display an error if something goes wrong.
except ClientError as e: print(e.response['Error']['Message'])
else:
print("Email Send! Message ID:" , response['MessageId'] )
print(response)
SENDER= "custom@amosoo.io"
RECIPIENT = "lee@amosoo.io"
import datetime
SUBJECT = '[상품문의][報告背負う] '
BODY_TEXT = '124124'
BODY_HTML = '<b>ProductID</b> デスクトップ版にできること</br></br> %s ' % </b>datetime.datetime.now()
sendmail(RECIPIENT , SENDER, SUBJECT , BODY_TEXT , BODY_HTML)
◼️ 코드분석
1. 코드 전체 개요 및 파라미터 구조
함수 sendmail은 이메일을 보낼 때 필요한 기본 정보들을 매개변수로 받아서 AWS SES API를 호출.
RECIPIENT: 받는 사람의 이메일 주소SENDER: 보내는 사람의 이메일 주소 (AWS SES에 사전 인증된 도메인/이메일이어야 함)SUBJECT: 메일 제목BODY_TEXT: 순수 텍스트 형식의 메일 본문 (HTML을 지원하지 않는 클라이언트용)BODY_HTML: HTML 태그가 적용된 메일 본문
2. 세부 코드 단계별 분석
모듈 임포트와 라이브러리 준비
import os, sys , boto3
from botocore.exceptions import ClientError
boto3: AWS 리소스와 통신하기 위한 파이썬 공식 SDK이다.ClientError: AWS 서비스 호출 중 발생하는 에러(인증 실패, 할당량 초과, 잘못된 파라미터 등)를 잡기 위해botocore에서 가져왔다.보통 파이썬 스타일 가이드(PEP 8)에서는 함수 내부가 아니라 스크립트 최상단에
import를 모아두는 것을 권장한다.
② AWS 클라이언트 생성 및 인증
ACCESS_KEY = "AAAAAAAAAAA"
SECRET_KEY = "BBBBBBBBBBBBBBBBBBBBBBBBBBB"
CONFIGURATION_SET = "my-first-configuration-set"
client = boto3.client('ses', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name="ap-northeast-2")
boto3.client('ses', ...): SES 서비스 클라이언트 객체를 생성해.region_name="ap-northeast-2": 서울 리전을 지정한 거야. SES는 리전별로 엔드포인트와 인증 상태가 분리되므로 본인의 SES 도메인이 등록된 리전과 일치해야 해.CONFIGURATION_SET: SES에서 메일 오픈율, 클릭률, 반송률(Bounce) 등을 추적할 때 사용하는 설정 세트야. 필요 없다면 생략 가능해.
③ 메일 발송 (client.send_email) 및 예외 처리
try:
CHARSET = "UTF-8"
response = client.send_email(
Destination={ 'ToAddresses': [ RECIPIENT, ], },
Message={
'Subject': {'Charset': CHARSET, 'Data': SUBJECT, },
'Body': {
'Html': { 'Charset': CHARSET, 'Data': BODY_HTML,},
#'Text': {'Charset': CHARSET, 'Data': BODY_TEXT, },
},
},
Source=SENDER,
ConfigurationSetName=CONFIGURATION_SET,
)
except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email Send! Message ID:" , response['MessageId'] )
print(response)
Destination: 수신자 목록을 리스트(list) 형태로 전달해. 여러 명에게 보낼 경우[RECIPIENT1, RECIPIENT2]처럼 확장할 수 있어.Message: 제목과 본문을 구성해. 한국어나 일본어 같은 다국어 문자가 깨지지 않도록Charset="UTF-8"을 명시했어. 현재 코드에서는 HTML 본문만 활성화되어 있고, 텍스트 본문은 주석 처리되어 있어.try-except-else흐름:발송 도중 권한 오류나 인증되지 않은 이메일 주소 문제 등으로 실패하면
except ClientError블록으로 넘어가 에러 메시지를 출력해.정상적으로 발송 요청이 SES에 접수되면
else블록이 실행되며 AWS가 발급한 고유MessageId와 전체 응답 딕셔너리를 출력해.
3. 보안 및 실무 관점에서의 핵심 개선 포인트
하드코딩된 API Key 제거 (보안)
ACCESS_KEY와SECRET_KEY를 소스 코드에 직접 적어두면 깃허브(GitHub) 등에 실수로 노출될 위험이 아주 크다.환경 변수(
os.environ.get(...))나 AWS CLI의 자격 증명 파일(~/.aws/credentials), 또는 서버 환경이라면 IAM Role(인스턴스 프로파일)을 사용하는 게 표준이다.
샌드박스 모드(SES Sandbox) 체크
AWS SES 계정을 처음 만들면 '샌드박스' 상태에 있어. 이 상태에서는 사전에 AWS 콘솔에서 인증(Verify)을 마친 이메일 주소로만 메일을 보낼 수 있다.
불특정 다수에게 메일을 보내려면 AWS 지원 센터에 프로덕션 액세스 요청을 해서 샌드박스를 해제해야 한다.
최신 문자열 포매팅 적용
%포매팅 방식보다는 파이썬 3.6 이상에서 권장하는f-string을 사용하는 것이 가독성과 유지보수 면에서 훨씬 좋아.
* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.