SES 로 메일 발송






설정이 완료되었다면 아래의 Python 코드로 메일을 보낼 수 있다.

◼️ 코드

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_KEYSECRET_KEY를 소스 코드에 직접 적어두면 깃허브(GitHub) 등에 실수로 노출될 위험이 아주 크다.

    • 환경 변수(os.environ.get(...))나 AWS CLI의 자격 증명 파일(~/.aws/credentials), 또는 서버 환경이라면 IAM Role(인스턴스 프로파일)을 사용하는 게 표준이다.

  • 샌드박스 모드(SES Sandbox) 체크

    • AWS SES 계정을 처음 만들면 '샌드박스' 상태에 있어. 이 상태에서는 사전에 AWS 콘솔에서 인증(Verify)을 마친 이메일 주소로만 메일을 보낼 수 있다.

    • 불특정 다수에게 메일을 보내려면 AWS 지원 센터에 프로덕션 액세스 요청을 해서 샌드박스를 해제해야 한다.

  • 최신 문자열 포매팅 적용

    • % 포매팅 방식보다는 파이썬 3.6 이상에서 권장하는 f-string을 사용하는 것이 가독성과 유지보수 면에서 훨씬 좋아.






* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.