

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SES를 사용하여 이메일 전송 설정
<a name="send-email"></a>

Amazon SES 콘솔, 간이 전자 우편 전송 프로토콜(SMTP) 인터페이스 또는 Amazon SES API를 사용하여Amazon Simple Email Service (Amazon SES)로 이메일을 전송할 수 있습니다. 일반적으로 콘솔을 사용하여 테스트 이메일을 보내고 전송 활동을 관리합니다. 대용량 이메일을 보내려면 SMTP 인터페이스 또는 API를 사용합니다. Amazon SES 이메일 요금에 대한 자세한 내용은 [Amazon SES 요금](https://aws.amazon.com/ses/pricing)을 참조하세요.
+ SMTP 지원 소프트웨어 패키지, 애플리케이션 또는 프로그래밍 언어를 사용하여 Amazon SES를 통해 이메일을 보내거나 Amazon SES를 기존 메일 서버와 통합하려는 경우 Amazon SES SMTP 인터페이스를 사용합니다. 자세한 내용은 [프로그래밍 방식으로 Amazon SES SMTP 인터페이스를 통해 이메일 전송](send-using-smtp-programmatically.md) 단원을 참조하십시오.
+ 원시 HTTP 요청을 사용하여 Amazon SES를 호출하려는 경우 Amazon SES API를 사용합니다. 자세한 내용은 [Amazon SES API를 사용하여 이메일 보내기](send-email-api.md) 단원을 참조하십시오.

**중요**  
여러 수신자에게 이메일을 보내는 경우(수신자는 "To", "CC" 및 "BCC" 주소) Amazon SES에 대한 호출이 실패하면 전체 이메일이 거부되고 모든 수신자에게 의도한 이메일이 수신되지 않습니다. 따라서 한 번에 한 명의 수신자에게 이메일을 보내는 것이 좋습니다.

# Amazon SES SMTP 인터페이스를 사용하여 이메일 보내기
<a name="send-email-smtp"></a>

Amazon SES를 통해 프로덕션 이메일을 보내려면 SMTP(Simple Mail Transfer Protocol) 인터페이스 또는 Amazon SES API를 사용할 수 있습니다. Amazon SES API에 대한 자세한 내용은 [Amazon SES API를 사용하여 이메일 보내기](send-email-api.md) 섹션을 참조하세요. 이 섹션에서는 SMTP 인터페이스에 대해 설명합니다.

Amazon SES는 인터넷에서 가장 일반적인 이메일 프로토콜인 SMTP를 사용하여 이메일을 전송합니다. 다양한 SMTP 지원 프로그래밍 언어 및 소프트웨어에서 Amazon SES SMTP 인터페이스에 연결하여 Amazon SES를 통해 이메일을 보낼 수 있습니다. 이 섹션에서는 Amazon SES SMTP 자격 증명을 받는 방법, Amazon SES SMTP 인터페이스를 사용하여 이메일을 보내는 방법, 이메일 전송에 Amazon SES를 사용하도록 몇 가지 소프트웨어 및 메일 서버를 구성하는 방법을 설명합니다.

SMTP 인터페이스를 통해 Amazon SES를 사용할 때 발생할 수 있는 일반적인 문제에 대한 해결책은 [Amazon SES SMTP 문제](troubleshoot-smtp.md) 섹션을 참조하세요.

## SMTP를 통한 이메일 전송 요구 사항
<a name="send-email-smtp-requirements"></a>

Amazon SES SMTP 인터페이스를 사용하여 이메일을 보내려면 다음 항목이 필요합니다.
+ SMTP 엔드포인트 주소입니다. Amazon SES SMTP 엔드포인트 목록은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 단원을 참조하십시오.
+ SMTP 인터페이스 포트 번호. 포트 번호는 연결 방법에 따라 다릅니다. 자세한 내용은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 단원을 참조하세요.
+ SMTP 사용자 이름 및 암호. SMTP 자격 증명은 각 AWS 리전마다 고유합니다. SMTP 인터페이스를 사용하여 여러 AWS 리전에서 이메일을 전송하려면 리전별로 SMTP 보안 인증 정보가 필요합니다.
**중요**  
SMTP 자격 증명은 AWS 액세스 키 또는 Amazon SES 콘솔에 로그인하는 데 사용하는 자격 증명과 동일하지 않습니다. SMTP 보안 인증 정보를 생성하는 방법에 대한 자세한 내용은 [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md) 섹션을 참조하세요.
+ TLS(전송 계층 보안)를 사용하여 통신할 수 있는 클라이언트 소프트웨어. 자세한 내용은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 단원을 참조하세요.
+ Amazon SES에서 확인한 이메일 주소. 자세한 내용은 [Amazon SES에서 확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하세요.
+ 대량의 이메일을 보내려는 경우 높은 발신 할당량. 자세한 내용은 [Amazon SES 발신 한도 관리](manage-sending-quotas.md) 단원을 참조하십시오.

## SMTP를 통해 전자 메일을 보내는 방법
<a name="send-email-methods"></a>

다음 방법 중 하나를 통해 SMTP를 통해 이메일을 보낼 수 있습니다.
+ Amazon SES SMTP 인터페이스를 통해 이메일을 보내도록 이러한 SMTP 지원 소프트웨어를 구성하려면 [소프트웨어 패키지를 사용하여 Amazon SES를 통해 이메일 보내기](send-email-smtp-software-package.md) 섹션을 참조하세요.
+ Amazon SES를 통해 이메일을 보내도록 애플리케이션을 프로그래밍하는 방법은 [프로그래밍 방식으로 Amazon SES SMTP 인터페이스를 통해 이메일 전송](send-using-smtp-programmatically.md) 섹션을 참조하세요.
+ Amazon SES를 통해 발신 메일을 보내도록 기존 이메일 서버를 구성하는 방법은 [기존 이메일 서버와 Amazon SES 통합](send-email-smtp-existing-server.md) 섹션을 참조하세요.
+ 명령줄을 사용하여 Amazon SES SMTP 인터페이스와 상호 작용하는 방법(테스트에 유용할 수 있음)은 [명령줄을 사용하여 Amazon SES SMTP 인터페이스에 대한 연결 테스트](send-email-smtp-client-command-line.md) 섹션을 참조하세요.

SMTP 응답 코드의 목록은 [Amazon SES에서 반환하는 SMTP 응답 코드](troubleshoot-smtp.md#troubleshoot-smtp-response-codes)을(를) 참조하세요.

## 제공할 이메일 정보
<a name="smtp-parameters"></a>

SMTP 인터페이스를 통해 Amazon SES에 액세스하는 경우 SMTP 클라이언트 애플리케이션이 메시지를 수집합니다. 따라서 제공해야 할 정보는 어떤 애플리케이션을 사용하는가에 따라 달라집니다. 클라이언트와 서버 간의 SMTP 교환에는 최소한 다음이 필요합니다.
+ 소스 주소
+ 대상 주소
+ 메시지 데이터

SMTP 인터페이스를 사용 중이고 피드백 전달이 활성화된 상태라면 반송 메일, 수신 거부 및 전송 알림이 "MAIL FROM" 주소로 전송됩니다. 사용자가 지정한 "Reply-To" 주소는 사용되지 않습니다.



# Amazon SES SMTP 자격 증명 획득
<a name="smtp-credentials"></a>

SES SMTP 인터페이스에 액세스하려면 Amazon SES SMTP 보안 인증 정보가 필요합니다.

SES SMTP 인터페이스를 통해 이메일을 보내는 데 사용하는 자격 증명은 각 AWS 리전에 고유합니다. SES SMTP 인터페이스를 사용하여 둘 이상의 리전에서 이메일을 전송하는 경우, 사용할 계획 중인 각 리전에 대해 SMTP 자격 증명 세트를 생성해야 합니다.

SMTP 암호는 AWS 보안 액세스 키와 다릅니다. 자격 증명에 대한 자세한 내용은 [Amazon SES 자격 증명 유형](send-email-concepts-credentials.md) 단원을 참조하세요.

**참고**  
현재 사용 가능한 SMTP 엔드포인트 목록은 *AWS 일반 참조*의 [SMTP 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ses.html#ses_smtp_endpoints)를 참조하세요.

## SES 콘솔을 사용하여 SES SMTP 보안 인증 정보 받기
<a name="smtp-credentials-console"></a>

**요구 사항**  
IAM 사용자는 SES SMTP 보안 인증 정보를 생성할 수 있지만 IAM을 사용하여 SES SMTP 보안 인증 정보를 생성하기 때문에 사용자의 정책이 사용자에게 IAM 자체를 사용할 권한을 부여해야 합니다. IAM 정책은 사용자가 `iam:ListUsers`, `iam:CreateUser`, `iam:CreateAccessKey` 및 `iam:PutUserPolicy`(이)라는 IAM 작업을 수행하도록 허용해야 합니다. 콘솔을 사용하여 SES SMTP 자격 증명을 생성하려는 경우 IAM 사용자에게 이러한 권한이 없으면 사용자 계정은 *‘iam:ListUsers를 수행할 권한이 없다’*는 오류가 표시됩니다.

**중요**  
위에서 참조한 IAM 작업에는 서비스에서 리소스 권한을 부여하거나 수정할 수 있는 권한을 부여하기 때문에 IAM 수준이 가장 높은 [권한 관리](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_understand-policy-summary-access-level-summaries.html#access_policies_access-level) 액세스 수준이 있습니다. 따라서 AWS 계정의 보안을 개선하려면 권한 관리 액세스 수준 분류를 포함하는 이러한 정책을 제한하거나 정기적으로 모니터링하는 것이 좋습니다.

**SMTP 자격 증명을 만들려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ses/](https://console.aws.amazon.com/ses/) Amazon SES 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **SMTP settings**(SMTP 설정)를 선택합니다. 그러면 **Simple Mail Transfer Protocol (SMTP) settings**(SMTP(Simple Mail Transfer Protocol) 설정) 페이지가 열립니다.

1. 오른쪽 상단에서 **Create SMTP Credentials**(SMTP 보안 인증 생성)를 선택합니다. IAM 콘솔이 열립니다.

1. (선택 사항) 이미 생성한 SMTP 사용자를 보거나 편집하거나 삭제해야 하는 경우 오른쪽 하단에서 **Manage my existing SMTP credentials**(기존 SMTP 보안 인증 관리)를 선택합니다. IAM 콘솔이 열립니다. SMTP 보안 인증 관리에 대한 세부 정보는 다음 절차에 따라 제공됩니다.

1. **SMTP 사용자 생성**의 **사용자 이름** 필드에 SMTP 사용자의 이름을 입력합니다. 또는 이 필드에 입력된 기본값을 사용할 수 있습니다. 마쳤으면 오른쪽 하단에서 **사용자 생성**을 선택합니다.

1. *SMTP 암호* 아래의 **표시**를 선택하면 SMTP 보안 인증 정보가 화면에 표시됩니다.

1. 이 대화 상자를 닫은 후에는 보안 인증 정보를 보거나 저장할 수 없으므로 **.csv 파일 다운로드**를 선택하여 이러한 보안 인증 정보를 다운로드하거나 복사하여 안전한 장소에 저장하세요.

1. **SES 콘솔로 돌아가기**를 선택합니다.

IAM 콘솔의 **액세스 관리(Access management)**에서 이 절차를 사용하여 생성한 SMTP 보안 인증 정보 목록을 보고 **사용자(Users)**를 선택한 다음 검색 창을 사용하여 SMTP 보안 인증 정보를 할당한 모든 사용자를 찾을 수 있습니다.

IAM 콘솔을 사용하여 기존 SMTP 사용자를 삭제할 수도 있습니다. 사용자 삭제에 대한 자세한 내용은 *IAM 시작 안내서*의 [IAM 사용자 관리](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html)를 참조하세요.

SMTP 암호를 변경하려면 IAM 콘솔에서 기존 SMTP 사용자를 삭제합니다. 그런 다음 이전 절차를 완료하여 새 SMTP 자격 증명 집합을 만듭니다.

## 기존 자격 증명을 변환하여 SES SMTP AWS 자격 증명 획득
<a name="smtp-credentials-convert"></a>

IAM 인터페이스를 사용하여 설정한 사용자가 있는 경우 자격 증명에서 사용자의 SES SMTP AWS 자격 증명을 도출할 수 있습니다.

**중요**  
임시 AWS 자격 증명을 사용하여 SMTP 자격 증명을 추출하지 마십시오. SES SMTP 인터페이스는 임시 보안 인증 정보에서 생성된 SMTP 보안 인증 정보를 지원하지 않습니다.

**IAM 사용자가 SES SMTP 인터페이스를 사용하여 이메일을 보내도록 하는 방법**

1. 다음 절차에 따라이 섹션에 제공된 알고리즘을 사용하여 자격 증명에서 사용자의 SMTP AWS 자격 증명을 도출합니다.

   자격 AWS 증명부터 시작하므로 SMTP 사용자 이름은 AWS 액세스 키 ID와 동일하므로 SMTP 암호만 생성하면 됩니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. **액세스 관리**에서 **정책**을 선택한 다음 **정책 만들기**를 선택합니다.

1. **정책 편집기**에서 **JSON**을 선택하고 편집기에서 예제 코드를 제거합니다.

1. 다음 권한 정책을 편집기에 붙여넣습니다.

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
   "Effect": "Allow",
               "Action": "ses:SendRawEmail",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. **다음**을 선택하고 **정책 이름** 필드에 `AmazonSesSendingAccess`를 입력한 다음 **정책 만들기**를 입력합니다.

1. **액세스 관리**에서 **사용자 그룹**을 선택한 다음 **그룹 만들기**를 선택합니다.

1. **사용자 그룹 이름** 필드에 `AWSSESSendingGroupDoNotRename`을 입력합니다.

1. **그룹에 사용자 추가** 테이블에서 SMTP 사용자를 선택하여 그룹에 이를 추가합니다.

1. **권한 정책 연결** 테이블에서 정책을 선택한 다음 **사용자 그룹 만들기**를 선택하여 이전에 만든 `AmazonSesSendingAccess` 정책을 연결합니다.

IAM에서 SES를 사용하는 방법에 대한 자세한 내용은 [Amazon SES의 Identity and Access Management](control-user-access.md) 섹션을 참조하세요.

**참고**  
IAM 사용자의 SES SMTP 보안 인증 정보를 생성할 수 있지만 SMTP 보안 인증 정보를 생성할 때 별도의 IAM 사용자를 생성하는 것이 좋습니다. 특정 용도로 사용자를 생성하는 것이 좋은 이유에 대한 자세한 내용은 [IAM 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPractices.html)를 참조하세요.

다음 의사 코드는 AWS 보안 액세스 키를 SES SMTP 암호로 변환하는 알고리즘을 보여줍니다.

```
 1. // Modify this variable to include your AWS secret access key
 2. key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
 3.             
 4. // Modify this variable to refer to the AWS Region that you want to use to send email.
 5. region = "us-west-2";
 6.             
 7. // The values of the following variables should always stay the same.
 8. date = "11111111";
 9. service = "ses";
10. terminal = "aws4_request";
11. message = "SendRawEmail";
12. version = 0x04;
13. 
14. kDate = HmacSha256(date, "AWS4" + key);
15. kRegion = HmacSha256(region, kDate);
16. kService = HmacSha256(service, kRegion);
17. kTerminal = HmacSha256(terminal, kService);
18. kMessage = HmacSha256(message, kTerminal);
19. signatureAndVersion = Concatenate(version, kMessage);
20. smtpPassword = Base64(signatureAndVersion);
```

일부 프로그래밍 언어에는 IAM 보안 액세스 키를 SMTP 암호로 변환하는 데 사용할 수 있는 라이브러리가 포함되어 있습니다. 이 섹션에는 Python을 사용하여 AWS 보안 액세스 키를 SES SMTP 암호로 변환하는 데 사용할 수 있는 코드 예제가 포함되어 있습니다.

**참고**  
다음 예에는 Python 3.6에 도입된 **f-strings**가 사용됩니다. 이전 버전을 사용하면 작동하지 않습니다.
다음 예에서 SMTP\$1REGIONS 목록은 단순한 예입니다. 각 AWS 리전에 대해 SMTP 자격 증명이 필요하므로 이메일을 보내려는 리전에 따라 실제 리전 목록이 더 짧거나 길어질 수 있습니다.

------
#### [ Python ]

```
#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    "us-east-2",  # US East (Ohio)
    "us-east-1",  # US East (N. Virginia)
    "us-west-2",  # US West (Oregon)
    "ap-south-1",  # Asia Pacific (Mumbai)
    "ap-northeast-2",  # Asia Pacific (Seoul)
    "ap-southeast-1",  # Asia Pacific (Singapore)
    "ap-southeast-2",  # Asia Pacific (Sydney)
    "ap-northeast-1",  # Asia Pacific (Tokyo)
    "ca-central-1",  # Canada (Central)
    "eu-central-1",  # Europe (Frankfurt)
    "eu-west-1",  # Europe (Ireland)
    "eu-west-2",  # Europe (London)
    "eu-south-1",  # Europe (Milan)
    "eu-north-1",  # Europe (Stockholm)
    "sa-east-1",  # South America (Sao Paulo)
    "us-gov-west-1",  # AWS GovCloud (US)
    "us-gov-east-1",  # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode("utf-8"), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode("utf-8")


def main():
    parser = argparse.ArgumentParser(
        description="Convert a Secret Access Key to an SMTP password."
    )
    parser.add_argument("secret", help="The Secret Access Key to convert.")
    parser.add_argument(
        "region",
        help="The AWS Region where the SMTP password will be used.",
        choices=SMTP_REGIONS,
    )
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == "__main__":
    main()
```

이 스크립트를 사용하여 SMTP 암호를 얻으려면 이전 코드를 `smtp_credentials_generate.py`(으)로 저장합니다. 그런 다음 명령줄에서 다음 명령을 실행합니다.

```
python path/to/smtp_credentials_generate.py wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY us-east-1
```

위의 명령에서 다음을 수행합니다.
+ *path/to/*를 `smtp_credentials_generate.py`을(를) 저장한 위치의 경로로 바꿉니다.
+ *wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY*를 SMTP 암호로 전환하려는 시크릿 액세스 키로 대체합니다.
+ *us-east-1*을 SMTP 자격 증명을 사용하려는 AWS 리전으로 바꿉니다.

이 스크립트가 성공적으로 실행되면 SMTP 암호만 출력됩니다.

------

## 기존 인라인 정책에서 그룹 정책으로 SMTP 사용자 마이그레이션(보안 권장 사항)
<a name="migrate-inline-policy-to-group"></a>

**중요**  
2024년 9월 6일 이전에 SES SMTP 자격 증명을 만든 경우 인라인 정책과 태그가 SMTP 사용자에게 연결되어 있습니다. SES는 인라인 정책에서 벗어나 보안 권장 사항과 동일하게 수행할 것을 권장합니다.

기존 인라인 정책의 SMTP 사용자를 그룹 정책으로 마이그레이션하기 전에 먼저 SES 권한 정책으로 IAM 사용자 그룹을 만들어 인라인 정책을 대신해야 합니다. 이 IAM 사용자 그룹을 이미 만들었거나 2024년 9월 6일 이후부터 만들어진 SMTP 자격 증명이 자동으로 만들어진 경우 다음 절차의 *10단계*로 바로 건너뛸 수 있습니다.

**기존 인라인 정책에서 관리형 그룹으로 마이그레이션하는 방법**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. **액세스 관리**에서 **정책**을 선택한 다음 **정책 만들기**를 선택합니다.

1. **정책 편집기**에서 **JSON**을 선택하고 편집기에서 예제 코드를 제거합니다.

1. 다음 권한 정책을 편집기에 붙여넣습니다.

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
   "Effect": "Allow",
               "Action": "ses:SendRawEmail",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. **다음**을 선택하고 **정책 이름** 필드에 `AmazonSesSendingAccess`를 입력한 다음 **정책 만들기**를 입력합니다.

1. **액세스 관리**에서 **사용자 그룹**을 선택한 다음 **그룹 만들기**를 선택합니다.

1. **사용자 그룹 이름** 필드에 `AWSSESSendingGroupDoNotRename`을 입력합니다.

1. **그룹에 사용자 추가** 테이블에서 SMTP 사용자를 선택하여 그룹에 이를 추가합니다.

1. **권한 정책 연결** 테이블에서 정책을 선택한 다음 **사용자 그룹 만들기**를 선택하여 이전에 만든 `AmazonSesSendingAccess` 정책을 연결합니다.

   이제 SES 권한 정책을 사용하여 IAM 사용자 그룹을 만들었으므로 나머지 단계에 설명된 대로 현재 인라인 정책에서 이 그룹 정책으로 SMTP 사용자를 마이그레이션할 수 있습니다.

1. **액세스 관리**에서 **사용자**를 선택한 다음, 마이그레이션하려는 SMTP 사용자를 선택합니다.

1. **그룹** 탭을 선택하고 **그룹에 사용자 추가**를 선택합니다.

1. `AWSSESSendingGroupDoNotRename` 그룹을 선택한 다음 **그룹에 사용자 추가**를 선택합니다.

1. **권한** 탭을 선택하고 **정책 이름** 열에 `AmazonSesSendingAccess`와 함께 나열된 행 두 개가 있는지 확인합니다. 하나는 *인라인* 행이고 다른 하나는 **연결 방식:** 열에 나열된 *`AWSSESSendingGroupDoNotRename` 그룹*입니다.

1. **정책 이름** 열에 `AmazonSesSendingAccess`가 포함된 행과 **연결 방식:** 열의 *인라인* 행만 선택한 다음, **제거**를 선택하고 **정책 제거**를 확인합니다.

   **연결 방식:** 열에 *`AWSSESSendingGroupDoNotRename` 그룹*이 있는 행이 남아 있는지 확인합니다.

1. **태그** 탭을 선택한 다음 **태그 관리**를 선택합니다.

1. **키** 열의 *InvokedBy*와 **값** 열의 *SESConsole*이 포함된 행 옆에 있는 **제거**를 선택한 다음 **변경 사항 저장**을 선택합니다.

**중요**  
`AmazonSesSendingAccess` 정책(인라인 또는 그룹 정책 또는 둘 다)은 SMTP 사용자에게 연결되어 있어야 전송에 영향을 주지 않습니다. 그룹 정책이 사용자에게 연결된 후에만 인라인 정책을 제거합니다.

# Amazon SES SMTP 엔드포인트에 연결
<a name="smtp-connect"></a>

Amazon SES SMTP 인터페이스를 사용해 이메일을 전송하려면 SMTP 엔드포인트에 연결합니다. Amazon SES SMTP 엔드포인트의 전체 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/ses.html)을 참조하세요.

Amazon SES SMTP 엔드포인트에서는 TLS(전송 계층 보안)를 사용하여 모든 연결을 암호화해야 합니다. (TLS는 종종 이전 프로토콜 이름인 SSL로 불립니다.) Amazon SES는 TLS로 암호화된 연결 설정을 위한 두 가지 메커니즘인 STARTTLS 및 TLS 래퍼를 지원합니다. 사용 중인 소프트웨어의 설명서를 참조하여 소프트웨어가 STARTTLS, TLS 래퍼 또는 둘 다 지원하는지 여부를 확인하세요.

Amazon Elastic Compute Cloud(Amazon EC2)는 기본적으로 포트 25를 통한 이메일 트래픽을 제한합니다. EC2에서 SMTP 엔드포인트를 통해 이메일을 전송할 때 시간 초과를 방지하려면 [이메일 전송 제한 제거 요청](https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request)을 제출하여 제한을 제거합니다. 또는 다른 포트를 사용하여 이메일을 보내거나 [Amazon VPC 엔드포인트](send-email-set-up-vpc-endpoints.md)를 사용할 수 있습니다.

SMTP 연결 문제에 대해서는 [SMTP 문제](troubleshoot-smtp.md) 섹션을 참조하세요.

## STARTTLS
<a name="smtp-connect-starttls"></a>

STARTTLS는 암호화되지 않은 연결을 암호화된 연결로 업그레이드하는 방법입니다. 다양한 프로토콜을 위한 여러 버전의 STARTTLS이 있으며, SMTP 버전은 [RFC 3207](https://www.ietf.org/rfc/rfc3207.txt)에서 정의됩니다.

STARTTLS 연결을 설정하기 위해 SMTP 클라이언트는 포트 25, 587 또는 2587에서 Amazon SES SMTP 엔드포인트에 연결하고, EHLO 명령을 실행한 다음, 서버가 STARTTLS SMTP 확장을 지원한다고 공지할 때까지 대기합니다. 그런 다음 클라이언트는 STARTTLS 명령을 실행하여 TLS 협상을 시작합니다. 협상이 완료되면 클라이언트는 새로운 암호화된 연결을 통해 EHLO 명령을 실행하고 SMTP 세션이 정상적으로 진행됩니다.

## TLS 래퍼
<a name="smtp-connect-tlswrapper"></a>

TLS 래퍼(SMTPS 또는 핸드셰이크 프로토콜이라고도 함)는 암호화되지 않은 연결을 먼저 설정하지 않고 암호화된 연결을 시작하는 방법입니다. TLS 래퍼에서는 Amazon SES SMTP 엔드포인트가 TLS 협상을 수행하지 않습니다. TLS를 사용하여 엔드포인트와 연결한 후 전체 대화에 걸쳐 TLS를 계속 사용하는 것이 클라이언트의 책임입니다. TLS 래퍼는 더 오래된 프로토콜이지만 많은 클라이언트가 여전히 이 프로토콜을 지원합니다.

TLS 래퍼 연결을 설정하기 위해 SMTP 클라이언트는 포트 465 또는 2465에서 Amazon SES SMTP 엔드포인트에 연결합니다. 서버가 인증서를 제공하고, 클라이언트가 EHLO 명령을 실행한 후, SMTP 세션이 정상적으로 진행됩니다.

# 소프트웨어 패키지를 사용하여 Amazon SES를 통해 이메일 보내기
<a name="send-email-smtp-software-package"></a>

SMTP를 통한 이메일 전송을 지원하는 수많은 상업용 및 오픈 소스 소프트웨어 패키지가 있습니다. 여기 몇 가지 예가 있습니다:
+ 블로그 플랫폼
+ RSS 집계기
+ 목록 관리 소프트웨어
+ 워크플로우 시스템

Amazon SES SMTP 인터페이스를 통해 이메일을 보내도록 이러한 SMTP 지원 소프트웨어를 구성할 수 있습니다. 특정 소프트웨어 패키지에서 SMTP를 구성하는 방법에 대한 지침은 해당 소프트웨어의 설명서를 참조하세요.

다음 절차에서는 인기 있는 문제 추적 솔루션인 JIRA에서 Amazon SES 전송을 설정하는 방법을 보여 줍니다. 이 구성을 사용하면 JIRA는 소프트웨어 문제의 상태가 변경될 때마다 이메일을 통해 사용자에게 알릴 수 있습니다.

**Amazon SES를 사용하여 이메일을 보내도록 JIRA를 구성하려면**

1. 웹 브라우저를 사용하여 관리자 자격 증명으로 JIRA에 로그인합니다.

1. 브라우저 창에서 [**Administration**]을 선택합니다.

1. [**System**] 메뉴에서 [**Mail**]을 선택합니다.

1. [**Mail administration**] 페이지에서 [**Mail Servers**]를 선택합니다.

1. [**Configure new SMTP mail server**]를 선택합니다.

1. [**Add SMTP Mail Server**] 양식에서 다음 필드에 값을 입력합니다.

   1. **이름** - 이 서버에 대한 설명이 포함된 이름입니다.

   1. **발신 주소** - 이메일이 전송될 주소입니다. 이 주소에서 전송하려면 먼저 Amazon SES에서 이 이메일 주소를 확인해야 합니다. 확인에 대한 자세한 내용은 [Amazon SES에서 확인된 자격 증명](verify-addresses-and-domains.md)을(를) 참조하세요.

   1. **이메일 접두사** - JIRA에서 전송 전에 각 제목 줄 앞에 추가하는 문자열입니다.

   1. **프로토콜** - **SMTP**를 선택합니다.
**참고**  
이 설정을 사용하여 Amazon SES에 연결할 수 없는 경우 **SECURE\$1SMTP**를 선택해 보세요.

   1. **호스트 이름** - Amazon SES SMTP 엔드포인트 목록은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 섹션을 참조하세요. 예를 들어 미국 서부(오레곤) 리전에서 Amazon SES 엔드포인트를 사용하려는 경우 호스트 이름은 *email-smtp.us-west-2.amazonaws.com*이 됩니다.

   1. **SMTP 포트** - 25, 587 또는 2587(STARTTLS를 사용하여 연결하는 경우) 혹은 465 또는 2465(TLS 래퍼를 사용하여 연결하는 경우)입니다.

   1. **TLS** - 이 확인란을 선택합니다.

   1. **사용자 이름** - SMTP 사용자 이름입니다.

   1. **암호** - SMTP 암호입니다.

   다음 이미지에서 TLS 래퍼에 대한 설정을 볼 수 있습니다.  
![\[JIRA에 대한 SMTP 이메일 구성\]](http://docs.aws.amazon.com/ko_kr/ses/latest/dg/images/SMTP_jira.png)

1. [**Test Connection**]을 선택합니다. JIRA에서 Amazon SES를 통해 보내는 테스트 이메일이 성공적으로 도착하면 구성이 완료됩니다.

# 프로그래밍 방식으로 Amazon SES SMTP 인터페이스를 통해 이메일 전송
<a name="send-using-smtp-programmatically"></a>

Amazon SES SMTP 인터페이스를 사용하여 이메일을 전송하기 위해 SMTP 지원 프로그래밍 언어, 이메일 서버 또는 애플리케이션을 사용할 수 있습니다. 시작하기 전에 [Amazon Simple Email Service 설정](setting-up.md)의 작업을 완료해야 합니다. 또한 다음과 같은 정보가 필요합니다.
+ Amazon SES SMTP 엔드포인트와 연결하기 위한 Amazon SES SMTP 보안 인증 정보. Amazon SES SMTP 보안 인증 정보를 받으려면 [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md) 섹션을 참조하세요.
**중요**  
SMTP 자격 증명은 자격 AWS 증명과 다릅니다. 자격 증명에 대한 자세한 내용은 [Amazon SES 자격 증명 유형](send-email-concepts-credentials.md) 단원을 참조하세요.
+ SMTP 엔드포인트 주소입니다. Amazon SES SMTP 엔드포인트 목록은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 섹션을 참조하세요.
+ 연결 방법에 따른 Amazon SES SMTP 인터페이스 포트 번호. 자세한 내용은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 단원을 참조하십시오.

## 코드 예제
<a name="send-email-smtp-code-examples"></a>

SMTP 지원 프로그래밍 언어를 사용하여 Amazon SES SMTP 인터페이스에 액세스할 수 있습니다. Amazon SES SMTP 호스트 이름 및 포트 번호와 사용자의 SMTP 자격 증명을 입력한 후 프로그래밍 언어의 일반 SMTP 함수를 사용하여 이메일을 전송합니다.

Amazon Elastic Compute Cloud(Amazon EC2)는 기본적으로 포트 25를 통한 이메일 트래픽을 제한합니다. Amazon EC2의 SMTP 엔드포인트를 통해 이메일을 전송할 때 시간 초과를 방지하려면 이러한 제한을 제거하도록 요청할 수 있습니다. 자세한 내용은 [ Amazon EC2 인스턴스 또는 AWS Lambda 함수에서 포트 25에 대한 제한을 제거하려면 어떻게 해야 합니까?를 참조하세요.](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/) AWS 지식 센터의 .

Java 및 PHP에 대해 이 섹션의 코드 예제에서는 포트 587을 사용하여 이 문제를 방지합니다.

**참고**  
이러한 자습서에서는 수신 여부를 확인할 수 있도록 자신에게 이메일을 발송합니다. 추가적인 실험 또는 로드 테스트는 Amazon SES 메일박스 시뮬레이터를 사용하십시오. 메일박스 시뮬레이터로 전송되는 이메일은 전송 할당량이나 반송 메일 및 수신 거부 발생률에 포함되지 않습니다. 자세한 내용은 [수동으로 메일박스 시뮬레이터 사용](send-an-email-from-console.md#send-email-simulator) 단원을 참조하십시오.

**프로그래밍 언어를 선택하여 해당 언어에 대한 예제를 봅니다.**

**주의**  
Amazon SES는 정적 자격 증명 사용을 권장하지 않습니다. 소스 코드에서 하드 코딩된 자격 증명을 제거하여 보안 태세를 개선하는 방법을 알아보려면 [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 섹션을 참조하세요. 이 자습서는 프로덕션이 아닌 환경에서 Amazon SES SMTP 인터페이스를 테스트하기 위한 목적으로만 제공됩니다.

------
#### [ Java ]

이 예제에서는 SMTP 인터페이스를 사용하여 Amazon SES 를 통해 이메일을 보내기 위해 [Eclipse IDE](http://www.eclipse.org/) 및 [JavaMail API](https://github.com/javaee/javamail/releases)를 사용합니다.

다음 절차를 수행하기 전에 [Amazon Simple Email Service 설정](setting-up.md)의 작업을 완료합니다.

**Java를 사용하여 Amazon SES SMTP 인터페이스를 통해 이메일을 전송하려면**

1. 웹 브라우저에서 [JavaMail GitHub 페이지](https://github.com/javaee/javamail/releases)로 이동합니다. **자산**에서 **javax.mail.jar**를 선택하여 최신 버전의 JavaMail을 다운로드합니다.
**중요**  
이 자습서에서는 JavaMail 버전 1.5 이상이 필요합니다. 이 절차는 JavaMail 버전 1.6.1을 사용하여 테스트되었습니다.

1. 웹 브라우저에서 [Jakarta Activation GitHub 페이지](https://github.com/eclipse-ee4j/jaf/releases)로 이동하고 [JavaBeans Activation Framework 1.2.1 Final Release](https://github.com/eclipse-ee4j/jaf/releases/tag/1.2.1)에서 **jakarta.activation.jar**를 다운로드합니다.

1. 다음 단계를 수행하여 Eclipse에서 프로젝트를 만듭니다.

   1. Eclipse를 시작합니다.

   1. Eclipse에서, [**File**], [**New**], [**Java Project**]를 차례로 선택합니다.

   1. [**Create a Java Project**] 대화 상자에서, 프로젝트 이름을 입력하고 [**Next**]를 선택합니다.

   1. [**Java Settings**] 대화 상자에서, [**Libraries**] 탭을 선택합니다.

   1. **Classpath**를 선택하고 **외부 JAR 추가** 버튼을 사용하여 두 개의 외부 jar 파일 **javax.mail.jar** 및 **jakarta.activation.jar**를 추가합니다.

   1. [**Add External JARs**]를 선택합니다.

   1. JavaMail을 다운로드한 폴더로 이동합니다. `javax.mail.jar` 파일과 [**Open**]을 차례대로 선택합니다.

   1. [**Java Settings**] 대화 상자에서, [**Finish**]를 선택합니다.

1. Eclipse에서, [**Package Explorer**] 창에서 프로젝트를 확장합니다.

1. 프로젝트에서 [**src**] 디렉터리를 마우스 오른쪽 버튼으로 클릭한 후 [**New**], [**Class**]를 차례로 선택합니다.

1. [**New Java Class**] 대화 상자에서, [**Name**] 필드에 `AmazonSESSample`을 입력한 후 [**Finish**]를 선택합니다.

1. **AmazonSESSample.java**의 전체 내용을 다음 코드로 바꿉니다.

   ```
     1. import java.util.Properties;
     2. 
     3. import javax.mail.Message;
     4. import javax.mail.Session;
     5. import javax.mail.Transport;
     6. import javax.mail.internet.InternetAddress;
     7. import javax.mail.internet.MimeMessage;
     8. 
     9. public class AmazonSESSample {
    10. 
    11.     // Replace sender@example.com with your "From" address.
    12.     // This address must be verified.
    13.     static final String FROM = "sender@example.com";
    14.     static final String FROMNAME = "Sender Name";
    15.     
    16.     // Replace recipient@example.com with a "To" address. If your account 
    17.     // is still in the sandbox, this address must be verified.
    18.     static final String TO = "recipient@example.com";
    19.     
    20.     // Replace smtp_username with your Amazon SES SMTP user name.
    21.     static final String SMTP_USERNAME = "smtp_username";
    22.       
    23.     // The name of the Configuration Set to use for this message.
    24.     // If you comment out or remove this variable, you will also need to
    25.     // comment out or remove the header below.
    26.     static final String CONFIGSET = "ConfigSet";
    27.     
    28.     // Amazon SES SMTP host name. This example uses the US West (Oregon) region.
    29.     // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html#region-endpoints
    30.     // for more information.
    31.     static final String HOST = "email-smtp.us-west-2.amazonaws.com";
    32.     
    33.     // The port you will connect to on the Amazon SES SMTP endpoint. 
    34.     static final int PORT = 587;
    35.     
    36.     static final String SUBJECT = "Amazon SES test (SMTP interface accessed using Java)";
    37.     
    38.     static final String BODY = String.join(
    39.             System.getProperty("line.separator"),
    40.             "<h1>Amazon SES SMTP Email Test</h1>",
    41.             "<p>This email was sent with Amazon SES using the ", 
    42.             "<a href='https://github.com/javaee/javamail'>Javamail Package</a>",
    43.             " for <a href='https://www.java.com'>Java</a>."
    44.         );
    45. 
    46.     public static void main(String[] args) throws Exception {
    47. 
    48.         // Create a Properties object to contain connection configuration information.
    49.         Properties props = System.getProperties();
    50.         props.put("mail.transport.protocol", "smtp");
    51.         props.put("mail.smtp.port", PORT); 
    52.         props.put("mail.smtp.starttls.enable", "true");
    53.         props.put("mail.smtp.auth", "true");
    54. 
    55.         // Create a Session object to represent a mail session with the specified properties. 
    56.         Session session = Session.getDefaultInstance(props);
    57. 
    58.         // Create a message with the specified information. 
    59.         MimeMessage msg = new MimeMessage(session);
    60.         msg.setFrom(new InternetAddress(FROM,FROMNAME));
    61.         msg.setRecipient(Message.RecipientType.TO, new InternetAddress(TO));
    62.         msg.setSubject(SUBJECT);
    63.         msg.setContent(BODY,"text/html");
    64.         
    65.         // Add a configuration set header. Comment or delete the 
    66.         // next line if you are not using a configuration set
    67.         msg.setHeader("X-SES-CONFIGURATION-SET", CONFIGSET);
    68.             
    69.         // Create a transport.
    70.         Transport transport = session.getTransport();
    71. 
    72.         // Get the password 
    73.         String SMTP_PASSWORD = fetchSMTPPasswordFromSecureStorage();
    74.                     
    75.         // Send the message.
    76.         try
    77.         {
    78.             System.out.println("Sending...");
    79.             
    80.             // Connect to Amazon SES using the SMTP username and password you specified above.
    81.             transport.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD);
    82.             
    83.             // Send the email.
    84.             transport.sendMessage(msg, msg.getAllRecipients());
    85.             System.out.println("Email sent!");
    86.         }
    87.         catch (Exception ex) {
    88.             System.out.println("The email was not sent.");
    89.             System.out.println("Error message: " + ex.getMessage());
    90.         }
    91.         finally
    92.         {
    93.             // Close and terminate the connection.
    94.             transport.close();
    95.         }
    96.     }
    97. 
    98.     static String fetchSMTPPasswordFromSecureStorage() {
    99.         /* IMPLEMENT THIS METHOD */
   100.         // For example, you might fetch it from a secure location or AWS Secrets Manager: https://aws.amazon.com/secrets-manager/
   101.     }
   102. }
   ```

1. **AmazonSESSample.java**에서 다음 이메일 주소를 자체 값으로 대체합니다.
**중요**  
이메일 주소는 대/소문자를 구분합니다. 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + *sender@example.com* - 'From' 이메일 주소로 대체합니다. 이 프로그램을 실행하기 전에 이 주소를 확인해야 합니다. 자세한 내용은 [Amazon SES에서 확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하십시오.
   + *recipient@example.com* - 'To' 이메일 주소로 대체합니다. 계정이 아직 샌드박스에 있는 경우, 이 주소를 확인해야 계정을 사용할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하십시오.

1. **AmazonSESSample.java**에서 다음을 자체 값으로 대체합니다.
   + *smtp\$1username* – SMTP 사용자 이름 자격 증명으로 대체합니다. SMTP 사용자 이름 자격 증명은 식별 가능한 이름이 아니라 문자/숫자를 포함하는 20자 길이 문자열입니다.
   + *smtp\$1password* – ``fetchSMTPPasswordFromSecureStorage``를 구현하여 암호를 가져옵니다.

1. (선택 사항) *email-smtp.us-west-2.amazonaws.com* 이외의 AWS 리전 에서 Amazon SES SMTP 엔드포인트를 사용하려면 `HOST` 변수 값을 사용하려는 엔드포인트로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

1. (선택 사항) 이 이메일을 전송할 때 구성 세트를 사용하려면 *ConfigSet* 변수 값을 구성 세트의 이름으로 바꿉니다. 구성 세트에 대한 자세한 내용은 [Amazon SES에서 구성 세트 사용](using-configuration-sets.md) 단원을 참조하세요.

1. **AmazonSESSample.java**를 저장합니다.

1. 프로젝트를 빌드하려면 [**Project**]를 선택한 후 [**Build Project**]를 선택합니다. (이 옵션이 비활성화되어 있는 경우 자동 빌딩이 활성화된 것일 수 있습니다.)

1. 프로그램을 시작하고 이메일을 전송하려면 [**Run**]을 선택하고 다시 [**Run**]을 선택합니다.

1. 출력 결과를 검토합니다. 이메일이 성공적으로 전송되었으면 콘솔에 *'이메일이 발송되었습니다\$1'*가 표시됩니다. 완료되지 않은 경우 오류 메시지가 표시됩니다.

1. 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------
#### [ PHP  ]

이 예제에서는 SMTP 인터페이스를 사용하여 Amazon SES를 통해 이메일을 전송하기 위해 PHPMailer 클래스를 사용합니다.

다음 절차를 수행하기 전에 [Amazon Simple Email Service 설정](setting-up.md)의 작업을 완료해야 합니다. Amazon SES 를 설정하는 것 외에도 PHP로 이메일을 보내려면 다음과 같은 사전 요구 사항을 완료해야 합니다.

**사전 조건:**
+ **PHP 설치** – PHP는 [http://php.net/downloads.php](https://php.net/downloads.php)에서 다운로드할 수 있습니다. PHP를 설치한 후, 원하는 모든 명령 프롬프트에서 PHP를 실행할 수 있도록 PHP에 대한 경로를 환경 변수에 추가합니다.
+ **Composer 종속성 관리자 설치** – Composer 종속성 관리자를 설치한 후 PHPMailer 클래스와 클래스의 종속성을 다운로드하여 설치할 수 있습니다. Composer를 설치하려면 [https://getcomposer.org/download](https://getcomposer.org/download)의 설치 지침을 따르세요.
+ **PHPMailer 클래스 설치** – Composer를 설치한 후 다음 명령을 실행하여 다음과 같이 PHPMailer를 설치합니다.

  ```
  path/to/composer require phpmailer/phpmailer
  ```

  위의 명령에서 *path/to/*를 Composer를 설치한 경로로 바꿉니다.

**PHP를 사용하여 Amazon SES SMTP 인터페이스를 통해 이메일을 전송하려면**

1. **amazon-ses-smtp-sample.php**라는 파일을 만듭니다. 텍스트 편집기로 파일을 열고 다음 코드를 붙여 넣습니다.

   ```
    1. <?php
    2. 
    3. // Import PHPMailer classes into the global namespace
    4. // These must be at the top of your script, not inside a function
    5. use PHPMailer\PHPMailer\PHPMailer;
    6. use PHPMailer\PHPMailer\Exception;
    7. 
    8. // If necessary, modify the path in the require statement below to refer to the
    9. // location of your Composer autoload.php file.
   10. require 'vendor/autoload.php';
   11. 
   12. // Replace sender@example.com with your "From" address.
   13. // This address must be verified with Amazon SES.
   14. $sender = 'sender@example.com';
   15. $senderName = 'Sender Name';
   16. 
   17. // Replace recipient@example.com with a "To" address. If your account
   18. // is still in the sandbox, this address must be verified.
   19. $recipient = 'recipient@example.com';
   20. 
   21. // Replace smtp_username with your Amazon SES SMTP user name.
   22. $usernameSmtp = 'smtp_username';
   23. 
   24. // Specify a configuration set. If you do not want to use a configuration
   25. // set, comment or remove the next line.
   26. $configurationSet = 'ConfigSet';
   27. 
   28. // If you're using Amazon SES in a region other than US West (Oregon),
   29. // replace email-smtp.us-west-2.amazonaws.com with the Amazon SES SMTP
   30. // endpoint in the appropriate region.
   31. $host = 'email-smtp.us-west-2.amazonaws.com';
   32. $port = 587;
   33. 
   34. // The subject line of the email
   35. $subject = 'Amazon SES test (SMTP interface accessed using PHP)';
   36. 
   37. // The plain-text body of the email
   38. $bodyText =  "Email Test\r\nThis email was sent through the
   39.     Amazon SES SMTP interface using the PHPMailer class.";
   40. 
   41. // The HTML-formatted body of the email
   42. $bodyHtml = '<h1>Email Test</h1>
   43.     <p>This email was sent through the
   44.     <a href="https://aws.amazon.com/ses">Amazon SES</a> SMTP
   45.     interface using the <a href="https://github.com/PHPMailer/PHPMailer">
   46.     PHPMailer</a> class.</p>';
   47. 
   48. $mail = new PHPMailer(true);
   49. 
   50. try {
   51.     // Specify the SMTP settings.
   52.     $mail->isSMTP();
   53.     $mail->setFrom($sender, $senderName);
   54.     $mail->Username   = $usernameSmtp;
   55.     $mail->Password   = fetchSMTPPasswordFromSecureStorage();
   56.     $mail->Host       = $host;
   57.     $mail->Port       = $port;
   58.     $mail->SMTPAuth   = true;
   59.     $mail->SMTPSecure = 'tls';
   60.     $mail->addCustomHeader('X-SES-CONFIGURATION-SET', $configurationSet);
   61. 
   62.     // Specify the message recipients.
   63.     $mail->addAddress($recipient);
   64.     // You can also add CC, BCC, and additional To recipients here.
   65. 
   66.     // Specify the content of the message.
   67.     $mail->isHTML(true);
   68.     $mail->Subject    = $subject;
   69.     $mail->Body       = $bodyHtml;
   70.     $mail->AltBody    = $bodyText;
   71.     $mail->Send();
   72.     echo "Email sent!" , PHP_EOL;
   73. } catch (phpmailerException $e) {
   74.     echo "An error occurred. {$e->errorMessage()}", PHP_EOL; //Catch errors from PHPMailer.
   75. } catch (Exception $e) {
   76.     echo "Email not sent. {$mail->ErrorInfo}", PHP_EOL; //Catch errors from Amazon SES.
   77. }
   78. function fetchSMTPPasswordFromSecureStorage() {
   79. /* IMPLEMENT THIS METHOD */
   80. // For example, you might fetch it from a secure location or AWS Secrets Manager: https://aws.amazon.com/secrets-manager/
   81. }
   82. 
   83. ?>
   ```

1. **amazon-ses-smtp-sample.php**에서 다음을 자체 값으로 대체합니다.
   + *sender@example.com* – Amazon SES에서 확인한 이메일 주소로 바꿉니다. 자세한 내용은 [확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하십시오. Amazon SES에서 이메일 주소는 대/소문자를 구분합니다. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + *recipient@example.com* – 수신자의 주소로 바꿉니다. 계정이 아직 샌드박스에 있는 경우, 이 주소를 확인해야 계정을 사용할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + *smtp\$1username* – SMTP 사용자 이름 자격 증명으로 대체합니다. 이 자격 증명은 Amazon SES 콘솔의 [SMTP 설정](https://console.aws.amazon.com/ses/home?#smtp-settings:) 페이지에서 확인할 수 있습니다. 이 이름은 AWS 액세스 키 ID와 동일하지 **않습니다**. SMTP 사용자 이름 자격 증명은 식별 가능한 이름이 아니라 문자/숫자를 포함하는 20자 길이 문자열입니다.
   + *smtp\$1password* – ``fetchSMTPPasswordFromSecureStorage``를 구현하여 암호를 가져옵니다.
   + (선택 사항) *ConfigSet* – 이 이메일을 전송할 때 구성 세트를 사용하려면 이 값을 구성 세트의 이름으로 바꿉니다. 구성 세트에 대한 자세한 내용은 [Amazon SES에서 구성 세트 사용](using-configuration-sets.md) 단원을 참조하세요.
   + (선택 사항) *email-smtp.us-west-2.amazonaws.com* – 미국 서부(오리건) 이외의 리전에서 Amazon SES SMTP 엔드포인트를 사용하려면 사용하려는 리전의 Amazon SES SMTP 엔드포인트로 대체합니다. Amazon SES를 사용할 수 AWS 리전 있는의 SMTP 엔드포인트 URLs 목록은의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요*AWS 일반 참조*.

1. **amazon-ses-smtp-sample.php**를 저장합니다.

1. 프로그램을 실행하려면 **amazon-ses-smtp-sample.php**와 동일한 디렉터리에서 명령 프롬프트를 열고 **php amazon-ses-smtp-sample.php**를 입력합니다.

1. 출력 결과를 검토합니다. 이메일이 성공적으로 전송되었으면 콘솔에 *'이메일이 발송되었습니다\$1'*가 표시됩니다. 완료되지 않은 경우 오류 메시지가 표시됩니다.

1. 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------

# 기존 이메일 서버와 Amazon SES 통합
<a name="send-email-smtp-existing-server"></a>

현재 자신의 이메일 서버를 관리하고 있는 경우 Amazon SES SMTP 엔드포인트를 사용하여 모든 발신 이메일을 Amazon SES로 보낼 수 있습니다. 기존 이메일 클라이언트와 애플리케이션을 수정할 필요는 없으며 모든 프로그램에 투명하게 Amazon SES로 전환됩니다.

여러 메일 전송 에이전트(MTA)가 SMTP 릴레이를 통한 이메일 전송을 지원합니다. 이 섹션에서는 Amazon SES SMTP 인터페이스를 사용하여 이메일을 보내도록 몇 가지 인기 있는 MTA를 구성하는 방법에 대해 일반적인 지침을 제공합니다.

Amazon SES SMTP 엔드포인트에서는 TLS(전송 계층 보안)를 사용하여 모든 연결을 암호화해야 합니다.

**Topics**
+ [Amazon SES와 Postfix 통합](postfix.md)
+ [Amazon SES와 Sendmail 통합](send-email-sendmail.md)
+ [Microsoft Windows Server IIS SMTP와 Amazon SES 통합](send-email-windows-server.md)

# Amazon SES와 Postfix 통합
<a name="postfix"></a>

Postfix는 광범위하게 사용되는 Sendmail Message Transfer Agent(MTA)의 대체 프로그램입니다. Postfix에 대한 자세한 내용은 [http://www.postfix.org](http://www.postfix.org)를 참조하세요. 이 주제의 절차는 Linux, macOS 또는 Unix에 적용됩니다.

**참고**  
Postfix는 타사 애플리케이션이며 Amazon Web Services에서 개발하거나 지원하지 않습니다. 이 섹션의 절차는 정보 제공이 목적이며 사전 통지 없이 변경될 수 있습니다.

## 사전 조건
<a name="send-email-postfix-prereqs"></a>

이 섹션의 절차를 완료하려면 다음 작업을 수행해야 합니다.
+ 시스템에 설치되어 있는 경우 Sendmail 애플리케이션을 제거합니다. 이 단계를 완료하는 절차는 사용하는 운영 체제에 따라 다릅니다.
**중요**  
*sendmail*에 대한 다음 참조는 Sendmail 애플리케이션과 혼동하지 않도록 Postfix 명령 `sendmail`을 참조합니다.
+ Postfix를 설치합니다. 이 단계를 완료하는 절차는 사용하는 운영 체제에 따라 다릅니다.
+ SASL 인증 패키지를 설치합니다. 이 단계를 완료하는 절차는 사용하는 운영 체제에 따라 다릅니다. 예를 들어 RedHat 기반 시스템을 사용할 경우 `cyrus-sasl-plain` 패키지를 설치해야 합니다. Debian 또는 Ubuntu 기반 시스템을 사용할 경우에는 `libsasl2-modules` 패키지를 설치해야 합니다.
+ 이메일 전송에 사용할 이메일 주소 또는 도메인을 확인합니다. 자세한 내용은 [이메일 주소 자격 증명 생성](creating-identities.md#verify-email-addresses-procedure) 단원을 참조하십시오.
+ 계정이 아직 샌드박스에 있으면 확인된 이메일 주소에만 이메일을 전송할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요.

## Postfix 구성
<a name="send-email-postfix"></a>

Postfix를 사용하여 Amazon SES를 통해 이메일을 전송하도록 메일 서버를 구성하는 다음 절차를 완료하세요.

**Postfix를 구성하려면**

1. 명령줄 프롬프트에 다음 명령을 입력합니다.

   ```
   sudo postconf -e "relayhost = [email-smtp.us-west-2.amazonaws.com]:587" \
   "smtp_sasl_auth_enable = yes" \
   "smtp_sasl_security_options = noanonymous" \
   "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
   "smtp_use_tls = yes" \
   "smtp_tls_security_level = secure" \
   "smtp_tls_note_starttls_offer = yes"
   ```
**참고**  
미국 서부(오레곤) 이외의 AWS 리전에서 Amazon SES를 사용하는 경우 이전 명령의 *email-smtp.us-west-2.amazonaws.com* 해당 리전의 SMTP 엔드포인트로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

1. 텍스트 편집기에서 `/etc/postfix/master.cf` 파일을 엽니다. 다음 항목 검색:

   ```
   -o smtp_fallback_relay=
   ```

   이 항목이 있는 경우 열의 시작 부분에 `#`(해시) 문자를 붙여 주석을 남깁니다. 파일을 저장하고 닫습니다.

   그렇지 않은 경우 이 항목이 없으면 다음 단계로 계속 진행하세요.

1. 텍스트 편집기에서 `/etc/postfix/sasl_passwd` 파일을 엽니다. 파일이 없으면 새로 만듭니다.

1. 다음 열을 `/etc/postfix/sasl_passwd`에 추가합니다.

   ```
   [email-smtp.us-west-2.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD
   ```
**참고**  
*SMTPUSERNAME* 및 *SMTPPASSWORD*를 해당 SMTP 로그인 보안 인증 정보로 바꿉니다. SMTP 로그인 보안 인증 정보는 AWS 액세스 키 ID 및 비밀 액세스 키와 동일하지 않습니다. 자격 증명에 대한 자세한 내용은 [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md) 단원을 참조하세요.  
미국 서부(오레곤) 이외의 AWS 리전에서 Amazon SES를 사용하는 경우 이전 예제의 *email-smtp.us-west-2.amazonaws.com* 해당 리전의 SMTP 엔드포인트로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

   `sasl_passwd`를 저장하고 닫습니다.

1. 명령 프롬프트에서 다음 명령을 입력하여 SMTP 자격 증명이 포함된 해시 맵 데이터베이스 파일을 만듭니다.

   ```
   sudo postmap hash:/etc/postfix/sasl_passwd
   ```

1. (선택 사항) 이전 단계에서 만든 `/etc/postfix/sasl_passwd` 및 `/etc/postfix/sasl_passwd.db` 파일은 암호화되지 않습니다. 이 파일에는 SMTP 자격 증명이 포함되기 때문에 액세스를 제한하기 위해 파일의 소유권 및 권한을 수정하는 것이 좋습니다. 이 파일에 대한 액세스를 제한하려면:

   1. 명령 프롬프트에서 다음 명령을 입력하여 파일의 소유권을 변경합니다.

      ```
      sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
      ```

   1. 명령 프롬프트에서 다음 명령을 사용하여 루트 사용자만 읽거나 쓸 수 있도록 파일 권한을 변경합니다.

      ```
      sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
      ```

1. CA 인증서를 찾을 위치를 Postfix에 지정합니다(Amazon SES 서버 인증서 확인 필요). 이 단계에서 사용하는 명령은 운영 체제에 따라 다릅니다.
   + Amazon Linux, Red Hat Enterprise Linux 또는 관련 배포를 사용하는 경우 다음 명령을 입력합니다.

     ```
     sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
     ```
   + Ubuntu 또는 관련 배포를 사용하는 경우 다음 명령을 입력합니다.

     ```
     sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
     ```
   + macOS를 사용하는 경우 시스템 키 체인에서 인증서를 생성할 수 있습니다. 인증서를 생성하려면 명령줄에 다음 명령을 입력합니다.

     ```
     sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain | sudo tee /etc/ssl/certs/ca-bundle.crt > /dev/null
     ```

     인증서를 생성한 후에 다음 명령을 입력합니다.

     ```
     sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
     ```

1. Postfix 서버를 시작하려면(또는 서버가 이미 실행 중인 경우 구성 설정을 다시 로드하려면) 다음 명령을 입력합니다.

   ```
   sudo postfix start; sudo postfix reload
   ```

1. 명령줄에 다음을 입력하고 각 줄 이후에 Enter를 눌러 테스트 이메일을 보냅니다. *sender@example.com*을 From 이메일 주소로 바꿉니다. From 주소는 Amazon SES에 사용할 수 있는지 확인해야 합니다. *recipient@example.com*을 대상 주소로 바꿉니다. 계정이 아직 샌드박스 환경에 있을 경우 수신자 주소도 확인해야 합니다. 마지막으로 메시지의 마지막 열에는 다른 콘텐츠가 없는 상태로 하나의 마침표(.)가 포함되어 있어야 합니다.

   ```
   sendmail -f sender@example.com recipient@example.com
   From: Sender Name <sender@example.com>
   Subject: Amazon SES Test                
   This message was sent using Amazon SES.                
   .
   ```

1. 수신자 주소와 연결된 메일박스를 확인합니다. 이메일이 도착하지 않으면 정크 메일 폴더를 확인합니다. 그래도 이메일을 찾을 수 없으면 자세한 내용은 이메일을 전송하기 위해 사용한 시스템의 메일 로그(일반적으로 `/var/log/maillog`에 있음)를 확인합니다.

## 고급 사용 예
<a name="send-email-postfix-advanced"></a>

이 예는 [구성 세트](using-configuration-sets.md)를 사용하는 이메일 및 일반 텍스트와 HTML 버전의 메시지를 첨부 파일과 함께 모두 보내기 위해 MIME 멀티파트 인코딩을 사용하는 이메일의 전송 방법을 보여 줍니다. 또한 클릭 이벤트를 분류하는 데 사용할 수 있는 [링크 태그](faqs-metrics.md#sending-metric-faqs-clicks-q5)도 포함되어 있습니다. 이메일의 콘텐츠는 외부 파일에 지정되므로, Postfix 세션에서 수동으로 명령을 입력할 필요가 없습니다.

**Postfix를 사용하여 멀티파트 MIME 이메일을 전송하려면**

1. 텍스트 편집기에서 `mime-email.txt`라는 새로운 파일을 만듭니다.

1. 텍스트 파일에서 빨간색으로 표시된 값을 계정의 해당 값으로 바꾸고 다음 콘텐츠를 붙여 넣습니다.

   ```
   X-SES-CONFIGURATION-SET: ConfigSet
   From:Sender Name <sender@example.com>
   Subject:Amazon SES Test
   MIME-Version: 1.0
   Content-Type: multipart/mixed; boundary="YWVhZDFlY2QzMGQ2N2U0YTZmODU"
   
   --YWVhZDFlY2QzMGQ2N2U0YTZmODU
   Content-Type: multipart/alternative; boundary="3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ"
   
   --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ
   Content-Type: text/plain; charset=UTF-8
   Content-Transfer-Encoding: quoted-printable
   
   Amazon SES Test
   
   This message was sent from Amazon SES using the SMTP interface.
   
   For more information, see:
   http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html
   
   --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ
   Content-Type: text/html; charset=UTF-8
   Content-Transfer-Encoding: quoted-printable
   
   <html>
     <head>
   </head>
     <body>
       <h1>Amazon SES Test</h1>
         <p>This message was sent from Amazon SES using the SMTP interface.</p>
         <p>For more information, see
         <a ses:tags="samplekey0:samplevalue0;samplekey1:samplevalue1;" 
         href="http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html">
         Using the Amazon SES SMTP Interface to Send Email</a> in the <em>Amazon SES
         Developer Guide</em>.</p>
     </body>
   </html>
   --3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ--
   --YWVhZDFlY2QzMGQ2N2U0YTZmODU
   Content-Type: application/octet-stream
   MIME-Version: 1.0
   Content-Transfer-Encoding: base64
   Content-Disposition: attachment; filename="customers.txt"
   
   SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENh
   bmFkYQo5MjM4OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixV
   bml0ZWQgU3RhdGVzCjI4OTMsQW5heWEsSXllbmdhcixJbmRpYQ==
   --YWVhZDFlY2QzMGQ2N2U0YTZmODU--
   ```

   파일을 저장하고 닫습니다.

1. 명령줄 프롬프트에 다음 명령을 입력합니다. *sender@example.com*을 사용자의 이메일 주소로 바꾸고 *recipient@example.com*을 수신자의 이메일 주소로 바꿉니다.

   ```
   sendmail -f sender@example.com recipient@example.com < mime-email.txt
   ```

   명령이 성공적으로 실행되면 출력을 제공하지 않고 종료됩니다.

1. 이메일의 받은 편지함을 확인합니다. 메시지가 전송되지 않은 경우 시스템의 메일 로그를 확인합니다.

# Amazon SES와 Sendmail 통합
<a name="send-email-sendmail"></a>

Sendmail은 1980년대 초반에 릴리스되었으며 이후 지속적으로 개선되었습니다. 대규모 사용자 커뮤니티를 보유한 유연하고 구성 가능한 메시지 전송 에이전트(MTA)입니다. Sendmail은 2013년에 Proofpoint에서 인수했지만, Proofpoint는 Sendmail의 오픈 소스 버전을 계속 제공하고 있습니다. Proofpoint 웹사이트에서, 또는 대다수 Linx 배포판에 포함된 패키지 관리자를 통해 [Sendmail의 오픈 소스 버전](https://www.proofpoint.com/us/open-source-email-solution)을 다운로드하세요.

이 섹션의 절차는 Amazon SES를 통해 이메일을 전송하도록 Sendmail을 구성하는 방법을 보여줍니다. 이 절차는 Ubuntu 18.04.2 LTS를 실행하는 서버 상에서 테스트를 거쳤습니다.

**참고**  
Sendmail은 타사 애플리케이션이며 Amazon Web Services에서 개발하거나 지원하지 않습니다. 이 섹션의 절차는 정보 제공이 목적이며 사전 통지 없이 변경될 수 있습니다.

## 사전 조건
<a name="send-email-sendmail-prerequisites"></a>

이 섹션의 절차를 완료하려면 먼저 다음 작업을 수행해야 합니다.
+ 서버에 Sendmail 패키지를 설치합니다.
**참고**  
사용하는 운영 체제 배포판에 따라 `sendmail-cf`, `m4`, `cyrus-sasl-plain` 중 해당되는 패키지를 설치해야 할 수도 있습니다.
+ 발신 주소로 사용할 ID를 확인합니다. 자세한 내용은 [이메일 주소 자격 증명 생성](creating-identities.md#verify-email-addresses-procedure) 단원을 참조하십시오.

  계정이 Amazon SES 샌드박스에 있는 경우 이메일을 전송하려는 주소들도 확인해야 합니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하십시오.

Amazon SES를 사용하여 Amazon EC2 인스턴스로부터 이메일을 전송 중인 경우에는 다음 단계도 완료해야 합니다.
+ 이메일을 수신하는 공급자가 이메일을 수락하도록 하려면 Amazon EC2 인스턴스에 탄력적 IP 주소를 할당해야 합니다. 자세한 내용은 *Amazon EC2 사용 설명서*에서 [Amazon EC2 탄력적 IP 주소](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)를 참조하세요.
+ Amazon Elastic Compute Cloud(Amazon EC2)는 기본적으로 포트 25를 통한 이메일 트래픽을 제한합니다. Amazon EC2의 SMTP 엔드포인트를 통해 이메일을 전송할 때 시간 초과를 방지하려면 이러한 제한을 제거하도록 요청할 수 있습니다. 자세한 내용은 [ Amazon EC2 인스턴스 또는 AWS Lambda 함수에서 포트 25에 대한 제한을 제거하려면 어떻게 해야 합니까?를 참조하세요.](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/) AWS 지식 센터의 .

  또는 이 섹션의 절차를 수정하여 포트 25가 아닌 포트 587을 사용할 수 있습니다.

## Sendmail 구성
<a name="send-email-sendmail-procedure"></a>

Amazon SES를 사용해 이메일을 전송하도록 Sendmail을 구성하려면 이 섹션에 나온 단계를 완료하세요.

**중요**  
이 섹션의 절차에서는 미국 서부(오레곤)에서 Amazon SES를 사용한다고 가정합니다 AWS 리전. 다른 리전을 사용하려는 경우 이 절차에 있는 *email-smtp.us-west-2.amazonaws.com*의 모든 인스턴스를 원하는 리전의 SMTP 엔드포인트로 바꾸세요. Amazon SES를 사용할 수 있는 AWS 리전 의 SMTP 엔드포인트 URL 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

**Sendmail을 설정하려면**

1. 텍스트 편집기에서 `/etc/mail/authinfo` 파일을 엽니다. 파일이 없으면 새로 만듭니다.

   다음 줄을 */etc/mail/authinfo*에 추가합니다.

   ```
   AuthInfo:email-smtp.us-west-2.amazonaws.com "U:root" "I:smtpUsername" "P:smtpPassword" "M:PLAIN"
   ```

   이전 예제에서 다음과 같이 변경합니다.
   + *email-smtp.us-west-2.amazonaws.com*을 사용하려는 Amazon SES SMTP 엔드포인트로 바꿉니다.
   + *smtpUsername*을 Amazon SES SMTP 사용자 이름으로 바꿉니다.
   + *smtpPassword*를 Amazon SES SMTP 암호로 바꿉니다.
**참고**  
SMTP 로그인 자격 증명은 AWS 액세스 키 ID 및 보안 액세스 키와 다릅니다. SMTP 로그인 보안 인증 정보를 받는 방법에 대한 자세한 내용은 [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md) 섹션을 참조하세요.

   완료되면 `authinfo`를 저장합니다.

1. 명령줄에 다음 명령을 입력하여 `/etc/mail/authinfo.db` 파일을 만듭니다.

   ```
   sudo sh -c 'makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo'
   ```

1. 명령줄에 다음 명령을 입력하여 Amazon SES SMTP 엔드포인트에 릴레이에 대한 지원을 추가합니다.

   ```
   sudo sh -c 'echo "Connect:email-smtp.us-west-2.amazonaws.com RELAY" >> /etc/mail/access'
   ```

   위의 명령에서 *email-smtp.us-west-2.amazonaws.com*을 사용하려는 Amazon SES SMTP 엔드포인트의 주소로 바꿉니다.

1. 명령 줄에 다음 명령을 입력하여 */etc/mail/access.db*를 다시 생성합니다.

   ```
   sudo sh -c 'makemap hash /etc/mail/access.db < /etc/mail/access'
   ```

1. 명령줄에 다음 명령을 입력하여 다음과 같이 `sendmail.cf` 및 `sendmail.mc` 파일의 백업을 생성합니다.

   ```
   sudo sh -c 'cp /etc/mail/sendmail.cf /etc/mail/sendmail_cf.backup && cp /etc/mail/sendmail.mc /etc/mail/sendmail_mc.backup'
   ```

1. 다음 줄을 */etc/mail/sendmail.mc* 파일의 `MAILER()` 정의 앞에 추가합니다.

   ```
   define(`SMART_HOST', `email-smtp.us-west-2.amazonaws.com')dnl
   define(`RELAY_MAILER_ARGS', `TCP $h 25')dnl
   define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
   FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl
   MASQUERADE_AS(`example.com')dnl
   FEATURE(masquerade_envelope)dnl
   FEATURE(masquerade_entire_domain)dnl
   ```

   위의 텍스트에서 다음을 수행합니다.
   + *email-smtp.us-west-2.amazonaws.com*을 사용하려는 Amazon SES SMTP 엔드포인트로 바꿉니다.
   + *example.com*을 이메일 전송에 사용할 도메인으로 바꿉니다.

   작업을 마치고 파일을 저장합니다.
**참고**  
Amazon EC2는 기본적으로 포트 25를 통한 통신을 제한합니다. Amazon EC2 인스턴스에서 Sendmail을 사용 중인 경우 [이메일 전송 제한 제거 요청](https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request)을 작성해야 합니다.

1. 명령줄에 다음 명령을 입력하여 *sendmail.cf*를 쓰기 가능한 상태로 만듭니다.

   ```
   sudo chmod 666 /etc/mail/sendmail.cf
   ```

1. 명령줄에 다음 명령을 입력하여 *sendmail.cf*를 다시 생성합니다.

   ```
   sudo sh -c 'm4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf'
   ```
**참고**  
‘명령을 찾을 수 없음’ 및 ‘해당 파일 또는 디렉터리가 없음’ 오류가 발생하면 `m4` 및 `sendmail-cf` 패키지가 시스템에 설치되어 있는지 확인합니다.

1. 명령줄에 다음 명령을 입력하여 *sendmail.cf* 권한을 읽기 전용으로 재설정합니다.

   ```
   sudo chmod 644 /etc/mail/sendmail.cf
   ```

1. 명령줄에 다음 명령을 입력하여 Sendmail을 다시 시작합니다.

   ```
   sudo /etc/init.d/sendmail restart
   ```

   *Linux 또는 Sendmail 버전에 따라 위의 내용이 작동하지 않으면 다음을 시도하세요.*

   ```
   sudo su service sendmail restart
   ```

1. 테스트 이메일을 전송하려면 다음 작업을 완료합니다.

   1. 명령줄에 다음 명령을 입력합니다.

      ```
      /usr/sbin/sendmail -vf sender@example.com recipient@example.com
      ```

      *sender@example.com*을 From 이메일 주소로 바꿉니다. *recipient@example.com*을 수신 주소로 바꿉니다. 완료되면 Enter를 누릅니다.

   1. 다음과 같은 메시지 콘텐츠를 입력합니다. 줄이 끝날 때마다 Enter를 누릅니다.

      ```
      From: sender@example.com
      To: recipient@example.com
      Subject: Amazon SES test email
      
      This is a test message sent from Amazon SES using Sendmail.
      ```

      이메일 콘텐츠의 입력이 완료되면 Ctrl\$1D를 눌러서 전송합니다.

1. 해당 이메일의 수신자 이메일 클라이언트를 확인합니다. 이메일을 찾을 수 없으면 스팸 메일 폴더를 확인합니다. 그래도 이메일을 찾을 수 없는 경우, 메일 서버의 Sendmail 로그를 살펴봅니다. 로그는 대개 */var/log/mail.log* 또는 */var/log/maillog*에 있습니다.

# Microsoft Windows Server IIS SMTP와 Amazon SES 통합
<a name="send-email-windows-server"></a>

Amazon SES를 통해 이메일을 보내도록 Microsoft Windows Server의 IIS SMTP 서버를 구성할 수 있습니다. 이 지침은 Amazon EC2 인스턴스에서 Microsoft Windows Server 2022를 사용하여 작성되었습니다. Microsoft Windows Server 2016에서 동일한 구성을 사용할 수 있습니다.

**참고**  
Windows Server는 타사 애플리케이션이며 Amazon Web Services에서 개발하거나 지원하지 않습니다. 이 섹션의 절차는 정보 제공이 목적이며 사전 통지 없이 변경될 수 있습니다.

**Microsoft Windows Server IIS SMTP 서버를 Amazon SES와 통합하려면**

1. 먼저 다음 지침에 따라 Microsoft Windows Server 2022를 설정합니다.

   1. [Amazon EC2 관리 콘솔](https://console.aws.amazon.com/ec2/home)에서 새 Microsoft Windows Server 2022 Base Amazon EC2 인스턴스를 시작합니다.

   1. 인스턴스에 연결하고 [Amazon EC2 Windows 인스턴스 시작하기](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2Win_GetStarted.html)의 지침에 따라 원격 데스크톱을 사용하여 인스턴스에 로그인합니다.

   1. 서버 관리자 대시보드를 시작합니다.

   1. [**웹 서버**] 역할을 설치합니다. **IIS 10 관리 호환성 도구**(**웹 서버** 확인란 아래의 옵션)를 포함해야 합니다.

   1. [**SMTP 서버**] 기능을 설치합니다.

1. 이제 다음 지침에 따라 IIS SMTP 서비스를 구성합니다.

   1. 서버 관리자 대시보드로 돌아갑니다.

   1. **도구** 메뉴에서 **인터넷 정보 서비스(IIS) 10.0 관리자**를 선택합니다.

   1. [**SMTP 가상 서버 \$11**]을 마우스 오른쪽 버튼으로 클릭하고 [**속성**]을 선택합니다.

   1. [**액세스**] 탭에서 [**릴레이 제한**] 아래 있는 [**릴레이**]를 선택합니다.

   1. [**릴레이 제한**] 대화 상자에서 [**추가**]를 선택합니다.

   1. [**단일 컴퓨터**] 아래에서 IP 주소에 **127.0.0.1**을 입력합니다. 이제 이 서버에 IIS SMTP 서비스를 통해 Amazon SES로 이메일을 릴레이하기 위한 액세스를 부여했습니다.

      이 절차에서는 이메일이 이 서버에서 생성된다고 가정합니다. 이메일을 생성하는 애플리케이션이 별도의 서버에서 실행되는 경우 IIS SMTP에서 해당 서버에 릴레이 액세스를 부여해야 합니다.
**참고**  
SMTP 릴레이를 프라이빗 서브넷으로 확장하려면 [**릴레이 제한**]에 대해 [**단일 컴퓨터**] 127.0.0.1 및 [**컴퓨터 그룹**] 172.1.1.0 - 255.255.255.0(넷마스크 섹션에서)을 사용합니다. [**연결**]에 대해 [**단일 컴퓨터**] 127.0.0.1 및 [**컴퓨터 그룹**] 172.1.1.0 - 255.255.255.0(넷마스크 섹션에서)을 사용합니다.

1. 마지막으로, 다음 지침에 따라 Amazon SES를 통해 이메일을 보내도록 서버를 구성합니다.

   1. [**SMTP 가상 서버 \$11 속성**] 대화 상자로 돌아간 다음 [**배달**] 탭을 선택합니다.

   1. [**배달**] 탭에서 [**아웃바운드 보안**]을 선택합니다.

   1. **Basic Authentication**(기본 인증)을 선택한 후 Amazon SES SMTP 보안 인증 정보를 입력합니다. [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md)의 절차에 따라 Amazon SES 콘솔에서 이 자격 증명을 받을 수 있습니다.
**중요**  
SMTP 자격 증명은 AWS 액세스 키 ID 및 보안 액세스 키와 동일하지 않습니다. 자격 AWS 증명을 사용하여 SMTP 엔드포인트에 대해 자신을 인증하려고 하지 마십시오. 자격 증명에 대한 자세한 내용은 [Amazon SES 자격 증명 유형](send-email-concepts-credentials.md) 단원을 참조하세요.

   1. [**TLS 암호화**]가 선택되어 있는지 확인합니다.

   1. [**배달**] 탭으로 돌아갑니다.

   1. [**아웃바운드 연결**]을 선택합니다.

   1. [**아웃바운드 연결**] 대화 상자에서 포트가 25 또는 587인지 확인합니다.

   1. **고급**을 선택합니다.

   1. **스마트 호스트** 이름에 사용할 Amazon SES 엔드포인트(예:*email-smtp.us-west-2.amazonaws.com*)를 입력합니다. Amazon SES를 사용할 수 AWS 리전 있는의 엔드포인트 URLs 목록은의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요*AWS 일반 참조*.

   1. 서버 관리자 대시보드로 돌아갑니다.

   1. 서버 관리자 대시보드에서 [**SMTP 가상 서버 \$11**]을 마우스 오른쪽 버튼으로 클릭한 다음 서버를 다시 시작하여 새 구성을 적용합니다.

   1. 이 서버를 통해 이메일을 보냅니다. 메시지 헤더를 조사하여 Amazon SES를 통해 배달되었는지 확인할 수 있습니다.

# 명령줄을 사용하여 Amazon SES SMTP 인터페이스에 대한 연결 테스트
<a name="send-email-smtp-client-command-line"></a>

이 섹션에서 설명하는 방법을 사용하여 명령줄에서 Amazon SES SMTP 엔드포인트에 대한 연결을 테스트하고, SMTP 자격 증명을 확인하고, 연결 문제를 해결할 수 있습니다. 이러한 절차에서는 가장 일반적인 운영 체제에 포함된 도구 및 라이브러리를 사용합니다.

SMTP 연결 문제 해결에 대한 자세한 내용은 [Amazon SES SMTP 문제](troubleshoot-smtp.md) 섹션을 참조하세요.

## 사전 조건
<a name="send-email-smtp-client-command-line-prereqs"></a>

Amazon SES SMTP 인터페이스에 연결할 때 일련의 SMTP 자격 증명을 제공해야 합니다. 이러한 SMTP 자격 증명은 표준 AWS 자격 증명과 다릅니다. 두 유형의 자격 증명을 서로 바꿔 사용할 수 없습니다. SMTP 자격 증명을 받는 방법에 대한 자세한 내용은 [Amazon SES SMTP 자격 증명 획득](smtp-credentials.md) 섹션을 참조하세요.

## Amazon SES SMTP 인터페이스와의 연결 테스트
<a name="send-email-smtp-client-command-line-testing"></a>

명령줄을 사용하여 메시지를 인증하거나 보내지 않고 Amazon SES SMTP 인터페이스와의 연결을 테스트할 수 있습니다. 기본적인 연결 문제를 해결하는 데 이 절차가 유용합니다. 테스트 연결에 실패하는 경우 [SMTP 문제](troubleshoot-smtp.md) 섹션을 참조하세요.

이 섹션에는 OpenSSL(대부분의 Linux, macOS 및 Unix 배포에 포함되고 Windows에서도 사용 가능함)과 PowerShell의 `Test-NetConnection` cmdlet(대부분의 최신 Windows 버전에 포함됨)을 둘 다 사용하여 연결을 테스트하는 절차가 나와 있습니다.

------
#### [ Linux, macOS, or Unix ]

Amazon SES SMTP 인터페이스를 OpenSSL과 연결하는 두 가지 방법이 있습니다. 포트 587을 통해 명시적 SSL을 사용하거나 포트 465를 통해 암시적 SSL을 사용하는 것입니다.

**명시적 SSL을 사용하여 SMTP 인터페이스에 연결하려면**
+ 명령줄에 다음 명령을 입력하여 Amazon SES SMTP 서버에 연결합니다.

  ```
  openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
  ```

  앞의 명령에서 *email-smtp.us-west-2.amazonaws.com* AWS 리전의 Amazon SES SMTP 엔드포인트 URL로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

  연결이 성공하면 다음과 비슷한 출력이 보입니다.

  ```
  depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
  verify return:1
  depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
  verify return:1
  depth=0 CN = email-smtp.us-west-2.amazonaws.com
  verify return:1
  250 Ok
  ```

  비활성 시간이 약 10초 이상 지속되면 연결이 자동으로 닫힙니다.

또는 암시적 SSL을 사용하여 포트 465를 통해 SMTP 인터페이스에 연결할 수 있습니다.

**암시적 SSL을 사용하여 SMTP 인터페이스에 연결하려면**
+ 명령줄에 다음 명령을 입력하여 Amazon SES SMTP 서버에 연결합니다.

  ```
  openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465
  ```

  앞의 명령에서 *email-smtp.us-west-2.amazonaws.com* AWS 리전의 Amazon SES SMTP 엔드포인트 URL로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

  연결이 성공하면 다음과 비슷한 출력이 보입니다.

  ```
  depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
  verify return:1
  depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
  verify return:1
  depth=0 CN = email-smtp.us-west-2.amazonaws.com
  verify return:1
  220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-VCSHDP1YZ A1b2C3d4E5f6G7h8I9j0
  ```

  비활성 시간이 약 10초 이상 지속되면 연결이 자동으로 닫힙니다.

------
#### [ PowerShell ]

PowerShell에서 [Test-NetConnection](https://docs.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection) cmdlet을 사용하여 Amazon SES SMTP 서버에 연결할 수 있습니다.

**참고**  
`Test-NetConnection` cmdlet를 통해 컴퓨터가 Amazon SES SMTP 엔드포인트에 연결할 수 있는지 여부를 확인할 수 있습니다. 하지만 컴퓨터가 SMTP 엔드포인트에 대한 암시적 또는 명시적 SSL 연결을 만들 수 있는지 여부는 테스트하지 않습니다. SSL 연결을 테스트하려면 Windows용 OpenSSL을 설치하거나 테스트 이메일을 보낼 수 있습니다.

**`Test-NetConnection` cmdlet를 사용하여 SMTP 인터페이스에 연결하려면**
+ PowerShell에 다음 명령을 입력하여 Amazon SES SMTP 서버에 연결합니다.

  ```
  Test-NetConnection -Port 587 -ComputerName email-smtp.us-west-2.amazonaws.com
  ```

  앞의 명령에서 *email-smtp.us-west-2.amazonaws.com* 리전의 Amazon SES SMTP 엔드포인트 URL로 바꾸고 AWS *587*을 포트 번호로 바꿉니다. Amazon SES의 리전 엔드포인트에 대한 자세한 내용은 [리전 및 Amazon SES](regions.md) 섹션을 참조하세요.

  연결이 성공하면 다음 예제와 유사한 출력이 표시됩니다.

  ```
  ComputerName     : email-smtp.us-west-2.amazonaws.com
  RemoteAddress    : 198.51.100.126
  RemotePort       : 587
  InterfaceAlias   : Ethernet
  SourceAddress    : 203.0.113.46
  TcpTestSucceeded : True
  ```

------

## 명령줄을 사용하여 Amazon SES SMTP 인터페이스를 통해 이메일 전송
<a name="send-email-using-openssl"></a>

명령줄을 사용하여 Amazon SES SMTP 인터페이스를 통해 메시지를 보낼 수도 있습니다. SMTP 자격 증명을 테스트할 때나, Amazon SES를 사용하여 보내는 메시지를 특정 수신자가 받을 수 있는지 테스트할 때 이 절차가 유용합니다.

------
#### [ Linux, macOS, or Unix ]

이메일 발신자가 SMTP 서버에 연결하면 클라이언트가 표준 요청 세트를 발행하고 서버가 각 요청에 표준 응답으로 회신합니다. 이러한 일련의 요청 및 응답을 *SMTP 대화*라고 합니다. OpenSSL을 사용하여 Amazon SES SMTP 서버에 연결하면 서버가 SMTP 대화가 발생할 것을 예상합니다.

OpenSSL을 사용하여 SMTP 인터페이스에 연결하려면 base64 인코딩을 사용하여 SMTP 자격 증명을 인코딩해야 합니다. 이 섹션에는 base64를 사용하여 자격 증명을 인코딩하는 절차가 나와 있습니다.

**SMTP 인터페이스를 통해 명령줄에서 이메일을 보내려면**

1. 다음을 명령줄에 입력하고 *email-smtp.us-west-2.amazonaws.com*을 AWS 리전의 Amazon SES SMTP 엔드포인트의 URL로 대체합니다. 자세한 내용은 단원을 참조하십시오[리전 및 Amazon SES](regions.md).

   ```
    1. #!/bin/bash
    2. 
    3. # Prompt user to provide following information
    4. read -p "Configuration set: " CONFIGSET
    5. read -p "Enter SMTP username: " SMTPUsername
    6. read -p "Enter SMTP password: " SMTPPassword
    7. read -p "Sender email address: " MAILFROM
    8. read -p "Receiver email address: " RCPT
    9. read -p "Email subject: " SUBJECT
   10. read -p "Message to send: " DATA
   11. 
   12. echo
   13. 
   14. # Encode SMTP username and password using base64
   15. EncodedSMTPUsername=$(echo -n "$SMTPUsername" | openssl enc -base64)
   16. EncodedSMTPPassword=$(echo -n "$SMTPPassword" | openssl enc -base64)
   17. 
   18. # Construct the email
   19. Email="EHLO example.com
   20. AUTH LOGIN
   21. $EncodedSMTPUsername
   22. $EncodedSMTPPassword
   23. MAIL FROM: $MAILFROM
   24. RCPT TO: $RCPT
   25. DATA
   26. X-SES-CONFIGURATION-SET: $CONFIGSET
   27. From: $MAILFROM
   28. To: $RCPT
   29. Subject: $SUBJECT
   30. 
   31. $DATA
   32. .
   33. QUIT"
   34. 
   35. echo "$Email" | openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
   ```

1. 각 변수에 대한 프롬프트에 값을 입력합니다.

1. 
   + 포트 465를 통해 암시적 SSL을 사용하여 전송하려면 다음을 사용합니다.

     ```
     openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465
     ```

   Amazon SES에서 메시지를 수락하면 다음 예제와 유사한 출력이 표시됩니다.

   ```
   250 Ok 01010160d7de98d8-21e57d9a-JZho-416c-bbe1-8ebaAexample-000000
   ```

   `250 Ok` 뒤에 나오는 숫자 및 텍스트 문자열이 이메일의 메시지 ID입니다.
**참고**  
비활성 시간이 약 10초 이상 지속되면 연결이 자동으로 닫힙니다.

------
#### [ PowerShell ]

[Net.Mail.SmtpClient](https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8) 클래스를 이용하면 포트 587을 통해 명시적 SSL을 사용하여 이메일을 보낼 수 있습니다.

**참고**  
이 `Net.Mail.SmtpClient` 클래스는 공식적으로 사용되지 않으므로 타사 라이브러리를 사용하는 것이 좋습니다. 이 코드는 테스트 목적으로만 사용되며 프로덕션 워크로드에 사용해서는 안 됩니다.

**명시적 SSL을 사용하여 PowerShell을 통해 이메일을 보내려면**

1. 텍스트 편집기에서 새로운 파일을 생성합니다. 다음 코드를 파일에 붙여넣습니다.

   ```
   function SendEmail($Server, $Port, $Sender, $Recipient, $Subject, $Body) {
       $Credentials = [Net.NetworkCredential](Get-Credential)
   
       $SMTPClient = New-Object Net.Mail.SmtpClient($Server, $Port)
       $SMTPClient.EnableSsl = $true
       $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Credentials.Username, $Credentials.Password);
   
       try {
           Write-Output "Sending message..."
           $SMTPClient.Send($Sender, $Recipient, $Subject, $Body)
           Write-Output "Message successfully sent to $($Recipient)"
       } catch [System.Exception] {
           Write-Output "An error occurred:"
           Write-Error $_
       }
   }
   
   function SendTestEmail(){
       $Server = "email-smtp.us-west-2.amazonaws.com"
       $Port = 587
   
       $Subject = "Test email sent from Amazon SES"
       $Body = "This message was sent from Amazon SES using PowerShell (explicit SSL, port 587)."
   
       $Sender = "sender@example.com"
       $Recipient = "recipient@example.com"
   
       SendEmail $Server $Port $Sender $Recipient $Subject $Body
   }
   
   SendTestEmail
   ```

   작업을 마치면 파일 이름을 `SendEmail.ps1`(으)로 저장합니다.

1. 이전 단계에서 생성한 파일을 다음과 같이 변경합니다.
   + *sender@example.com*을 메시지 발신자 이메일 주소로 바꿉니다.
   + *recipient@example.com*을 메시지 수신자 이메일 주소로 바꿉니다.
   + *email-smtp.us-west-2.amazonaws.com*을 AWS 리전의 Amazon SES SMTP 엔드포인트 URL로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

1. PowerShell에 다음 명령을 입력합니다.

   ```
   .\path\to\SendEmail.ps1
   ```

   위의 명령에서 *path\$1to\$1SendEmail.ps1*을 1단계에서 생성한 파일의 경로로 바꿉니다.

1. 메시지가 표시되면 SMTP 사용자 이름과 암호를 입력합니다.

또는 [System.Web.Mail.SmtpMail](https://docs.microsoft.com/en-us/dotnet/api/system.web.mail.smtpmail?view=netframework-4.8) 클래스를 이용하면 포트 465를 통해 암시적 SSL을 사용하여 이메일을 보낼 수 있습니다.

**참고**  
이 `System.Web.Mail.SmtpMail` 클래스는 공식적으로 사용되지 않으므로 타사 라이브러리를 사용하는 것이 좋습니다. 이 코드는 테스트 목적으로만 사용되며 프로덕션 워크로드에 사용해서는 안 됩니다.

**암시적 SSL을 사용하여 PowerShell을 통해 이메일을 보내려면**

1. 텍스트 편집기에서 새로운 파일을 생성합니다. 다음 코드를 파일에 붙여넣습니다.

   ```
   [System.Reflection.Assembly]::LoadWithPartialName("System.Web") > $null
   
   function SendEmail($Server, $Port, $Sender, $Recipient, $Subject, $Body) {
       $Credentials = [Net.NetworkCredential](Get-Credential)
   
       $mail = New-Object System.Web.Mail.MailMessage
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", $Server)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", $Port)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", $true)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", $Credentials.UserName)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", $Credentials.Password)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", $timeout / 1000)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", 2)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1)
   
       $mail.From = $Sender
       $mail.To = $Recipient
       $mail.Subject = $Subject
       $mail.Body = $Body
   
       try {
           Write-Output "Sending message..."
           [System.Web.Mail.SmtpMail]::Send($mail)
           Write-Output "Message successfully sent to $($Recipient)"
       } catch [System.Exception] {
           Write-Output "An error occurred:"
           Write-Error $_
       }
   }
   
   function SendTestEmail(){
       $Server = "email-smtp.us-west-2.amazonaws.com"
       $Port = 465
       
       $Subject = "Test email sent from Amazon SES"
       $Body = "This message was sent from Amazon SES using PowerShell (implicit SSL, port 465)."
   
       $Sender = "sender@example.com"
       $Recipient = "recipient@example.com"
   
       SendEmail $Server $Port $Sender $Recipient $Subject $Body
   }
   
   SendTestEmail
   ```

   작업을 마치면 파일 이름을 `SendEmail.ps1`(으)로 저장합니다.

1. 이전 단계에서 생성한 파일을 다음과 같이 변경합니다.
   + *sender@example.com*을 메시지 발신자 이메일 주소로 바꿉니다.
   + *recipient@example.com*을 메시지 수신자 이메일 주소로 바꿉니다.
   + *email-smtp.us-west-2.amazonaws.com*을 AWS 리전의 Amazon SES SMTP 엔드포인트 URL로 바꿉니다. 자세한 내용은 [리전 및 Amazon SES](regions.md) 단원을 참조하십시오.

1. PowerShell에 다음 명령을 입력합니다.

   ```
   .\path\to\SendEmail.ps1
   ```

   위의 명령에서 *path\$1to\$1SendEmail.ps1*을 1단계에서 생성한 파일의 경로로 바꿉니다.

1. 메시지가 표시되면 SMTP 사용자 이름과 암호를 입력합니다.

------

# Amazon SES API를 사용하여 이메일 보내기
<a name="send-email-api"></a>

Amazon SES를 통해 프로덕션 이메일을 보내려면 SMTP(Simple Mail Transfer Protocol) 인터페이스 또는 Amazon SES API를 사용할 수 있습니다. SMTP 인터페이스에 대한 자세한 내용은 [Amazon SES SMTP 인터페이스를 사용하여 이메일 보내기](send-email-smtp.md) 섹션을 참조하세요. 이 섹션에서는 API를 사용하여 이메일을 보내는 방법을 설명합니다.

Amazon SES API를 사용하여 이메일을 보낼 때 메시지 내용을 지정하면 Amazon SES에서 MIME 이메일을 수집합니다. 또는 이메일을 직접 수집하여 메시지 내용을 완전히 제어할 수 있습니다. [Amazon Simple Email Service API 참조](https://docs.aws.amazon.com/ses/latest/APIReference/)를 참조하세요. Amazon SES를 사용할 수 AWS 리전 있는의 엔드포인트 URLs 목록은의 [Amazon Simple Email Service 엔드포인트 및 할당량을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/ses.html)*AWS 일반 참조*.

다음과 같은 방식으로 API를 호출할 수 있습니다.
+ **직접 HTTPS 요청 만들기 - **이는 가장 고급 방법이며, 요청의 인증 및 서명을 수동으로 처리한 다음 요청을 수동으로 구성해야 합니다. Amazon SES API에 대한 자세한 내용은 *API v2 참조*의 [환영](https://docs.aws.amazon.com/ses/latest/APIReference-V2/Welcome.html) 페이지를 참조하세요.
+ ** AWS SDK 사용 -**AWS SDKs 사용하면 Amazon SES를 비롯한 여러 AWS 서비스의 APIs에 쉽게 액세스할 수 있습니다. SDK를 사용할 경우 인증, 요청 서명, 재시도 로직, 오류 처리 및 기타 하위 수준 기능이 알아서 처리되므로 고객을 만족시킬 애플리케이션 구축에 집중할 수 있습니다.
+ **명령줄 인터페이스 사용 - **[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)은(는) Amazon SES용 명령줄 도구입니다. 또한 PowerShell 환경에서 스크립팅하는 사용자를 위해 [AWS Tools for PowerShell](https://aws.amazon.com/powershell/)도 제공합니다.

SDK, AWS Command Line Interface 또는 AWS Tools for PowerShell을 통해 AWS 직접 또는 간접적으로 Amazon SES API에 액세스하는지 여부에 관계없이 Amazon SES API는 이메일 메시지 구성에 대해 원하는 제어 정도에 따라 이메일을 보내는 두 가지 방법을 제공합니다.
+ **서식 있음 - **Amazon SES에서 적절하게 서식이 지정된 이메일 메시지를 작성하고 전송합니다. 사용자는 "From(발신):" 및 "To(수신):" 주소, 제목, 메시지 본문만 제공하면 됩니다. 나머지는 모두 Amazon SES가 처리합니다. 자세한 내용은 [Amazon SES API를 사용하여 서식이 지정된 이메일 보내기](send-email-formatted.md) 단원을 참조하세요.
+ **원시 - **이메일 헤더와 MIME 형식을 직접 지정하여 이메일 메시지를 수동으로 작성하고 전송합니다. 이메일 서식을 직접 설정하는 데 익숙한 경우 원시 인터페이스를 사용하면 메시지 작성을 더 세부적으로 제어할 수 있습니다. 자세한 내용은 [Amazon SES API v2를 사용하여 원시 이메일 보내기](send-email-raw.md) 단원을 참조하십시오.

**Topics**
+ [Amazon SES API를 사용하여 서식이 지정된 이메일 보내기](send-email-formatted.md)
+ [Amazon SES API v2를 사용하여 원시 이메일 보내기](send-email-raw.md)
+ [템플릿을 사용하여 Amazon SES API를 통해 맞춤형 이메일 전송](send-personalized-email-api.md)
+ [AWS SDK를 사용하여 Amazon SES를 통해 이메일 전송](send-an-email-using-sdk-programmatically.md)
+ [Amazon SES에서 지원하는 콘텐츠 인코딩](content-encodings.md)

# Amazon SES API를 사용하여 서식이 지정된 이메일 보내기
<a name="send-email-formatted"></a>

를 사용하거나 애플리케이션을 통해 Amazon SES API를 직접 AWS Management Console 호출하거나 AWS SDK, AWS Command Line Interface또는를 통해 간접적으로 형식이 지정된 이메일을 보낼 수 있습니다 AWS Tools for Windows PowerShell.

Amazon SES API는 `SendEmail` 작업을 통해 서식이 지정된 이메일을 작성하고 전송할 수 있습니다. `SendEmail`에는 보낸 사람: 주소, 받는 사람: 주소, 메시지 제목 및 메시지 본문(텍스트, HTML 또는 둘 다)이 필요합니다. 자세한 내용은 [SendEmail](https://docs.aws.amazon.com/ses/latest/APIReference/API_SendEmail.html)(API 참조) 또는 [SendEmail](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html)(API v2 참조)를 참조하세요.

**참고**  
이메일 주소 문자열은 7비트 ASCII여야 합니다. 주소의 도메인 부분에 유니코드 문자가 포함된 이메일 주소와 메시지를 주고받으려면 퓨니코드를 사용하여 도메인을 인코딩해야 합니다. 자세한 내용은 [RFC 3492](https://tools.ietf.org/html/rfc3492)를 참조하세요.

다양한 프로그래밍 언어를 사용하여 서식이 지정된 메시지를 작성하는 방법에 대한 예제는[코드 예제](send-an-email-using-sdk-programmatically.md#send-an-email-using-sdk-programmatically-examples) 섹션을 참조하세요.

`SendEmail`을 여러 번 호출할 때 이메일 전송 속도를 향상하는 방법에 대한 팁은 [Amazon SES 처리량 증가](troubleshoot-throughput-problems.md)를 참조하세요.

# Amazon SES API v2를 사용하여 원시 이메일 보내기
<a name="send-email-raw"></a>

`raw`로 지정된 콘텐츠 유형으로 Amazon SES API v2 `SendEmail` 작업을 사용하여 원시 이메일 형식으로 수신자에게 사용자 지정 메시지를 보낼 수 있습니다.

## 이메일 헤더 필드 정보
<a name="send-email-raw-headers"></a>

SMTP(Simple Mail Transfer Protocol)는 이메일 봉투와 몇 가지 해당 파라미터를 정의하여 이메일 메시지를 전송하는 방법을 지정하지만, 메시지 콘텐츠에는 관련되지 않습니다. 그 대신, 인터넷 메시지 형식([RFC 5322](https://www.ietf.org/rfc/rfc5322.txt))이 메시지 작성 방법을 정의합니다.

인터넷 메시지 형식 지정을 사용할 경우 모든 이메일 메시지는 헤더와 본문으로 구성됩니다. 헤더는 메시지 메타데이터로 구성되며, 본문에는 메시지 자체가 포함됩니다. 이메일 헤더와 본문에 대한 자세한 내용은 [Amazon SES의 이메일 형식](send-email-concepts-email-format.md) 섹션을 참조하세요.

## 원시 이메일 MIME 메시지 구성 사용
<a name="send-email-raw-mime"></a>

SMTP 프로토콜은 원래 7비트 ASCII 문자만 포함된 이메일 메시지를 전송하기 위해 설계되었습니다. 이 사양으로 인해 비 ASCII 텍스트 인코딩(예: 유니코드), 바이너리 콘텐츠 또는 첨부 파일에는 SMTP가 부족합니다. MIME(Multipurpose Internet Mail Extensions) 표준은 SMTP를 사용하여 다른 많은 종류의 콘텐츠를 전송할 수 있도록 하기 위해 개발되었습니다.

MIME 표준은 메시지 본문을 여러 부분으로 분류한 다음 각 부분에 수행할 작업을 지정하는 방식으로 작동합니다. 예를 들어, 이메일 메시지 본문의 한 부분은 일반 텍스트이고 다른 한 부분은 HTML일 수 있습니다. 또한 MIME는 이메일 메시지에 하나 이상의 첨부 파일이 포함될 수 있도록 허용합니다. 메시지 수신자는 이메일 클라이언트에서 첨부 파일을 보거나 첨부 파일을 저장할 수 있습니다.

메시지 헤더와 콘텐츠는 빈 줄로 분리됩니다. 이메일의 각 부분은 각 부분의 시작과 종료를 나타내는 문자열인 경계로 분리됩니다.

다음 예제의 여러 부분으로 구성된 메시지에는 텍스트 및 HTML 부분과 첨부 파일이 포함되어 있습니다. 첨부 파일은 [첨부 파일 헤더](#send-email-mime-encoding-files) 바로 아래에 위치해야 하며 대부분 이 예제와 같이 `base64`로 인코딩됩니다.

```
 1. From: "Sender Name" <sender@example.com>
 2. To: recipient@example.com
 3. Subject: Customer service contact info
 4. Content-Type: multipart/mixed;
 5.     boundary="a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"
 6. 
 7. --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
 8. Content-Type: multipart/alternative;
 9.     boundary="sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"
10. 
11. --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
12. Content-Type: text/plain; charset=iso-8859-1
13. Content-Transfer-Encoding: quoted-printable
14. 
15. Please see the attached file for a list of customers to contact.
16. 
17. --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
18. Content-Type: text/html; charset=iso-8859-1
19. Content-Transfer-Encoding: quoted-printable
20. 
21. <html>
22. <head></head>
23. <body>
24. <h1>Hello!</h1>
25. <p>Please see the attached file for a list of customers to contact.</p>
26. </body>
27. </html>
28. 
29. --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--
30. 
31. --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
32. Content-Type: text/plain; name="customers.txt"
33. Content-Description: customers.txt
34. Content-Disposition: attachment;filename="customers.txt";
35.     creation-date="Sat, 05 Aug 2017 19:35:36 GMT";
36. Content-Transfer-Encoding: base64
37. 
38. SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENhbmFkYQo5MjM4
39. OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixVbml0ZWQgU3RhdGVzCjI4OTMs
40. QW5heWEsSXllbmdhcixJbmRpYQ==
41. 
42. --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--
```

이 메시지의 콘텐츠 유형은 `multipart/mixed`로, 이는 메시지에 여러 부분(이 예제에서는 본문과 첨부 파일)이 있고 수신 클라이언트가 각 부분을 개별적으로 처리해야 함을 나타냅니다.

본문 섹션 내에서 중첩된 두 번째 부분은 `multipart/alternative` 콘텐츠 유형을 사용합니다. 이 콘텐츠 유형은 각 부분에 동일한 콘텐츠의 대체 버전이 포함되어 있음을 나타냅니다(이 경우에는 텍스트 버전과 HTML 버전). 수신자의 이메일 클라이언트가 HTML 콘텐츠를 표시할 수 있으면 메시지 본문의 HTML 버전이 표시됩니다. 수신자의 이메일 클라이언트가 HTML 콘텐츠를 표시할 수 없으면 메시지 본문의 일반 텍스트 버전이 표시됩니다.

두 메시지 버전에는 첨부 파일도 포함됩니다(이 경우 일부 고객 이름이 포함된 짧은 텍스트 파일).

이 예제에서처럼 다른 부분 내에 MIME 부분을 중첩하는 경우, 중첩된 부분은 상위 부분의 `boundary` 파라미터와 다른 `boundary` 파라미터를 사용해야 합니다. 이러한 경계는 고유한 문자열이어야 합니다. MIME 부분 간에 경계를 정의하려면 하이픈 두 개(--) 뒤에 경계 문자열을 입력합니다 MIME 부분의 마지막에는 경계 문자열의 시작과 끝 모두에 하이픈 두 개를 넣습니다.

**참고**  
메시지의 MIME 부분은 500개를 초과할 수 없습니다.

### MIME 인코딩
<a name="send-email-mime-encoding"></a>

이전 시스템과의 호환성을 유지하기 위해 Amazon SES는 [RFC 2821](https://tools.ietf.org/html/rfc2821)에 정의된 대로 SMTP의 7비트 ASCII 제한을 준수합니다. 비 ASCII 문자가 포함된 콘텐츠를 보내려면 해당 문자를 7비트 ASCII 문자를 사용하는 형식으로 인코딩해야 합니다.

#### 이메일 주소
<a name="send-email-mime-encoding-addresses"></a>

이메일 주소 문자열은 7비트 ASCII여야 합니다. 주소의 도메인 부분에 유니코드 문자가 포함된 이메일 주소와 메시지를 주고받으려면 퓨니코드를 사용하여 도메인을 인코딩해야 합니다. 이메일 주소의 로컬 부분(@ 기호 앞부분)은 물론 "대화명"에도 퓨니코드를 사용할 수 없습니다. ‘대화명’에 유니코드 문자를 사용하려면 이 섹션에서 설명한 것과 같이 MIME 인코딩된 단어 구문을 사용하여 ‘대화명’을 인코딩해야 합니다. 퓨니코드에 대한 자세한 내용은 [RFC 3492](http://tools.ietf.org/html/rfc3492)를 참조하세요.

**참고**  
이 규칙은 메시지 헤더가 아닌 메시지 봉투에 지정하는 이메일 주소에만 적용됩니다. Amazon SES API v2 `SendEmail` 작업을 사용하면 `Source` 및 `Destinations` 파라미터에 지정하는 주소가 봉투 발신자 및 수신자를 각각 정의합니다.

#### 이메일 헤더
<a name="send-email-mime-encoding-headers"></a>

메시지 헤더를 인코딩하려면 MIME 인코딩된 단어 구문을 사용하세요. MIME 인코딩된 단어 구문에는 다음 형식이 사용됩니다.

```
=?charset?encoding?encoded-text?=
```

`encoding`의 값은 `Q` 또는 `B`가 될 수 있습니다. 인코딩의 값이 `Q`이면 `encoded-text` 값은 Q 인코딩을 사용해야 합니다. 인코딩의 값이 `B`이면 `encoded-text` 값은 base64 인코딩을 사용해야 합니다.

예를 들어 이메일의 제목줄에 문자열 “Як ти поживаєш?”을 사용하려면 다음 인코딩 중 하나를 사용할 수 있습니다.
+ **Q 인코딩**

  ```
  =?utf-8?Q?=D0=AF=D0=BA_=D1=82=D0=B8_=D0=BF=D0=BE=D0=B6=D0=B8=D0=B2=D0=B0=D1=94=D1=88=3F?=
  ```
+ **Base64 인코딩**

  ```
  =?utf-8?B?0K/QuiDRgtC4INC/0L7QttC40LLQsNGU0Yg/?=
  ```

Q 인코딩에 대한 자세한 내용은 [RFC 2047](https://tools.ietf.org/html/rfc2047)을 참조하세요. base64 인코딩에 대한 자세한 내용은 [RFC 2045](https://tools.ietf.org/html/rfc2045)를 참조하세요.

#### 메시지 본문
<a name="send-email-mime-encoding-body"></a>

메시지의 본문을 인코딩하려면 QP(Quoted-Printable) 인코딩 또는 base64 인코딩을 사용할 수 있습니다. 그런 다음 `Content-Transfer-Encoding` 헤더를 사용하여 사용한 인코딩 체계를 나타냅니다.

예를 들어 메시지의 본문에 다음 텍스트가 포함되어 있다고 가정해보세요.

१९७२ मे रे टॉमलिंसन ने पहला ई-मेल संदेश भेजा \$1 रे टॉमलिंसन ने ही सर्वप्रथम @ चिन्ह का चयन किया और इन्ही को ईमेल का आविष्कारक माना जाता है

base64 인코딩을 사용하여 이 텍스트를 인코딩하려면 먼저 다음 헤더를 지정하세요.

```
Content-Transfer-Encoding: base64
```

그 다음, 이메일의 본문 섹션에 base64로 인코딩된 텍스트를 포함시키세요.

```
4KWn4KWv4KWt4KWoIOCkruClhyDgpLDgpYcg4KSf4KWJ4KSu4KSy4KS/4KSC4KS44KSoIOCkqOCl
hyDgpKrgpLngpLLgpL4g4KSILeCkruClh+CksiDgpLjgpILgpKbgpYfgpLYg4KSt4KWH4KSc4KS+
IHwg4KSw4KWHIOCkn+ClieCkruCksuCkv+CkguCkuOCkqCDgpKjgpYcg4KS54KWAIOCkuOCksOCl
jeCkteCkquCljeCksOCkpeCkriBAIOCkmuCkv+CkqOCljeCkuSDgpJXgpL4g4KSa4KSv4KSoIOCk
leCkv+Ckr+CkviDgpJTgpLAg4KSH4KSo4KWN4KS54KWAIOCkleCliyDgpIjgpK7gpYfgpLIg4KSV
4KS+IOCkhuCkteCkv+Ckt+CljeCkleCkvuCksOCklSDgpK7gpL7gpKjgpL4g4KSc4KS+4KSk4KS+
IOCkueCliAo=
```

**참고**  
경우에 따라 Amazon SES를 사용하여 전송하는 메시지에 8비트 `Content-Transfer-Encoding`을(를) 사용할 수 있습니다. 그러나 Amazon SES가 메시지를 변경해야 하는 경우(예: [열기 및 클릭 추적](faqs-metrics.md)을 사용하는 경우) 8비트로 인코딩된 콘텐츠가 수신자의 받은 편지함에 도착할 때 올바르게 표시되지 않을 수 있습니다. 이러한 이유로 7비트 ASCII가 아닌 콘텐츠는 항상 인코딩해야 합니다.

#### 첨부 파일
<a name="send-email-mime-encoding-files"></a>

이메일에 파일을 첨부하려면 base64 인코딩을 사용하여 첨부 파일을 인코딩해야 합니다. 첨부 파일은 일반적으로 다음 헤더를 포함하는 전용 MIME 메시지 부분에 배치됩니다.
+ **Content-Type** – 첨부 파일의 유형입니다. 다음은 일반적인 MIME Content-Type 선언의 예제입니다.
  + **일반 텍스트 파일** – `Content-Type: text/plain; name="sample.txt"`
  + **Microsoft Word 문서** – `Content-Type: application/msword; name="document.docx"`
  + **JPG 이미지** – `Content-Type: image/jpeg; name="photo.jpeg"`
+ **Content-Disposition** – 수신자의 이메일 클라이언트가 콘텐츠를 처리하는 방법을 지정합니다. 첨부 파일의 경우 이 값은 `Content-Disposition: attachment`입니다.
+ **Content-Transfer-Encoding** – 첨부 파일을 인코딩하는 데 사용된 체계입니다. 첨부 파일의 경우 이 값은 거의 항상 `base64`입니다.
+ **인코딩된 첨부 파일** – 실제 첨부 파일을 인코딩하여 [예제에서와 같이](#send-email-raw-mime) 첨부 파일 헤더 아래의 본문에 포함해야 합니다.

Amazon SES는 가장 일반적인 파일 유형을 허용합니다. Amazon SES에서 허용하지 않는 파일 유형 목록은 [SES에서 지원되지 않는 첨부 파일 유형](attachments.md#mime-types) 섹션을 참조하세요.

## Amazon SES API v2를 사용하여 원시 이메일 보내기
<a name="send-email-raw-api"></a>

Amazon SES API v2는 사용자가 콘텐츠 유형(단순, 원시, 템플릿 형식 중 하나)을 설정하면 사용자가 지정하는 형식으로 이메일 메시지를 작성하고 전송할 수 있는 `SendEmail` 작업을 제공합니다. 전체 설명을 보려면 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) 섹션을 참조하세요. 다음 예제에서는 원시 이메일 형식을 사용하여 메시지를 보낼 콘텐츠 유형을 `raw`로 지정합니다.

**참고**  
`SendEmail`을(를) 여러 번 호출할 때 이메일 전송 속도를 향상하는 방법에 대한 팁은 [Amazon SES 처리량 증가](troubleshoot-throughput-problems.md)을(를) 참조하세요.

메시지 본문에는 적절한 헤더 필드 및 메시지 본문 인코딩과 함께 적절하게 서식 설정된 원시 이메일 메시지가 포함되어야 합니다. 애플리케이션 내에서 원시 메시지를 수동으로 작성할 수 있지만, 기존 메일 라이브러리를 사용하여 작성하면 훨씬 더 간편합니다.

------
#### [ Java ]

다음 코드 예제는 [JavaMail](https://javaee.github.io/javamail/) 라이브러리와 [AWS SDK for Java](https://aws.amazon.com/sdk-for-java)를 사용하여 원시 이메일을 작성하고 전송하는 방법을 보여줍니다.

```
  1. package com.amazonaws.samples;
  2. 
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.PrintStream;
  6. import java.nio.ByteBuffer;
  7. import java.util.Properties;
  8. 
  9. // JavaMail libraries. Download the JavaMail API 
 10. // from https://javaee.github.io/javamail/
 11. import javax.activation.DataHandler;
 12. import javax.activation.DataSource;
 13. import javax.activation.FileDataSource;
 14. import javax.mail.Message;
 15. import javax.mail.MessagingException;
 16. import javax.mail.Session;
 17. import javax.mail.internet.AddressException;
 18. import javax.mail.internet.InternetAddress;
 19. import javax.mail.internet.MimeBodyPart;
 20. import javax.mail.internet.MimeMessage;
 21. import javax.mail.internet.MimeMultipart;
 22. 
 23. // AWS SDK libraries. Download the AWS SDK for Java // from https://aws.amazon.com/sdk-for-java
 24. import com.amazonaws.regions.Regions;
 25. import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
 26. import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
 27. import com.amazonaws.services.simpleemail.model.RawMessage;
 28. import com.amazonaws.services.simpleemail.model.SendRawEmailRequest;
 29. 
 30. public class AmazonSESSample {
 31. 
 32. 	// Replace sender@example.com with your "From" address.
 33. 	// This address must be verified with Amazon SES.
 34. 	private static String SENDER = "Sender Name <sender@example.com>";
 35. 
 36. 	// Replace recipient@example.com with a "To" address. If your account 
 37. 	// is still in the sandbox, this address must be verified.
 38. 	private static String RECIPIENT = "recipient@example.com";
 39. 
 40. 	// Specify a configuration set. If you do not want to use a configuration
 41. 	// set, comment the following variable, and the 
 42. 	// ConfigurationSetName=CONFIGURATION_SET argument below.
 43. 	private static String CONFIGURATION_SET = "ConfigSet";
 44. 
 45. 	// The subject line for the email.
 46. 	private static String SUBJECT = "Customer service contact info";
 47. 
 48. 	// The full path to the file that will be attached to the email.
 49. 	// If you're using Windows, escape backslashes as shown in this variable.
 50. 	private static String ATTACHMENT = "C:\\Users\\sender\\customers-to-contact.xlsx";
 51. 
 52. 	// The email body for recipients with non-HTML email clients.
 53. 	private static String BODY_TEXT = "Hello,\r\n"
 54.                                         + "Please see the attached file for a list "
 55.                                         + "of customers to contact.";
 56. 
 57. 	// The HTML body of the email.
 58. 	private static String BODY_HTML = "<html>"
 59.                                         + "<head></head>"
 60.                                         + "<body>"
 61.                                         + "<h1>Hello!</h1>"
 62.                                         + "<p>Please see the attached file for a "
 63.                                         + "list of customers to contact.</p>"
 64.                                         + "</body>"
 65.                                         + "</html>";
 66. 
 67.     public static void main(String[] args) throws AddressException, MessagingException, IOException {
 68.             	
 69.     	Session session = Session.getDefaultInstance(new Properties());
 70.         
 71.         // Create a new MimeMessage object.
 72.         MimeMessage message = new MimeMessage(session);
 73.         
 74.         // Add subject, from and to lines.
 75.         message.setSubject(SUBJECT, "UTF-8");
 76.         message.setFrom(new InternetAddress(SENDER));
 77.         message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RECIPIENT));
 78. 
 79.         // Create a multipart/alternative child container.
 80.         MimeMultipart msg_body = new MimeMultipart("alternative");
 81.         
 82.         // Create a wrapper for the HTML and text parts.        
 83.         MimeBodyPart wrap = new MimeBodyPart();
 84.         
 85.         // Define the text part.
 86.         MimeBodyPart textPart = new MimeBodyPart();
 87.         textPart.setContent(BODY_TEXT, "text/plain; charset=UTF-8");
 88.                 
 89.         // Define the HTML part.
 90.         MimeBodyPart htmlPart = new MimeBodyPart();
 91.         htmlPart.setContent(BODY_HTML,"text/html; charset=UTF-8");
 92.                 
 93.         // Add the text and HTML parts to the child container.
 94.         msg_body.addBodyPart(textPart);
 95.         msg_body.addBodyPart(htmlPart);
 96.         
 97.         // Add the child container to the wrapper object.
 98.         wrap.setContent(msg_body);
 99.         
100.         // Create a multipart/mixed parent container.
101.         MimeMultipart msg = new MimeMultipart("mixed");
102.         
103.         // Add the parent container to the message.
104.         message.setContent(msg);
105.         
106.         // Add the multipart/alternative part to the message.
107.         msg.addBodyPart(wrap);
108.         
109.         // Define the attachment
110.         MimeBodyPart att = new MimeBodyPart();
111.         DataSource fds = new FileDataSource(ATTACHMENT);
112.         att.setDataHandler(new DataHandler(fds));
113.         att.setFileName(fds.getName());
114.         
115.         // Add the attachment to the message.
116.         msg.addBodyPart(att);
117. 
118.         // Try to send the email.
119.         try {
120.             System.out.println("Attempting to send an email through Amazon SES "
121.                               +"using the AWS SDK for Java...");
122. 
123.             // Instantiate an Amazon SES client, which will make the service 
124.             // call with the supplied AWS credentials.
125.             AmazonSimpleEmailService client = 
126.                     AmazonSimpleEmailServiceClientBuilder.standard()
127.                     // Replace US_WEST_2 with the AWS Region you're using for
128.                     // Amazon SES.
129.                     .withRegion(Regions.US_WEST_2).build();
130.             
131.             // Print the raw email content on the console
132.             PrintStream out = System.out;
133.             message.writeTo(out);
134. 
135.             // Send the email.
136.             ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
137.             message.writeTo(outputStream);
138.             RawMessage rawMessage = 
139.             		new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));
140. 
141.             SendRawEmailRequest rawEmailRequest = 
142.             		new SendRawEmailRequest(rawMessage)
143.             		    .withConfigurationSetName(CONFIGURATION_SET);
144.             
145.             client.sendRawEmail(rawEmailRequest);
146.             System.out.println("Email sent!");
147.         // Display an error if something goes wrong.
148.         } catch (Exception ex) {
149.           System.out.println("Email Failed");
150.             System.err.println("Error message: " + ex.getMessage());
151.             ex.printStackTrace();
152.         }
153.     }
154. }
```

------
#### [ Python ]

다음 코드 예제는 [Python email.mime](https://docs.python.org/3.8/library/email.mime.html) 패키지와 [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python)을 사용하여 원시 이메일을 작성하고 전송하는 방법을 보여줍니다.

```
 1. import json
 2. import boto3
 3. from botocore.exceptions import ClientError
 4. from email.mime.multipart import MIMEMultipart
 5. from email.mime.text import MIMEText
 6. from email.mime.application import MIMEApplication
 7. import os
 8. 
 9. def boto3_rawemailv2():
10.     SENDER = "Sender <sender@example.com>"
11.     RECIPIENT = "recipient@example.com"
12.     CONFIGURATION_SET = "ConfigSet"
13.     AWS_REGION = "us-east-1"
14.     SUBJECT = "Customer service contact info"
15.     ATTACHMENT = "path/to/customers-to-contact.xlsx"
16.     BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact."
17. 
18.     # The HTML body of the email.
19.     BODY_HTML = """\
20.     <html>
21.     <head/>
22.     <body>
23.     <h1>Hello!</h1>
24.     <p>Please see the attached file for a list of customers to contact.</p>
25.     </body>
26.     </html>
27.     """
28. 
29.     # The character encoding for the email.
30.     CHARSET = "utf-8"
31.     msg = MIMEMultipart('mixed')
32.     # Add subject, from and to lines.
33.     msg['Subject'] = SUBJECT 
34.     msg['From'] = SENDER 
35.     msg['To'] = RECIPIENT
36.     
37.     # Create a multipart/alternative child container.
38.     msg_body = MIMEMultipart('alternative')
39.     
40.     # Encode the text and HTML content and set the character encoding. This step is
41.     # necessary if you're sending a message with characters outside the ASCII range.
42.     textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET)
43.     htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET)
44.     
45.     # Add the text and HTML parts to the child container.
46.     msg_body.attach(textpart)
47.     msg_body.attach(htmlpart)
48.     
49.     # Define the attachment part and encode it using MIMEApplication.
50.     att = MIMEApplication(open(ATTACHMENT, 'rb').read())
51.     
52.     # Add a header to tell the email client to treat this part as an attachment,
53.     # and to give the attachment a name.
54.     att.add_header('Content-Disposition','attachment',filename=os.path.basename(ATTACHMENT))
55.     
56.     # Attach the multipart/alternative child container to the multipart/mixed
57.     # parent container.
58.     msg.attach(msg_body)
59.     msg.attach(att)
60. 
61.     #changes start from here
62.     strmsg = str(msg)
63.     body = bytes (strmsg, 'utf-8')
64. 
65. 
66. 
67.     
68.     client = boto3.client('sesv2')
69.     response = client.send_email(
70.     FromEmailAddress=SENDER,
71.     Destination={
72.         'ToAddresses': [RECIPIENT]
73.     },
74.     Content={
75.         'Raw': {
76.             'Data': body
77.         }
78.     }
79.     )
80.     print(response)
81. boto3_rawemailv2 ()
```

------

# 템플릿을 사용하여 Amazon SES API를 통해 맞춤형 이메일 전송
<a name="send-personalized-email-api"></a>

Amazon SES에서는 *저장된 템플릿*을 사용하거나 *인라인 템플릿*을 사용하여 템플릿 이메일을 보낼 수 있습니다.
+ **저장된 템플릿** - Amazon SES v2 API의 `CreateEmailTemplate` 작업을 사용하여 SES에서 생성 및 저장된 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html) 리소스를 나타냅니다. 템플릿에는 작성된 콘텐츠와 일치하는 변수(자리 표시자)가 포함된 이메일의 제목과 본문이 포함되어 있습니다. 저장된 템플릿의 이름과 템플릿의 자리 표시자 변수에 대한 동적 데이터는 `SendEmail` 또는 `SendBulkEmail` v2 API 작업을 직접적으로 호출할 때 제공됩니다.

  *저장된 템플릿*은 쉽게 재사용할 수 있으며 유사한 유형의 이메일을 보낼 때 시간과 노력을 절약해 줍니다. 처음부터 각 이메일을 생성하는 대신 기본 구조와 설계를 한 번만 생성한 다음 템플릿 내의 동적 콘텐츠를 업데이트하면 됩니다.
+ **인라인 템플릿** - `Template` 리소스를 사용하지 않고, 대신 작성된 콘텐츠에 변수(자리 표시자)를 인라인 형태로 포함한 이메일의 제목과 본문을 제공합니다. 이러한 자리 표시자 변수의 값은 `SendEmail` 또는 `SendBulkEmail` v2 API 작업을 직접적으로 호출할 때 함께 제공합니다.

  *인라인 템플릿*은 SES 계정에서 템플릿 리소스를 관리할 필요가 없어 대량 이메일 전송 프로세스를 간소화하고 애플리케이션 로직 내에 템플릿 콘텐츠를 직접 포함할 수 있으므로 통합 프로세스를 간소화합니다. 당 20,000개 템플릿 제한에 포함되지 않습니다 AWS 리전.

*저장된 템플릿*을 사용할 때는 다음 제한이 적용됩니다.
+ 각각 최대 20,000개의 이메일 템플릿을 생성할 수 있습니다 AWS 리전.
+ 각 템플릿의 최대 크기는 텍스트 부분과 HTML 부분을 포함하여 500KB입니다.

*인라인 템플릿*을 사용할 때는 다음 제한이 적용됩니다.
+ 각 입력 JSON 파일의 크기는 텍스트 부분과 HTML 부분을 모두 포함하여 최대 1MB일 수 있습니다.

다음은 *저장된 템플릿*과 *인라인 템플릿* 모두에 적용됩니다.
+ 사용할 수 있는 대체 변수 수에는 제한이 없습니다.
+ 각 `SendBulkEmail` 작업에 대한 직접 호출에서 최대 50개의 대상 객체에 이메일을 보낼 수 있습니다. [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html) 객체에는 **ToAddresses**, **CcAddresses** 및 **BccAddresses**에 정의된 여러 수신자가 포함될 수 있습니다. 단일 v2 API 직접 호출에서 연락할 수 있는 대상 수는 계정의 최대 전송 속도에 의해 제한될 수 있습니다. 자세한 내용은 [Amazon SES 발신 한도 관리](manage-sending-quotas.md) 단원을 참조하십시오.

이 장에는 *저장된 템플릿*과 *인라인 템플릿*을 모두 사용하는 예제가 포함된 절차가 포함되어 있습니다.

**참고**  
이 섹션의 절차는 또한 AWS CLI을(를) 이미 설치하여 구성한 상태를 전제로 설명합니다. 설치 및 구성에 대한 자세한 내용은 [AWS Command Line Interface 사용 설명서를](https://docs.aws.amazon.com/cli/latest/userguide/) AWS CLI참조하세요.

## (선택 사항) 1부: 렌더링 오류 이벤트 알림 설정
<a name="send-personalized-email-set-up-notifications"></a>

 잘못된 맞춤형 콘텐츠가 포함된 이메일을 전송하는 경우 Amazon SES에서 메시지를 허용할 수는 있지만 전달할 수 없게 됩니다. 따라서 맞춤형 이메일을 전송하려면 Amazon SNS를 통해 렌더링 오류 이벤트 알림을 전송하도록 SES를 구성해야 합니다. 렌더링 오류 이벤트 알림을 수신할 때 어떤 메시지에 잘못된 콘텐츠가 있는지 식별하고, 문제를 해결한 다음 메시지를 다시 전송할 수 있습니다.

이 섹션의 절차는 선택 사항이지만 강력히 권장됩니다.

**렌더링 오류 이벤트 알림을 구성하려면**

1. Amazon SNS 주제를 생성합니다. 절차는 *Amazon Simple Notification Service 개발자 가이드*의 [주제 생성](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)을 참조하세요.

1. Amazon SNS 주제를 구독하세요. 예를 들어 렌더링 오류 알림을 이메일로 수신하고자 하는 경우 이메일 엔드포인트(이메일 주소)를 주제에 구독시킵니다.

   자세한 내용은 *Amazon Simple Notification Service 개발자 가이드*의 [주제 구독](https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html)을 참조하세요.

1. [이벤트 게시에 필요한 Amazon SNS 이벤트 대상 설정](event-publishing-add-event-destination-sns.md)의 절차를 완료하여 구성 세트를 설정해 렌더링 오류 이벤트를 Amazon SNS 주제에 게시합니다.

## (선택 사항) 2부: 이메일 템플릿 생성
<a name="send-personalized-email-create-template"></a>

*저장된 템플릿*을 사용하려는 경우 이 섹션에서는 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_CreateEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_CreateEmailTemplate.html) SES v2 API 작업을 사용하여 템플릿을 생성하는 방법을 보여 줍니다. *인라인 템플릿*을 사용하려면 이 단계를 건너뛸 수 있습니다.

이 절차는 AWS CLI를 이미 설치하여 구성한 상태를 전제로 설명합니다. 설치 및 구성에 대한 자세한 내용은 [AWS Command Line Interface 사용 설명서를](https://docs.aws.amazon.com/cli/latest/userguide/) AWS CLI참조하세요.

**템플릿을 생성하려면**

1. 텍스트 편집기에서 새 파일을 생성하고 필요에 따라 사용자 지정하여 다음 코드를 붙여 넣습니다.

   ```
   {
       "TemplateName": "MyTemplate",
       "TemplateContent": {
           "Subject": "Greetings, {{name}}!",
           "Text": "Dear {{name}},\r\nYour favorite animal is {{favoriteanimal}}.",
           "Html": "<h1>Hello {{name}},</h1><p>Your favorite animal is {{favoriteanimal}}.</p>"
       }
   }
   ```

   이 코드는 다음 속성을 포함하고 있습니다.
   + **TemplateName** - `Template` 리소스의 이름입니다. 이메일을 보낼 때 이 이름을 참조합니다.
   + **TemplateContent** - 다음 속성을 위한 컨테이너입니다.
     + **제목** - 이메일의 제목입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이 태그는 `{{tagname}}` 형식을 사용합니다. 이메일을 보낼 때 각 대상에 대해 `tagname`의 값을 지정할 수 있습니다.
     + **Html** – 이메일의 HTML 본문입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이전 예에는 `{{name}}` 및 `{{favoriteanimal}}`이라는 두 가지 태그가 포함됩니다.
     + **Text** – 이메일의 텍스트 본문입니다. 이메일 클라이언트가 HTML 콘텐츠를 표시하지 않는 수신자는 이 이메일 버전을 볼 수 있습니다. 이 속성에는 대체 태그도 포함될 수 있습니다.

1. 위의 예를 필요에 맞게 사용자 지정한 다음 파일을 *mytemplate.json*으로 저장합니다.

1. 명령줄에 다음 명령을 입력하여 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_CreateEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_CreateEmailTemplate.html) v2 API 작업을 통해 새 템플릿을 생성합니다.

   ```
   aws sesv2 create-email-template --cli-input-json file://mytemplate.json
   ```

## 3부: 맞춤형 이메일 보내기
<a name="send-personalized-email-api-operations"></a>

다음 두 가지 SES v2 API 작업을 사용하여 *저장된 템플릿* 또는 *인라인 템플릿*을 사용하여 이메일을 보낼 수 있습니다.
+ [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) 작업은 사용자 지정 이메일을 단일 대상 객체로 보내는 데 유용합니다. v2 API [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html) 객체에는 *ToAddresses*, *CcAddresses* 및 *BccAddresses* 속성이 포함될 수 있습니다. 이러한 주소는 모든 조합으로 사용할 수 있으며 동일한 이메일을 수신할 하나 이상의 이메일 주소를 포함할 수 있습니다.
+ [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html) 작업은 v2 API에 대한 단일 직접 호출로 여러 대상 객체에 고유의 이메일을 보내는 데 유용합니다.

이 섹션에서는를 사용하여 이러한 AWS CLI 두 전송 작업을 모두 사용하여 템플릿이 지정된 이메일을 보내는 방법의 예를 제공합니다.

### 단일 대상 객체에 템플릿 이메일 전송
<a name="send-templated-email-single-destination"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) 작업을 사용하여 단일 대상 객체에 정의된 하나 이상의 수신자에게 이메일을 보낼 수 있습니다. [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html) 객체의 모든 수신자는 동일한 이메일을 수신합니다.

**단일 대상 객체로 템플릿 이메일을 전송하려면**

1. *저장된 템플릿*을 사용할지 *인라인 템플릿*을 사용할지에 따라 텍스트 편집기에 붙여넣을 각 코드 예제를 선택하여 필요에 따라 사용자 지정합니다.

------
#### [ Stored template code example ]

   이전 단계인 *MyTemplate*에서 생성한 템플릿은 `TemplateName` 파라미터의 값으로 참조됩니다.

   ```
   {
       "FromEmailAddress": "Mary Major <mary.major@example.com>",
       "Destination": {
           "ToAddresses": [
               "alejandro.rosalez@example.com", "jimmy.jet@example.com"
           ]
       },
       "Content": {
           "Template": {
               "TemplateName": "MyTemplate",
               "TemplateData": "{ \"name\":\"Alejandro\", \"favoriteanimal\": \"alligator\" }"
           }
       },
       "ConfigurationSetName": "ConfigSet"
   }
   ```

   이 코드는 다음 속성을 포함하고 있습니다.
   + **FromEmailAddress** - 발신자의 이메일 주소입니다.
   + **대상** - *ToAddresses*, *CcAddresses* 및 *BccAddresses* 속성에 정의된 이메일 수신자가 포함된 객체입니다. 이러한 주소는 모든 조합으로 사용할 수 있으며 동일한 이메일을 수신할 하나 이상의 이메일 주소를 포함할 수 있습니다.
   + **TemplateName** – 이메일에 적용할 `Template` 리소스의 이름입니다.
   + **TemplateData** – 키-값 페어를 포함하는 이스케이프된 JSON 문자열입니다. 키는 저장된 템플릿(예: `{{name}}`)의 `TemplateContent` 속성에 정의된 변수에 해당합니다. 값은 변수를 대체하는 콘텐츠를 나타냅니다.
   + **ConfigurationSetName** – 이메일 전송 시 사용할 구성 세트의 이름입니다.
**참고**  
렌더링 오류 이벤트를 Amazon SNS에 게시하도록 구성된 구성 세트를 사용하는 것이 좋습니다. 자세한 내용은 [(선택 사항) 1부: 렌더링 오류 이벤트 알림 설정](#send-personalized-email-set-up-notifications) 단원을 참조하십시오.

------
#### [ Inline template code example ]

   `TemplateContent` 속성(일반적으로 *저장된 템플릿*에 정의됨)은 이를 *인라인* 템플릿으로 만드는 `TemplateData` 속성과 함께 *인라인*으로 정의됩니다.

   ```
   {
       "FromEmailAddress": "Mary Major <mary.major@example.com>",
       "Destination": {
           "ToAddresses": [
               "alejandro.rosalez@example.com", "jimmy.jet@example.com"
           ]
       },
       "Content": {
           "Template": {
               "TemplateContent": {
                   "Subject": "Greetings, {{name}}!",
                   "Text": "Dear {{name}},\r\nYour favorite animal is {{favoriteanimal}}.",
                   "Html": "<h1>Hello {{name}},</h1><p>Your favorite animal is {{favoriteanimal}}.</p>"
               },
               "TemplateData": "{ \"name\":\"Alejandro\", \"favoriteanimal\": \"alligator\" }"
           }
       },
       "ConfigurationSetName": "ConfigSet"
   }
   ```

   이 코드는 다음 속성을 포함하고 있습니다.
   + **FromEmailAddress** - 발신자의 이메일 주소입니다.
   + **대상** - *ToAddresses*, *CcAddresses* 및 *BccAddresses* 속성에 정의된 이메일 수신자가 포함된 객체입니다. 이러한 주소는 모든 조합으로 사용할 수 있으며 동일한 이메일을 수신할 하나 이상의 이메일 주소를 포함할 수 있습니다.
   + **TemplateContent** - 다음 속성을 위한 컨테이너입니다.
     + **제목** - 이메일의 제목입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이 태그는 `{{tagname}}` 형식을 사용합니다. 이메일을 보낼 때 각 대상에 대해 `tagname`의 값을 지정할 수 있습니다.
     + **Html** – 이메일의 HTML 본문입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이전 예에는 `{{name}}` 및 `{{favoriteanimal}}`이라는 두 가지 태그가 포함됩니다.
     + **Text** – 이메일의 텍스트 본문입니다. 이메일 클라이언트가 HTML 콘텐츠를 표시하지 않는 수신자는 이 이메일 버전을 볼 수 있습니다. 이 속성에는 대체 태그도 포함될 수 있습니다.
   + **TemplateData** – 키-값 페어를 포함하는 이스케이프된 JSON 문자열입니다. 키는 `{{name}}`과 같이 이 파일의 `TemplateContent` 속성에 정의된 변수에 해당합니다. 값은 변수를 대체하는 콘텐츠를 나타냅니다.
   + **ConfigurationSetName** – 이메일 전송 시 사용할 구성 세트의 이름입니다.
**참고**  
렌더링 오류 이벤트를 Amazon SNS에 게시하도록 구성된 구성 세트를 사용하는 것이 좋습니다. 자세한 내용은 [(선택 사항) 1부: 렌더링 오류 이벤트 알림 설정](#send-personalized-email-set-up-notifications) 단원을 참조하십시오.

------

1. 위의 예를 필요에 맞게 사용자 지정한 다음 파일을 *myemail.json*으로 저장합니다.

1. 명령줄에 v2 API 명령을 입력하여 이메일을 보냅니다.

   ```
   aws sesv2 send-email --cli-input-json file://myemail.json
   ```

### 여러 대상 객체에 템플릿 이메일 전송
<a name="send-templated-email-multiple-destinations"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html) 작업을 사용하여 SES v2 API에 대한 단일 직접 호출에서 여러 대상 객체로 이메일을 전송할 수 있습니다. SES는 각 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Destination.html) 객체의 수신자 또는 수신자들에게 고유한 이메일을 전송합니다.

**여러 대상 객체에 템플릿 이메일 전송**

1. *저장된 템플릿*을 사용할지 *인라인 템플릿*을 사용할지에 따라 텍스트 편집기에 붙여넣을 각 코드 예제를 선택하여 필요에 따라 사용자 지정합니다.

------
#### [ Stored template code example ]

   이전 단계인 *MyTemplate*에서 생성한 템플릿은 `TemplateName` 파라미터의 값으로 참조됩니다.

   ```
   {
       "FromEmailAddress": "Mary Major <mary.major@example.com>",
       "DefaultContent": {
           "Template": {
               "TemplateName": "MyTemplate",
               "TemplateData": "{ \"name\":\"friend\", \"favoriteanimal\":\"unknown\" }"
           }
       },
       "BulkEmailEntries": [
           {
               "Destination": {
                   "ToAddresses": [
                       "anaya.iyengar@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Anaya\", \"favoriteanimal\":\"angelfish\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "liu.jie@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Liu\", \"favoriteanimal\":\"lion\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "shirley.rodriguez@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Shirley\", \"favoriteanimal\":\"shark\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "richard.roe@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{}"
                   }
               }
           }
       ],
       "ConfigurationSetName": "ConfigSet"
   }
   ```

   이 코드는 다음 속성을 포함하고 있습니다.
   + **FromEmailAddress** - 발신자의 이메일 주소입니다.
   + **DefaultContent** - `TemplateName` 및 `TemplateData` 객체를 포함하는 JSON 객체입니다.
   + **TemplateName** – 이메일에 적용할 `Template` 리소스의 이름입니다.
   + **TemplateData** - `ReplacementEmailContent` 객체의 `ReplacementTemplateData` 속성에 빈 JSON 객체(`{}`)가 포함된 경우 사용할 키-값 페어를 포함합니다.
   + **BulkEmailEntries** - 하나 이상의 `Destination` 객체를 포함하는 배열입니다.
   + **대상** - *ToAddresses*, *CcAddresses* 및 *BccAddresses* 속성에 정의된 이메일 수신자가 포함된 객체입니다. 이러한 주소는 모든 조합으로 사용할 수 있으며 동일한 이메일을 수신할 하나 이상의 이메일 주소를 포함할 수 있습니다.
   + **ReplacementTemplateData** – 키-값 페어를 포함하는 이스케이프된 JSON 문자열입니다. 키는 템플릿의 변수에 해당합니다(예: `{{name}}`). 값은 이메일의 변수를 대체하는 콘텐츠를 나타냅니다. (여기서 JSON 문자열이 비어 있는 경우(`{}`) `DefaultContent` 객체 내의 `TemplateData` 속성에 정의된 키-값 페어가 사용됩니다.)
   + **ConfigurationSetName** – 이메일 전송 시 사용할 구성 세트의 이름입니다.
**참고**  
렌더링 오류 이벤트를 Amazon SNS에 게시하도록 구성된 구성 세트를 사용하는 것이 좋습니다. 자세한 내용은 [(선택 사항) 1부: 렌더링 오류 이벤트 알림 설정](#send-personalized-email-set-up-notifications) 단원을 참조하십시오.

------
#### [ Inline template code example ]

   `TemplateContent` 속성(일반적으로 *저장된 템플릿*에 정의됨)은 이를 *인라인* 템플릿으로 만드는 `TemplateData` 속성과 함께 *인라인*으로 정의됩니다.

   ```
   {
       "FromEmailAddress": "Mary Major <mary.major@example.com>",
       "DefaultContent": {
           "Template": {
               "TemplateContent": {
                   "Subject": "Greetings, {{name}}!",
                   "Text": "Dear {{name}},\r\nYour favorite animal is {{favoriteanimal}}.",
                   "Html": "<h1>Hello {{name}},</h1><p>Your favorite animal is {{favoriteanimal}}.</p>"
               },
               "TemplateData": "{ \"name\":\"friend\", \"favoriteanimal\":\"unknown\" }"
           }
       },
       "BulkEmailEntries": [
           {
               "Destination": {
                   "ToAddresses": [
                       "anaya.iyengar@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Anaya\", \"favoriteanimal\":\"angelfish\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "liu.jie@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Liu\", \"favoriteanimal\":\"lion\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "shirley.rodriguez@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{ \"name\":\"Shirley\", \"favoriteanimal\":\"shark\" }"
                   }
               }
           },
           {
               "Destination": {
                   "ToAddresses": [
                       "richard.roe@example.com"
                   ]
               },
               "ReplacementEmailContent": {
                   "ReplacementTemplate": {
                       "ReplacementTemplateData": "{}"
                   }
               }
           }
       ],
       "ConfigurationSetName": "ConfigSet"
   }
   ```

   이 코드는 다음 속성을 포함하고 있습니다.
   + **FromEmailAddress** - 발신자의 이메일 주소입니다.
   + **DefaultContent** - `TemplateContent` 및 `TemplateData` 객체를 포함하는 JSON 객체입니다.
   + **TemplateContent** - 다음 속성을 위한 컨테이너입니다.
     + **제목** - 이메일의 제목입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이 태그는 `{{tagname}}` 형식을 사용합니다. 이메일을 보낼 때 각 대상에 대해 `tagname`의 값을 지정할 수 있습니다.
     + **Html** – 이메일의 HTML 본문입니다. 이 속성에는 대체 태그가 포함될 수 있습니다. 이전 예에는 `{{name}}` 및 `{{favoriteanimal}}`이라는 두 가지 태그가 포함됩니다.
     + **Text** – 이메일의 텍스트 본문입니다. 이메일 클라이언트가 HTML 콘텐츠를 표시하지 않는 수신자는 이 이메일 버전을 볼 수 있습니다. 이 속성에는 대체 태그도 포함될 수 있습니다.
   + **TemplateData** - `ReplacementEmailContent` 객체의 `ReplacementTemplateData` 속성에 빈 JSON 객체(`{}`)가 포함된 경우 사용할 키-값 페어를 포함합니다.
   + **BulkEmailEntries** - 하나 이상의 `Destination` 객체를 포함하는 배열입니다.
   + **대상** - *ToAddresses*, *CcAddresses* 및 *BccAddresses* 속성에 정의된 이메일 수신자가 포함된 객체입니다. 이러한 주소는 모든 조합으로 사용할 수 있으며 동일한 이메일을 수신할 하나 이상의 이메일 주소를 포함할 수 있습니다.
   + **ReplacementTemplateData** – 키-값 페어를 포함하는 이스케이프된 JSON 문자열입니다. 키는 `{{name}}`과 같이 이 파일의 `TemplateContent` 속성에 정의된 변수에 해당합니다. 값은 이메일의 변수를 대체하는 콘텐츠를 나타냅니다. (여기서 JSON 문자열이 비어 있는 경우(`{}`) `DefaultContent` 객체 내의 `TemplateData` 속성에 정의된 키-값 페어가 사용됩니다.)
   + **ConfigurationSetName** – 이메일 전송 시 사용할 구성 세트의 이름입니다.
**참고**  
렌더링 오류 이벤트를 Amazon SNS에 게시하도록 구성된 구성 세트를 사용하는 것이 좋습니다. 자세한 내용은 [(선택 사항) 1부: 렌더링 오류 이벤트 알림 설정](#send-personalized-email-set-up-notifications) 단원을 참조하십시오.

------

1. 이전 단계의 코드의 값을 변경하여 사용자의 요구 사항을 충족시킨 다음 *mybulkemail.json* 파일로 저장합니다.

1. 명령줄에 v2 API 명령을 입력하여 대량 이메일을 보냅니다.

   ```
   aws sesv2 send-bulk-email --cli-input-json file://mybulkemail.json
   ```

# 고급 이메일 맞춤 설정
<a name="send-personalized-email-advanced"></a>

 *저장된 템플릿*을 사용하는 경우, 즉 SES v2 API와 함께 `CreateEmailTemplate` 작업을 사용하여 Amazon SES에서 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html) 리소스를 생성한 경우, 핸들바 시스템을 활용하여 중첩 속성, 배열 반복, 기본 조건문, 인라인 부분 생성과 같은 고급 기능을 포함하는 템플릿을 생성할 수 있습니다. 이 섹션에서는 이러한 기능의 예를 제공합니다.

Handlebars에는 이 섹션에 설명되어 있는 기능 외의 추가 기능이 포함됩니다. 자세한 내용은 [handlebarsjs.com](http://handlebarsjs.com)에서 [Built-In Helpers](https://handlebarsjs.com/guide/builtin-helpers.html)를 참조하세요.

**참고**  
SES는 메시지의 HTML 템플릿을 렌더링할 때 HTML 콘텐츠를 이스케이프하지 않습니다. 즉, 연락처 양식과 같이 사용자 입력 데이터를 포함하는 경우 클라이언트 측에서 이스케이프해야 합니다.

**Topics**
+ [중첩 속성 분석](#send-personalized-email-advanced-nested)
+ [목록 살펴보기](#send-personalized-email-advanced-iterating)
+ [기본 조건문 사용](#send-personalized-email-advanced-conditionals)
+ [인라인 부분 생성](#send-personalized-email-advanced-inline-partials)

## 중첩 속성 분석
<a name="send-personalized-email-advanced-nested"></a>

Handlebars에는 복잡한 고객 데이터를 쉽게 구성할 수 있는 중첩 경로 지원이 포함되고 이메일 템플릿의 그 데이터를 참조합니다.

예를 들어 수신자 데이터를 여러 일반 범주로 조직할 수 있습니다. 각 범주 내에 세부 정보를 포함할 수 있습니다. 다음 코드 예에는 단일 수신자에 대한 이 구조의 예가 나옵니다.

```
{
  "meta":{
    "userId":"51806220607"
  },
  "contact":{
    "firstName":"Anaya",
    "lastName":"Iyengar",
    "city":"Bengaluru",
    "country":"India",
    "postalCode":"560052"
  },
  "subscription":[
    {
      "interest":"Sports"
    },
    {
      "interest":"Travel"
    },
    {
      "interest":"Cooking"
    }
  ]
}
```

이메일 템플릿에서 상위 속성의 이름 뒤에 마침표(.)와 값을 포함할 속성의 이름을 제공하여 중첩 속성을 참조할 수 있습니다. 예를 들어 앞의 예에 표시된 데이터 구조를 사용하고 이메일 템플릿에 각 수신자의 이름을 포함하려는 경우 이메일 템플릿에 `Hello {{contact.firstName}}!` 텍스트를 포함합니다.

Handlebars는 여러 수준 깊이로 중첩된 경로를 구문 분석할 수 있기 때문에 유연하게 템플릿 데이터를 구성할 수 있습니다.

## 목록 살펴보기
<a name="send-personalized-email-advanced-iterating"></a>

`each` 보조 도구 함수는 어레이로 항목을 살펴봅니다. 다음 코드는 `each` 헬퍼 함수를 사용하여 항목화된 각 수신자의 관심사 목록을 생성하는 이메일 템플릿의 예입니다.

```
{
  "Template": {
    "TemplateName": "Preferences",
    "SubjectPart": "Subscription Preferences for {{contact.firstName}} {{contact.lastName}}",
    "HtmlPart": "<h1>Your Preferences</h1>
                 <p>You have indicated that you are interested in receiving 
                   information about the following subjects:</p>
                 <ul>
                   {{#each subscription}}
                     <li>{{interest}}</li>
                   {{/each}}
                 </ul>
                 <p>You can change these settings at any time by visiting 
                    the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                    Preference Center</a>.</p>",
    "TextPart": "Your Preferences\n\nYou have indicated that you are interested in 
                 receiving information about the following subjects:\n
                 {{#each subscription}}
                   - {{interest}}\n
                 {{/each}}
                 \nYou can change these settings at any time by 
                 visiting the Preference Center at 
                 https://www.example.com/prefererences/i.aspx?id={{meta.userId}}"
  }
}
```

**중요**  
앞의 코드 예에는 예를 이해하기 쉽도록 `HtmlPart` 및 `TextPart` 속성의 값에 줄 바꿈이 포함되어 있습니다. 템플릿의 JSON 파일에는 이러한 값 내에 줄바꿈이 포함될 수 없습니다. 이 예를 복사하여 자체 JSON 파일에 붙여 넣으면 진행하기 전에 `HtmlPart` 및 `TextPart` 섹션에서 줄 바꿈 및 추가 공백을 제거합니다.

템플릿을 생성한 후 `SendEmail` 또는 `SendBulkEmail` 작업을 사용하여 수신자에게 이 템플릿으로 이메일을 보낼 수 있습니다. 각 수신자가 `Interests` 객체에 최소 하나의 값이 있는 한 항목화된 관심사 목록이 포함되는 이메일을 수신합니다. 다음 예는 앞의 템플릿을 사용하여 여러 수신자에게 이메일을 보내는 데 사용할 수 있는 JSON 템플릿을 보여 줍니다.

```
{
  "Source":"Sender Name <sender@example.com>",
  "Template":"Preferences",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
          "anaya.iyengar@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"51806220607\"},\"contact\":{\"firstName\":\"Anaya\",\"lastName\":\"Iyengar\"},\"subscription\":[{\"interest\":\"Sports\"},{\"interest\":\"Travel\"},{\"interest\":\"Cooking\"}]}"
      },
    {
      "Destination":{ 
        "ToAddresses":[
          "shirley.rodriguez@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"1981624758263\"},\"contact\":{\"firstName\":\"Shirley\",\"lastName\":\"Rodriguez\"},\"subscription\":[{\"interest\":\"Technology\"},{\"interest\":\"Politics\"}]}"
    }
  ],
  "DefaultTemplateData":"{\"meta\":{\"userId\":\"\"},\"contact\":{\"firstName\":\"Friend\",\"lastName\":\"\"},\"subscription\":[]}"
}
```

`SendBulkEmail` 작업을 사용하여 앞의 예에 나열된 수신자에게 이메일을 보내면 다음 이미지에 표시된 예와 같은 메시지를 수신합니다.

![\[Preferences notification listing Sports, Travel, and Cooking as selected interests.\]](http://docs.aws.amazon.com/ko_kr/ses/latest/dg/images/send-personalized-email-advanced-condition-interest.png)


## 기본 조건문 사용
<a name="send-personalized-email-advanced-conditionals"></a>

이 섹션은 이전 섹션에서 설명한 예를 기반으로 합니다. 이전 섹션의 예는 `each` 보조 도구를 사용하여 관심사 목록을 살펴봅니다. 하지만 관심사가 지정되지 않은 수신자는 빈 목록이 포함된 이메일을 수신합니다. `{{if}}` 보조 도구를 사용하면 특정 속성이 템플릿 데이터에 있는 경우 이메일의 형식을 다르게 할 수 있습니다. 다음 코드는 `Subscription` 어레이에 값이 포함되는 경우 `{{if}}` 보조 도구를 사용하여 앞 섹션의 글머리표 목록을 표시합니다. 어레이가 비어 있으면 다른 텍스트 블록이 표시됩니다.

```
{
  "Template": {
    "TemplateName": "Preferences2",
    "SubjectPart": "Subscription Preferences for {{contact.firstName}} {{contact.lastName}}",
    "HtmlPart": "<h1>Your Preferences</h1>
                 <p>Dear {{contact.firstName}},</p>
                 {{#if subscription}}
                   <p>You have indicated that you are interested in receiving 
                     information about the following subjects:</p>
                     <ul>
                     {{#each subscription}}
                       <li>{{interest}}</li>
                     {{/each}}
                     </ul>
                     <p>You can change these settings at any time by visiting 
                       the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                       Preference Center</a>.</p>
                 {{else}}
                   <p>Please update your subscription preferences by visiting 
                     the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                     Preference Center</a>.
                 {{/if}}",
    "TextPart": "Your Preferences\n\nDear {{contact.firstName}},\n\n
                 {{#if subscription}}
                   You have indicated that you are interested in receiving 
                   information about the following subjects:\n
                   {{#each subscription}}
                     - {{interest}}\n
                   {{/each}}
                   \nYou can change these settings at any time by visiting the 
                   Preference Center at https://www.example.com/prefererences/i.aspx?id={{meta.userId}}.
                 {{else}}
                   Please update your subscription preferences by visiting the 
                   Preference Center at https://www.example.com/prefererences/i.aspx?id={{meta.userId}}.
                 {{/if}}"
  }
}
```

**중요**  
앞의 코드 예에는 예를 이해하기 쉽도록 `HtmlPart` 및 `TextPart` 속성의 값에 줄 바꿈이 포함되어 있습니다. 템플릿의 JSON 파일에는 이러한 값 내에 줄바꿈이 포함될 수 없습니다. 이 예를 복사하여 자체 JSON 파일에 붙여 넣으면 진행하기 전에 `HtmlPart` 및 `TextPart` 섹션에서 줄 바꿈 및 추가 공백을 제거합니다.

다음 예는 앞의 템플릿을 사용하여 여러 수신자에게 이메일을 보내는 데 사용할 수 있는 JSON 템플릿을 보여 줍니다.

```
{
  "Source":"Sender Name <sender@example.com>",
  "Template":"Preferences2",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
          "anaya.iyengar@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"51806220607\"},\"contact\":{\"firstName\":\"Anaya\",\"lastName\":\"Iyengar\"},\"subscription\":[{\"interest\":\"Sports\"},{\"interest\":\"Cooking\"}]}"
      },
    {
      "Destination":{ 
        "ToAddresses":[
          "shirley.rodriguez@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"1981624758263\"},\"contact\":{\"firstName\":\"Shirley\",\"lastName\":\"Rodriguez\"}}"
    }
  ],
  "DefaultTemplateData":"{\"meta\":{\"userId\":\"\"},\"contact\":{\"firstName\":\"Friend\",\"lastName\":\"\"},\"subscription\":[]}"
}
```

이 예에서는 템플릿 데이터에 관심사 목록이 포함된 수신자가 이전 섹션에 표시된 예와 같은 이메일을 수신합니다. 하지만 템플릿 데이터에 관심사가 포함되지 않은 수신자는 다음 이미지에 표시된 예와 같은 이메일을 수신합니다.

![\[Email message with header "Your Preferences" and text about updating subscription preferences.\]](http://docs.aws.amazon.com/ko_kr/ses/latest/dg/images/send-personalized-email-advanced-condition-nointerest.png)


## 인라인 부분 생성
<a name="send-personalized-email-advanced-inline-partials"></a>

인라인 부분을 사용하여 반복된 문자열이 포함된 템플릿을 간소화할 수 있습니다. 예를 들어 사용 가능한 경우 템플릿의 첫 부분에 다음 코드를 추가하여 수신자의 이름 및 사용 가능한 경우 성이 포함된 인라인 부분을 만들 수 있습니다.

```
{{#* inline \"fullName\"}}{{firstName}}{{#if lastName}} {{lastName}}{{/if}}{{/inline}}\n
```

**참고**  
줄바꿈 문서(`\n`)는 템플릿의 콘텐츠에서 `{{inline}}` 블록을 분리하는 데 필요합니다. 줄바꿈은 최종 출력에 렌더링되지 않습니다.

`fullName` 부분을 생성한 후 `{{> fullName}}`의 예와 같이 부분의 이름 앞에 이상(>) 기호를 표시하고 공백을 표시하여 템플릿의 어느 부분에든 포함할 수 있습니다. 인라인 부분은 이메일 부분 사이에 전송되지 않습니다. 예를 들어 이메일의 HTML과 텍스트 버전 모두에 동일한 인라인 부분을 사용하려는 경우 `HtmlPart` 및 `TextPart` 섹션 모두에서 정의해야 합니다.

어레이를 통해 살펴보는 경우 인라인 부분을 사용할 수도 있습니다. 다음 코드를 사용하여 `fullName` 인라인 부분을 사용한 템플릿을 생성할 수 있습니다. 이 예에서는 인라인 부분이 수신자의 이름과 다른 이름의 어레이 모두에 적용됩니다.

```
{
  "Template": {
    "TemplateName": "Preferences3",
    "SubjectPart": "{{firstName}}'s Subscription Preferences",
    "HtmlPart": "{{#* inline \"fullName\"}}
                   {{firstName}}{{#if lastName}} {{lastName}}{{/if}}
                 {{/inline~}}\n
                 <h1>Hello {{> fullName}}!</h1>
                 <p>You have listed the following people as your friends:</p>
                 <ul>
                 {{#each friends}}
                   <li>{{> fullName}}</li>
                 {{/each}}</ul>",
    "TextPart": "{{#* inline \"fullName\"}}
                   {{firstName}}{{#if lastName}} {{lastName}}{{/if}}
                 {{/inline~}}\n
                 Hello {{> fullName}}! You have listed the following people 
                 as your friends:\n
                 {{#each friends}}
                   - {{> fullName}}\n
                 {{/each}}"
  }
}
```

**중요**  
앞의 코드 예에는 예를 이해하기 쉽도록 `HtmlPart` 및 `TextPart` 속성의 값에 줄 바꿈이 포함되어 있습니다. 템플릿의 JSON 파일에는 이러한 값 내에 줄바꿈이 포함될 수 없습니다. 이 예를 복사하여 자체 JSON 파일에 붙여 넣으면 진행하기 전에 이 섹션들에서 줄 바꿈 및 추가 공백을 제거합니다.

# 이메일 템플릿 관리
<a name="send-personalized-email-manage-templates"></a>

[이메일 템플릿 만들기](send-personalized-email-api.md) 외에도 Amazon SES v2 API를 사용하여 기존 템플릿을 업데이트 또는 삭제하거나, 기존 템플릿을 모두 나열하거나, 템플릿의 내용을 볼 수도 있습니다.

이 단원에는 AWS CLI 를 사용하여 SES 템플릿과 관련된 작업을 수행하는 절차가 포함되어 있습니다.

**참고**  
이 섹션의 절차는 또한 AWS CLI을(를) 이미 설치하여 구성한 상태를 전제로 설명합니다. 설치 및 구성에 대한 자세한 내용은 [AWS Command Line Interface 사용 설명서를](https://docs.aws.amazon.com/cli/latest/userguide/) AWS CLI참조하세요.

## 이메일 템플릿 목록 보기
<a name="send-personalized-email-manage-templates-list"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_ListEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_ListEmailTemplate.html) SES v2 API 작업을 사용하여 기존의 모든 이메일 템플릿 목록을 볼 수 있습니다.

**이메일 템플릿 목록을 보려면**
+ 명령줄에 다음 명령을 입력합니다.

  ```
  aws sesv2 list-email-templates
  ```

  현재 리전의 SES 계정에 기존 이메일 템플릿이 있는 경우 이 명령은 다음 예제와 유사한 응답을 반환합니다.

  ```
  {
      "TemplatesMetadata": [
          {
              "Name": "SpecialOffers",
              "CreatedTimestamp": "2020-08-05T16:04:12.640Z"
          },
          {
              "Name": "NewsAndUpdates",
              "CreatedTimestamp": "2019-10-03T20:03:34.574Z"
          }
      ]
  }
  ```

  템플릿을 생성하지 않았으면 명령은 멤버 없이 `TemplatesMetadata` 객체를 반환합니다.

## 특정 이메일 템플릿의 내용 보기
<a name="send-personalized-email-manage-templates-get"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_GetEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_GetEmailTemplate.html) SES v2 API 작업을 사용하여 특정 이메일 템플릿의 내용을 볼 수 있습니다.

**이메일 템플릿의 내용 보기**
+ 명령줄에 다음 명령을 입력합니다.

  ```
  aws sesv2 get-email-template --template-name MyTemplate
  ```

  위의 명령에서 *MyTemplate*을 보려는 템플릿의 이름으로 바꿉니다.

  제공한 템플릿 이름이 SES 계정에 있는 템플릿과 일치하는 경우 이 명령은 다음 예와 유사한 응답을 반환합니다.

  ```
  {
      "Template": {
          "TemplateName": "TestMessage",
          "SubjectPart": "Amazon SES Test Message",
          "TextPart": "Hello! This is the text part of the message.",
          "HtmlPart": "<html>\n<body>\n<h2>Hello!</h2>\n<p>This is the HTML part of the message.</p></body>\n</html>"
      }
  }
  ```

  제공한 템플릿 이름이 SES 계정에 있는 템플릿과 일치하지 않는 경우 이 명령은 `NotFoundException` 오류를 반환합니다.

## 이메일 템플릿 삭제
<a name="send-personalized-email-manage-templates-delete"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_DeleteEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_DeleteEmailTemplate.html) SES v2 API 작업을 사용하여 특정 이메일 템플릿을 삭제할 수 있습니다.

**이메일 템플릿을 삭제하려면**
+ 명령줄에 다음 명령을 입력합니다.

  ```
  aws sesv2 delete-email-template --template-name MyTemplate
  ```

  위의 명령에서 *MyTemplate*을 삭제하려는 템플릿의 이름으로 바꿉니다.

  이 명령은 출력을 제공하지 않습니다. [GetTemplate](#send-personalized-email-manage-templates-get)작업을 사용하여 템플릿이 삭제되었는지 확인할 수 있습니다.

## 이메일 템플릿 업데이트
<a name="send-personalized-email-manage-templates-update"></a>

[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_UpdateEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_UpdateEmailTemplate.html) SES v2 API 작업을 사용하여 기존 이메일 템플릿을 업데이트할 수 있습니다. 예를 들어 이 작업은 이메일 서식 파일의 제목 줄을 변경하려는 경우 또는 메시지 본문을 수정해야 하는 경우에 유용합니다.

**이메일 템플릿을 업데이트하려면**

1. `GetEmailTemplate` 명령을 사용하여 명령줄에 다음 명령을 입력하여 기존 템플릿을 검색할 수 있습니다.

   ```
   aws sesv2 get-email-template --template-name MyTemplate
   ```

   위의 명령에서 *MyTemplate*을 업데이트하려는 템플릿의 이름으로 바꿉니다.

   제공한 템플릿 이름이 SES 계정에 있는 템플릿과 일치하는 경우 이 명령은 다음 예와 유사한 응답을 반환합니다.

   ```
   {
       "Template": {
           "TemplateName": "TestMessage",
           "SubjectPart": "Amazon SES Test Message",
           "TextPart": "Hello! This is the text part of the message.",
           "HtmlPart": "<html>\n<body>\n<h2>Hello!</h2>\n<p>This is the HTML part of the message.</p></body>\n</html>"
       }
   }
   ```

1. 텍스트 편집기에서 새로운 파일을 생성합니다. 이전 명령의 출력을 파일에 붙여 넣습니다.

1. 필요에 따라 템플릿을 수정합니다. 생략하는 모든 줄은 템플릿에서 제거됩니다. 예를 들어, 단지 템플릿의 `SubjectPart`을(를) 변경하려는 경우 여전히 `TextPart` 및 `HtmlPart` 속성을 포함해야 합니다.

   작업을 마치면 파일 이름을 `update_template.json`(으)로 저장합니다.

1. 명령줄에 다음 명령을 입력합니다.

   ```
   aws sesv2 update-email-template --cli-input-json file://path/to/update_template.json
   ```

   위의 명령에서 *path/to/update\$1template.json*을 이전 단계에서 생성한 `update_template.json` 파일의 경로로 바꿉니다.

   템플릿이 성공적으로 업데이트되면 이 명령은 출력을 제공하지 않습니다. [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_GetEmailTemplate.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_GetEmailTemplate.html) 작업을 사용하여 템플릿이 업데이트되었는지 확인할 수 있습니다.

   지정한 템플릿이 존재하지 않는 경우 이 명령은 `TemplateDoesNotExist` 오류를 반환합니다. 템플릿이 `TextPart` 또는 `HtmlPart` 속성(또는 둘 다)를 포함하지 않는 경우 이 명령은 `InvalidParameterValue` 오류를 반환합니다.

# AWS SDK를 사용하여 Amazon SES를 통해 이메일 전송
<a name="send-an-email-using-sdk-programmatically"></a>

 AWS SDK를 사용하여 Amazon SES를 통해 이메일을 보낼 수 있습니다. 여러 프로그래밍 언어에서 AWS SDKs 사용할 수 있습니다. 자세한 내용은 [Amazon Web Services용 도구](https://aws.amazon.com/tools/#sdk)를 참조하세요.

## 사전 조건
<a name="send-an-email-using-sdk-programmatically-prereqs"></a>

다음 섹션의 코드 샘플을 완료하려면 다음 필수 구성 요소를 완료해야 합니다.
+ 아직 하지 않았다면, [Amazon Simple Email Service 설정](setting-up.md)의 작업을 완료합니다.
+ **Amazon SES에서 이메일 주소 확인**—Amazon SES에서 이메일을 보내기 전에 발신자 이메일 주소의 소유자인지 확인해야 합니다. 사용자 계정이 아직 Amazon SES 샌드박스 환경에 있는 경우 수신자 이메일 주소도 확인해야 합니다. Amazon SES 콘솔을 사용하여 이메일 주소를 확인하는 것이 좋습니다. 자세한 내용은 [이메일 주소 자격 증명 생성](creating-identities.md#verify-email-addresses-procedure) 단원을 참조하십시오.
+ 자격 ** AWS 증명 가져오기** - SDK를 사용하여 Amazon SES에 액세스하려면 AWS 액세스 키 ID와 AWS 보안 액세스 키가 필요합니다. AWS Management Console의 [보안 자격 증명](https://console.aws.amazon.com/iam/home?#security_credential) 페이지를 사용하여 자격 증명을 찾을 수 있습니다. 자격 증명에 대한 자세한 내용은 [Amazon SES 자격 증명 유형](send-email-concepts-credentials.md) 단원을 참조하세요.
+ **공유 자격 증명 파일 생성**—이 단원의 샘플 코드가 올바로 실행되기 위해서는 공유 자격 증명 파일을 생성해야 합니다. 자세한 내용은 [AWS SDK를 사용하여 Amazon SES를 통해 이메일을 보낼 때 사용할 공유 자격 증명 파일 생성](create-shared-credentials-file.md) 단원을 참조하십시오.

## 코드 예제
<a name="send-an-email-using-sdk-programmatically-examples"></a>

**중요**  
다음 자습서에서는 수신 여부를 확인할 수 있도록 자신에게 이메일을 발송합니다. 추가적인 실험 또는 로드 테스트는 Amazon SES 메일박스 시뮬레이터를 사용하세요. 메일박스 시뮬레이터로 전송되는 이메일은 전송 할당량이나 반송 메일 및 수신 거부 발생률에 포함되지 않습니다. 자세한 내용은 [수동으로 메일박스 시뮬레이터 사용](send-an-email-from-console.md#send-email-simulator) 단원을 참조하십시오.

**Topics**

------
#### [ .NET ]

다음 절차에서는 [Visual Studio](https://www.visualstudio.com/) 및 AWS SDK for .NET를 사용하여 Amazon SES를 통해 이메일을 보내는 방법을 보여줍니다.

이 솔루션은 다음 구성 요소를 사용하여 테스트되었습니다.
+ Microsoft Visual Studio Community 2017, 버전 15.4.0
+ Microsoft .NET Framework 버전 4.6.1
+ NuGet을 사용하여 설치된 AWSSDK.Core 패키지(버전 3.3.19)
+ NuGet을 사용하여 설치된 AWSSDK.SimpleEmail 패키지(버전 3.3.6.1)

**시작하기 전에 다음 작업을 수행하세요.**
+ **Visual Studio 설치** - Visual Studio는 [https://www.visualstudio.com/](https://www.visualstudio.com/)에서 사용할 수 있습니다.

**를 사용하여 이메일을 보내려면 AWS SDK for .NET**

1. 다음 단계에 따라 새 프로젝트를 만듭니다.

   1. Visual Studio를 시작합니다.

   1. **File** 메뉴에서 **New**와 **Project**를 차례대로 선택합니다.

   1. [**New Project**] 창의 왼쪽 패널에서 [**Installed**]를 확장한 후 [**Visual C\$1**]을 확장합니다.

   1. 오른쪽 패널에서 [**Console App (.NET Framework)**]을 선택합니다.

   1. **이름**에 **AmazonSESSample**을 입력한 다음 **확인**을 선택합니다.

1. NuGet을 사용해 다음 단계를 완료하여 솔루션에 Amazon SES 패키지를 포함시킵니다.

   1. [**Solution Explorer**] 창에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음 [**Manage NuGet Packages**]를 선택합니다.

   1. [**NuGet: AmazonSESSample**] 탭에서 [**Browse**]를 선택합니다.

   1. 검색 상자에 **AWSSDK.SimpleEmail**를 입력합니다.

   1. [**AWSSDK.SimpleEmail**] 패키지를 선택한 다음 [**Install**]을 선택합니다.

   1. [**Preview Changes**] 창에서 [**OK**]를 선택합니다.

1. [**Program.cs**] 탭에서 다음 코드를 붙여넣습니다.

   ```
    1. using Amazon;
    2. using System;
    3. using System.Collections.Generic;
    4. using Amazon.SimpleEmail;
    5. using Amazon.SimpleEmail.Model;
    6. 
    7. namespace AmazonSESSample 
    8. {
    9.     class Program
   10.     {
   11.         // Replace sender@example.com with your "From" address.
   12.         // This address must be verified with Amazon SES.
   13.         static readonly string senderAddress = "sender@example.com";
   14. 
   15.         // Replace recipient@example.com with a "To" address. If your account
   16.         // is still in the sandbox, this address must be verified.
   17.         static readonly string receiverAddress = "recipient@example.com";
   18. 
   19.         // The configuration set to use for this email. If you do not want to use a
   20.         // configuration set, comment out the following property and the
   21.         // ConfigurationSetName = configSet argument below. 
   22.         static readonly string configSet = "ConfigSet";
   23. 
   24.         // The subject line for the email.
   25.         static readonly string subject = "Amazon SES test (AWS SDK for .NET)";
   26. 
   27.         // The email body for recipients with non-HTML email clients.
   28.         static readonly string textBody = "Amazon SES Test (.NET)\r\n" 
   29.                                         + "This email was sent through Amazon SES "
   30.                                         + "using the AWS SDK for .NET.";
   31.         
   32.         // The HTML body of the email.
   33.         static readonly string htmlBody = @"<html>
   34. <head></head>
   35. <body>
   36.   <h1>Amazon SES Test (SDK for .NET)</h1>
   37.   <p>This email was sent with
   38.     <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
   39.     <a href='https://aws.amazon.com/sdk-for-net/'> AWS SDK for .NET</a>.</p>
   40. </body>
   41. </html>";
   42. 
   43.         static void Main(string[] args)
   44.         {
   45.             // Replace USWest2 with the AWS Region you're using for Amazon SES.
   46.             // Acceptable values are EUWest1, USEast1, and USWest2.
   47.             using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2))
   48.             {
   49.                 var sendRequest = new SendEmailRequest
   50.                 {
   51.                     Source = senderAddress,
   52.                     Destination = new Destination
   53.                     {
   54.                         ToAddresses =
   55.                         new List<string> { receiverAddress }
   56.                     },
   57.                     Message = new Message
   58.                     {
   59.                         Subject = new Content(subject),
   60.                         Body = new Body
   61.                         {
   62.                             Html = new Content
   63.                             {
   64.                                 Charset = "UTF-8",
   65.                                 Data = htmlBody
   66.                             },
   67.                             Text = new Content
   68.                             {
   69.                                 Charset = "UTF-8",
   70.                                 Data = textBody
   71.                             }
   72.                         }
   73.                     },
   74.                     // If you are not using a configuration set, comment
   75.                     // or remove the following line 
   76.                     ConfigurationSetName = configSet
   77.                 };
   78.                 try
   79.                 {
   80.                     Console.WriteLine("Sending email using Amazon SES...");
   81.                     var response = client.SendEmail(sendRequest);
   82.                     Console.WriteLine("The email was sent successfully.");
   83.                 }
   84.                 catch (Exception ex)
   85.                 {
   86.                     Console.WriteLine("The email was not sent.");
   87.                     Console.WriteLine("Error message: " + ex.Message);
   88. 
   89.                 }
   90.             }
   91. 
   92.             Console.Write("Press any key to continue...");
   93.             Console.ReadKey();
   94.         }
   95.     }
   96. }
   ```

1. 코드 편집기에서 다음을 수행합니다.
   + *sender@example.com*을 "From:"의 이메일 주소로 바꿉니다. 이 주소가 확인되어야 합니다. 자세한 내용은 [Amazon SES에서 확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하세요.
   + *recipient@example.com*을 "To:"의 주소로 바꿉니다. 계정이 아직 샌드박스 환경에 있을 경우 이 주소도 확인해야 합니다.
   + *ConfigSet*을 이 이메일을 전송할 때 사용하는 구성 세트의 이름으로 바꿉니다.
   + *USWest2*를 Amazon SES를 사용하여 이메일을 보내는 데 사용하는 AWS 리전 엔드포인트의 이름으로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

   완료되면 `Program.cs`를 저장합니다.

1. 다음 단계를 완료하여 애플리케이션을 빌드 및 실행합니다.

   1. [**Build**] 메뉴에서 [**Build Solution**]을 선택합니다.

   1. [**Debug**] 메뉴에서 [**Start Debugging**]을 선택합니다. 콘솔 창이 나타납니다.

1. 콘솔 출력을 확인합니다. 이메일이 성공적으로 전송되었으면 콘솔에 "`The email was sent successfully.`"가 표시됩니다.

1. 이메일이 성공적으로 전송되었으면 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------
#### [ Java ]

다음 절차에서는 [Java EE Developers용 Eclipse IDE 및 ](http://www.eclipse.org/)[AWS Toolkit for Eclipse](https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/welcome.html)를 사용하여 AWS SDK 프로젝트를 생성하고 Java 코드를 수정하여 Amazon SES를 통해 이메일을 보내는 방법을 보여줍니다.

**시작하기 전에 다음 작업을 수행하세요.**
+ **Eclipse 설치** - Eclipse는 [https://www.eclipse.org/downloads](https://www.eclipse.org/downloads)에서 다운로드할 수 있습니다. 이 자습서의 코드는 Eclipse Neon.3(버전 4.6.3)에서 Java Runtime Environment 버전 1.8을 실행하여 테스트하였습니다.
+ **설치 AWS Toolkit for Eclipse**- Eclipse 설치에 AWS Toolkit for Eclipse 를 추가하는 지침은 [https://aws.amazon.com/eclipse](https://aws.amazon.com/eclipse) 확인할 수 있습니다. 이 자습서의 코드는 AWS Toolkit for Eclipse버전 2.3.1을 사용하여 테스트하였습니다.

**를 사용하여 이메일을 보내려면 AWS SDK for Java**

1. 다음 단계를 수행하여 Eclipse에서 AWS Java 프로젝트를 생성합니다.

   1. Eclipse를 시작합니다.

   1. [**File**] 메뉴에서 [**New**]와 [**Other**]를 차례대로 선택합니다. **새** 창에서 **AWS** 폴더를 확장하여 **AWS Java Project(Java 프로젝트)**를 선택합니다.

   1. **새 AWS Java 프로젝트** 대화 상자에서 다음을 수행합니다.

      1. [**Project name**]에 프로젝트 이름을 입력합니다.

      1. **AWS SDK for Java 샘플** 아래에서 **Amazon Simple Email Service JavaMail 샘플**을 선택합니다.

      1. **마침**을 클릭합니다.

1. Eclipse에서 [**Package Explorer**] 창에서 프로젝트를 확장합니다.

1. 프로젝트 아래에서 `src/main/java` 폴더와 `com.amazon.aws.samples` 폴더를 차례대로 확장한 후 `AmazonSESSample.java`를 두 번 클릭합니다.

1. `AmazonSESSample.java`의 전체 내용을 다음 코드로 바꿉니다.

   ```
    1. package com.amazonaws.samples;
    2. 
    3. import java.io.IOException;
    4. 
    5. import com.amazonaws.regions.Regions;
    6. import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
    7. import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
    8. import com.amazonaws.services.simpleemail.model.Body;
    9. import com.amazonaws.services.simpleemail.model.Content;
   10. import com.amazonaws.services.simpleemail.model.Destination;
   11. import com.amazonaws.services.simpleemail.model.Message;
   12. import com.amazonaws.services.simpleemail.model.SendEmailRequest; 
   13. 
   14. public class AmazonSESSample {
   15. 
   16.   // Replace sender@example.com with your "From" address.
   17.   // This address must be verified with Amazon SES.
   18.   static final String FROM = "sender@example.com";
   19. 
   20.   // Replace recipient@example.com with a "To" address. If your account
   21.   // is still in the sandbox, this address must be verified.
   22.   static final String TO = "recipient@example.com";
   23. 
   24.   // The configuration set to use for this email. If you do not want to use a
   25.   // configuration set, comment the following variable and the 
   26.   // .withConfigurationSetName(CONFIGSET); argument below.
   27.   static final String CONFIGSET = "ConfigSet";
   28. 
   29.   // The subject line for the email.
   30.   static final String SUBJECT = "Amazon SES test (AWS SDK for Java)";
   31.   
   32.   // The HTML body for the email.
   33.   static final String HTMLBODY = "<h1>Amazon SES test (AWS SDK for Java)</h1>"
   34.       + "<p>This email was sent with <a href='https://aws.amazon.com/ses/'>"
   35.       + "Amazon SES</a> using the <a href='https://aws.amazon.com/sdk-for-java/'>" 
   36.       + "AWS SDK for Java</a>";
   37. 
   38.   // The email body for recipients with non-HTML email clients.
   39.   static final String TEXTBODY = "This email was sent through Amazon SES "
   40.       + "using the AWS SDK for Java.";
   41. 
   42.   public static void main(String[] args) throws IOException {
   43. 
   44.     try {
   45.       AmazonSimpleEmailService client = 
   46.           AmazonSimpleEmailServiceClientBuilder.standard()
   47.           // Replace US_WEST_2 with the AWS Region you're using for
   48.           // Amazon SES.
   49.             .withRegion(Regions.US_WEST_2).build();
   50.       SendEmailRequest request = new SendEmailRequest()
   51.           .withDestination(
   52.               new Destination().withToAddresses(TO))
   53.           .withMessage(new Message()
   54.               .withBody(new Body()
   55.                   .withHtml(new Content()
   56.                       .withCharset("UTF-8").withData(HTMLBODY))
   57.                   .withText(new Content()
   58.                       .withCharset("UTF-8").withData(TEXTBODY)))
   59.               .withSubject(new Content()
   60.                   .withCharset("UTF-8").withData(SUBJECT)))
   61.           .withSource(FROM)
   62.           // Comment or remove the next line if you are not using a
   63.           // configuration set
   64.           .withConfigurationSetName(CONFIGSET);
   65.       client.sendEmail(request);
   66.       System.out.println("Email sent!");
   67.     } catch (Exception ex) {
   68.       System.out.println("The email was not sent. Error message: " 
   69.           + ex.getMessage());
   70.     }
   71.   }
   72. }
   ```

1. `AmazonSESSample.java`에서 다음을 자체 값으로 대체합니다.
**중요**  
이메일 주소는 대/소문자를 구분합니다. 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + `SENDER@EXAMPLE.COM` - "From" 이메일 주소로 대체합니다. 이 프로그램을 실행하기 전에 이 주소를 확인해야 합니다. 자세한 내용은 [Amazon SES에서 확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하세요.
   + `RECIPIENT@EXAMPLE.COM` - "To" 이메일 주소로 대체합니다. 계정이 아직 샌드박스에 있는 경우, 이 주소를 확인해야 계정을 사용할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요.
   + **(선택 사항) `us-west-2`**—미국 서부(오레곤) 이외의 리전에서 Amazon SES를 사용하려면 이것을 사용할 리전으로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

1. `AmazonSESSample.java`를 저장합니다.

1. 프로젝트를 빌드하려면 [**Project**]를 선택한 후 [**Build Project**]를 선택합니다.
**참고**  
이 옵션이 비활성화되어 있는 경우 자동 빌드가 활성화될 수도 있습니다. 그렇다면 이 단계를 건너뜁니다.

1. 프로그램을 시작하고 이메일을 전송하려면 [**Run**]을 선택하고 다시 [**Run**]을 선택합니다.

1. Eclipse의 콘솔 창에서 출력을 확인합니다. 이메일이 성공적으로 전송되었으면 콘솔에 "`Email sent!`"가 표시됩니다. 그렇지 않으면 오류 메시지가 표시됩니다.

1. 이메일이 성공적으로 전송되었으면 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------
#### [ PHP ]

이 주제에서는 [AWS SDK for PHP](https://aws.amazon.com/sdk-for-php/)을(를) 사용하여 Amazon SES를 통해 이메일을 전송하는 방법을 보여줍니다.

**시작하기 전에 다음 작업을 수행하세요.**
+ **PHP 설치** - PHP는 [http://php.net/downloads.php](http://php.net/downloads.php)에서 다운로드할 수 있습니다. 본 자습서에서는 PHP 버전 5.5 이상 사용이 필수적입니다. PHP를 설치한 후, 원하는 모든 명령 프롬프트에서 PHP를 실행할 수 있도록 PHP에 대한 경로를 환경 변수에 추가합니다. 이 자습서의 코드는 PHP 7.2.7을 사용하여 테스트하였습니다.
+ ** AWS SDK for PHP 버전 3 설치** - 다운로드 및 설치 지침은 [AWS SDK for PHP 설명서를](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/installation.html) 참조하세요. 이 자습서의 코드는 SDK 버전 3.64.13을 사용하여 테스트하였습니다.

**를 사용하여 Amazon SES를 통해 이메일을 보내려면 AWS SDK for PHP**

1. 텍스트 편집기에서 `amazon-ses-sample.php`이라는 파일을 만듭니다. 다음 코드를 붙여넣습니다.

   ```
    1. <?php
    2. 
    3. // If necessary, modify the path in the require statement below to refer to the 
    4. // location of your Composer autoload.php file.
    5. require 'vendor/autoload.php';
    6. 
    7. use Aws\Ses\SesClient;
    8. use Aws\Exception\AwsException;
    9. 
   10. // Create an SesClient. Change the value of the region parameter if you're 
   11. // using an AWS Region other than US West (Oregon). Change the value of the
   12. // profile parameter if you want to use a profile in your credentials file
   13. // other than the default.
   14. $SesClient = new SesClient([
   15.     'profile' => 'default',
   16.     'version' => '2010-12-01',
   17.     'region'  => 'us-west-2'
   18. ]);
   19. 
   20. // Replace sender@example.com with your "From" address.
   21. // This address must be verified with Amazon SES.
   22. $sender_email = 'sender@example.com';
   23. 
   24. // Replace these sample addresses with the addresses of your recipients. If
   25. // your account is still in the sandbox, these addresses must be verified.
   26. $recipient_emails = ['recipient1@example.com','recipient2@example.com'];
   27. 
   28. // Specify a configuration set. If you do not want to use a configuration
   29. // set, comment the following variable, and the
   30. // 'ConfigurationSetName' => $configuration_set argument below.
   31. $configuration_set = 'ConfigSet';
   32. 
   33. $subject = 'Amazon SES test (AWS SDK for PHP)';
   34. $plaintext_body = 'This email was sent with Amazon SES using the AWS SDK for PHP.' ;
   35. $html_body =  '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
   36.               '<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
   37.               'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
   38.               'AWS SDK for PHP</a>.</p>';
   39. $char_set = 'UTF-8';
   40. 
   41. try {
   42.     $result = $SesClient->sendEmail([
   43.         'Destination' => [
   44.             'ToAddresses' => $recipient_emails,
   45.         ],
   46.         'ReplyToAddresses' => [$sender_email],
   47.         'Source' => $sender_email,
   48.         'Message' => [
   49.           'Body' => [
   50.               'Html' => [
   51.                   'Charset' => $char_set,
   52.                   'Data' => $html_body,
   53.               ],
   54.               'Text' => [
   55.                   'Charset' => $char_set,
   56.                   'Data' => $plaintext_body,
   57.               ],
   58.           ],
   59.           'Subject' => [
   60.               'Charset' => $char_set,
   61.               'Data' => $subject,
   62.           ],
   63.         ],
   64.         // If you aren't using a configuration set, comment or delete the
   65.         // following line
   66.         'ConfigurationSetName' => $configuration_set,
   67.     ]);
   68.     $messageId = $result['MessageId'];
   69.     echo("Email sent! Message ID: $messageId"."\n");
   70. } catch (AwsException $e) {
   71.     // output error message if fails
   72.     echo $e->getMessage();
   73.     echo("The email was not sent. Error message: ".$e->getAwsErrorMessage()."\n");
   74.     echo "\n";
   75. }
   ```

1. `amazon-ses-sample.php`에서 다음을 자체 값으로 대체합니다.
   + **`path_to_sdk_inclusion`**- 프로그램에를 포함하는 데 필요한 경로로 바꿉 AWS SDK for PHP 니다. 자세한 내용은 [AWS SDK for PHP 설명서](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/basic-usage.html)를 참조하세요.
   + **`sender@example.com`**—Amazon SES에서 확인한 이메일 주소로 바꿉니다. 자세한 내용은 [확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하세요. Amazon SES에서 이메일 주소는 대/소문자를 구분합니다. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **`recipient1@example.com`, `recipient2@example.com`** — 수신자의 주소로 바꿉니다. 계정이 아직 샌드박스 환경에 있을 경우 수신자의 주소도 확인해야 합니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **(선택 사항) `ConfigSet`** - 이 이메일을 전송할 때 구성 세트를 사용하려면 이 값을 구성 세트의 이름으로 바꿉니다. 구성 세트에 대한 자세한 내용은 [Amazon SES에서 구성 세트 사용](using-configuration-sets.md) 단원을 참조하세요.
   + **(선택 사항) `us-west-2`**—미국 서부(오레곤) 이외의 리전에서 Amazon SES를 사용하려면 이것을 사용할 리전으로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

1. `amazon-ses-sample.php`를 저장합니다.

1. 프로그램을 실행하려면 `amazon-ses-sample.php`와 동일한 디렉터리에서 명령 프롬프트를 열고 다음 명령을 입력합니다.

   ```
   $ php amazon-ses-sample.php
   ```

1. 출력 결과를 검토합니다. 이메일이 성공적으로 전송되었으면 콘솔에 "`Email sent!`"가 표시됩니다. 그렇지 않으면 오류 메시지가 표시됩니다.
**참고**  
프로그램을 실행할 때 "cURL error 60: SSL certificate problem" 오류가 발생하면 [AWS SDK for PHP 설명서](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/faq.html#what-do-i-do-about-a-curl-ssl-certificate-error)의 설명에 따라 최신 CA 번들을 다운로드합니다. 그런 다음 `amazon-ses-sample.php`에서 `SesClient::factory` 어레이에 다음 줄을 추가하고, `path_of_certs`를 CA 번들 다운로드 경로로 바꾼 후 프로그램을 다시 실행합니다.  

   ```
   1. 'http' => [
   2.    'verify' => 'path_of_certs\ca-bundle.crt'
   3. ]
   ```

1. 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------
#### [ Ruby ]

이 주제에서는 [AWS SDK for Ruby](https://aws.amazon.com/sdk-for-ruby/)을(를) 사용하여 Amazon SES를 통해 이메일을 전송하는 방법을 보여줍니다.

**시작하기 전에 다음 작업을 수행하세요.**
+ **Ruby 설치** - Ruby는 [https://www.ruby-lang.org/en/downloads/](https://www.ruby-lang.org/en/downloads/)에서 다운로드할 수 있습니다. 이 자습서의 코드는 Ruby 1.9.3을 사용하여 테스트하였습니다. Ruby를 설치한 후 원하는 모든 명령 프롬프트에서 Ruby를 실행할 수 있도록 Ruby에 대한 경로를 환경 변수에 추가합니다.
+ **설치 AWS SDK for Ruby** - 다운로드 및 설치 지침은 *AWS SDK for Ruby 개발자 안내서*[의 설치를 AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/setup-install.html) 참조하세요. 이 자습서의 샘플 코드는 AWS SDK for Ruby버전 2.9.36을 사용하여 테스트하였습니다.
+ **공유 자격 증명 파일 생성**—이 단원의 샘플 코드가 올바로 실행되기 위해서는 공유 자격 증명 파일을 생성해야 합니다. 자세한 내용은 [AWS SDK를 사용하여 Amazon SES를 통해 이메일을 보낼 때 사용할 공유 자격 증명 파일 생성](create-shared-credentials-file.md) 단원을 참조하십시오.

**를 사용하여 Amazon SES를 통해 이메일을 보내려면 AWS SDK for Ruby**

1. 텍스트 편집기에서 `amazon-ses-sample.rb`이라는 파일을 만듭니다. 다음 코드를 파일에 붙여넣습니다.

   ```
    1. require 'aws-sdk'
    2. 
    3. # Replace sender@example.com with your "From" address.
    4. # This address must be verified with Amazon SES.
    5. sender = "sender@example.com"
    6. 
    7. # Replace recipient@example.com with a "To" address. If your account 
    8. # is still in the sandbox, this address must be verified.
    9. recipient = "recipient@example.com"
   10. 
   11. # Specify a configuration set. If you do not want to use a configuration
   12. # set, comment the following variable and the 
   13. # configuration_set_name: configsetname argument below. 
   14. configsetname = "ConfigSet"
   15.   
   16. # Replace us-west-2 with the AWS Region you're using for Amazon SES.
   17. awsregion = "us-west-2"
   18. 
   19. # The subject line for the email.
   20. subject = "Amazon SES test (AWS SDK for Ruby)"
   21. 
   22. # The HTML body of the email.
   23. htmlbody =
   24.   '<h1>Amazon SES test (AWS SDK for Ruby)</h1>'\
   25.   '<p>This email was sent with <a href="https://aws.amazon.com/ses/">'\
   26.   'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-ruby/">'\
   27.   'AWS SDK for Ruby</a>.'
   28. 
   29. # The email body for recipients with non-HTML email clients.  
   30. textbody = "This email was sent with Amazon SES using the AWS SDK for Ruby."
   31. 
   32. # Specify the text encoding scheme.
   33. encoding = "UTF-8"
   34. 
   35. # Create a new SES resource and specify a region
   36. ses = Aws::SES::Client.new(region: awsregion)
   37. 
   38. # Try to send the email.
   39. begin
   40. 
   41.   # Provide the contents of the email.
   42.   resp = ses.send_email({
   43.     destination: {
   44.       to_addresses: [
   45.         recipient,
   46.       ],
   47.     },
   48.     message: {
   49.       body: {
   50.         html: {
   51.           charset: encoding,
   52.           data: htmlbody,
   53.         },
   54.         text: {
   55.           charset: encoding,
   56.           data: textbody,
   57.         },
   58.       },
   59.       subject: {
   60.         charset: encoding,
   61.         data: subject,
   62.       },
   63.     },
   64.   source: sender,
   65.   # Comment or remove the following line if you are not using 
   66.   # a configuration set
   67.   configuration_set_name: configsetname,
   68.   })
   69.   puts "Email sent!"
   70. 
   71. # If something goes wrong, display an error message.
   72. rescue Aws::SES::Errors::ServiceError => error
   73.   puts "Email not sent. Error message: #{error}"
   74. 
   75. end
   ```

1. `amazon-ses-sample.rb`에서 다음을 자체 값으로 대체합니다.
   + **`sender@example.com`**—Amazon SES에서 확인한 이메일 주소로 바꿉니다. 자세한 내용은 [확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하세요. Amazon SES에서 이메일 주소는 대/소문자를 구분합니다. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **`recipient@example.com`**—수신자의 주소로 바꿉니다. 계정이 아직 샌드박스에 있는 경우, 이 주소를 확인해야 계정을 사용할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **(선택 사항) `us-west-2`**—미국 서부(오레곤) 이외의 리전에서 Amazon SES를 사용하려면 이것을 사용할 리전으로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

1. `amazon-ses-sample.rb`를 저장합니다.

1. 프로그램을 실행하려면 `amazon-ses-sample.rb`와 동일한 디렉터리에서 명령 프롬프트를 열고 **ruby amazon-ses-sample.rb**를 입력합니다.

1. 출력 결과를 검토합니다. 이메일이 성공적으로 전송되었으면 콘솔에 "`Email sent!`"가 표시됩니다. 그렇지 않으면 오류 메시지가 표시됩니다.

1. 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------
#### [ Python ]

이 주제에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python/)을(를) 사용하여 Amazon SES를 통해 이메일을 전송하는 방법을 보여줍니다.

**시작하기 전에 다음 작업을 수행하세요.**
+ **Amazon SES에서 이메일 주소 확인**—Amazon SES에서 이메일을 보내기 전에 발신자 이메일 주소의 소유자인지 확인해야 합니다. 사용자 계정이 아직 Amazon SES 샌드박스 환경에 있는 경우 수신자 이메일 주소도 확인해야 합니다. Amazon SES 콘솔을 사용하여 이메일 주소를 확인하는 것이 좋습니다. 자세한 내용은 [이메일 주소 자격 증명 생성](creating-identities.md#verify-email-addresses-procedure) 단원을 참조하십시오.
+ **자격 증명 가져오기 AWS **- SDK를 사용하여 Amazon SES에 액세스하려면 AWS 액세스 키 ID와 AWS 보안 액세스 키가 필요합니다. AWS Management Console의 [보안 자격 증명](https://console.aws.amazon.com/iam/home?#security_credential) 페이지를 사용하여 자격 증명을 찾을 수 있습니다. 자격 증명에 대한 자세한 내용은 [Amazon SES 자격 증명 유형](send-email-concepts-credentials.md) 단원을 참조하세요.
+ **Python 설치** - Python은 [https://www.python.org/downloads/](https://www.python.org/downloads/)에서 다운로드할 수 있습니다. 이 자습서의 코드는 Python 2.7.6 및 Python 3.6.1을 사용하여 테스트하였습니다. Python을 설치한 후 원하는 모든 명령 프롬프트에서 Python을 실행할 수 있도록 Python에 대한 경로를 환경 변수에 추가합니다.
+ **설치 AWS SDK for Python (Boto)** - 다운로드 및 설치 지침은 [AWS SDK for Python (Boto) 설명서를](https://boto3.readthedocs.io/en/latest/guide/quickstart.html#installation) 참조하세요. 이 자습서의 샘플 코드는 SDK for Python 버전 1.4.4를 사용하여 테스트하였습니다.

**SDK for Python을 사용하여 Amazon SES를 통해 이메일을 전송하려면**

1. 텍스트 편집기에서 `amazon-ses-sample.py`이라는 파일을 만듭니다. 다음 코드를 파일에 붙여넣습니다.

   ```
    1. import boto3
    2. from botocore.exceptions import ClientError
    3. 
    4. # Replace sender@example.com with your "From" address.
    5. # This address must be verified with Amazon SES.
    6. SENDER = "Sender Name <sender@example.com>"
    7. 
    8. # Replace recipient@example.com with a "To" address. If your account 
    9. # is still in the sandbox, this address must be verified.
   10. RECIPIENT = "recipient@example.com"
   11. 
   12. # Specify a configuration set. If you do not want to use a configuration
   13. # set, comment the following variable, and the 
   14. # ConfigurationSetName=CONFIGURATION_SET argument below.
   15. CONFIGURATION_SET = "ConfigSet"
   16. 
   17. # If necessary, replace us-west-2 with the AWS Region you're using for Amazon SES.
   18. AWS_REGION = "us-west-2"
   19. 
   20. # The subject line for the email.
   21. SUBJECT = "Amazon SES Test (SDK for Python)"
   22. 
   23. # The email body for recipients with non-HTML email clients.
   24. BODY_TEXT = ("Amazon SES Test (Python)\r\n"
   25.              "This email was sent with Amazon SES using the "
   26.              "AWS SDK for Python (Boto)."
   27.             )
   28.             
   29. # The HTML body of the email.
   30. BODY_HTML = """<html>
   31. <head></head>
   32. <body>
   33.   <h1>Amazon SES Test (SDK for Python)</h1>
   34.   <p>This email was sent with
   35.     <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
   36.     <a href='https://aws.amazon.com/sdk-for-python/'> AWS SDK for Python (Boto)</a>.</p>
   37. </body>
   38. </html>
   39.             """            
   40. 
   41. # The character encoding for the email.
   42. CHARSET = "UTF-8"
   43. 
   44. # Create a new SES resource and specify a region.
   45. client = boto3.client('ses',region_name=AWS_REGION)
   46. 
   47. # Try to send the email.
   48. try:
   49.     #Provide the contents of the email.
   50.     response = client.send_email(
   51.         Destination={
   52.             'ToAddresses': [
   53.                 RECIPIENT,
   54.             ],
   55.         },
   56.         Message={
   57.             'Body': {
   58.                 'Html': {
   59.                     'Charset': CHARSET,
   60.                     'Data': BODY_HTML,
   61.                 },
   62.                 'Text': {
   63.                     'Charset': CHARSET,
   64.                     'Data': BODY_TEXT,
   65.                 },
   66.             },
   67.             'Subject': {
   68.                 'Charset': CHARSET,
   69.                 'Data': SUBJECT,
   70.             },
   71.         },
   72.         Source=SENDER,
   73.         # If you are not using a configuration set, comment or delete the
   74.         # following line
   75.         ConfigurationSetName=CONFIGURATION_SET,
   76.     )
   77. # Display an error if something goes wrong.	
   78. except ClientError as e:
   79.     print(e.response['Error']['Message'])
   80. else:
   81.     print("Email sent! Message ID:"),
   82.     print(response['MessageId'])
   ```

1. `amazon-ses-sample.py`에서 다음을 자체 값으로 대체합니다.
   + **`sender@example.com`**—Amazon SES에서 확인한 이메일 주소로 바꿉니다. 자세한 내용은 [확인된 자격 증명](verify-addresses-and-domains.md) 단원을 참조하십시오. Amazon SES에서 이메일 주소는 대/소문자를 구분합니다. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **`recipient@example.com`**—수신자의 주소로 바꿉니다. 계정이 아직 샌드박스에 있는 경우, 이 주소를 확인해야 계정을 사용할 수 있습니다. 자세한 내용은 [프로덕션 액세스 요청(Amazon SES 샌드박스에서 이동)](request-production-access.md) 단원을 참조하세요. 입력하는 주소는 사용자가 확인한 것과 정확하게 동일해야 합니다.
   + **(선택 사항) `us-west-2`**—미국 서부(오레곤) 이외의 리전에서 Amazon SES를 사용하려면 이것을 사용할 리전으로 바꿉니다. Amazon SES를 사용할 수 있는 리전 목록은 *AWS 일반 참조*의 [Amazon Simple Email Service(Amazon SES)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ses_region)를 참조하세요.

1. `amazon-ses-sample.py`를 저장합니다.

1. 프로그램을 실행하려면 `amazon-ses-sample.py`와 동일한 디렉터리에서 명령 프롬프트를 열고 **python amazon-ses-sample.py**를 입력합니다.

1. 출력 결과를 검토합니다. 이메일이 성공적으로 전송되었으면 콘솔에 "`Email sent!`"가 표시됩니다. 그렇지 않으면 오류 메시지가 표시됩니다.

1. 수신자 주소의 이메일 클라이언트에 로그인합니다. 보낸 메시지가 도착해 있을 것입니다.

------

# AWS SDK를 사용하여 Amazon SES를 통해 이메일을 보낼 때 사용할 공유 자격 증명 파일 생성
<a name="create-shared-credentials-file"></a>

다음은 홈 디렉터리에서 공유 자격 증명 파일을 생성하는 방법에 대한 절차입니다. SDK 샘플 코드가 올바로 실행되려면 이 파일을 반드시 생성해야 합니다.

1. 텍스트 편집기에서 새로운 파일을 생성합니다. 생성된 파일에 다음 코드를 붙여넣습니다.

   ```
   1. [default]
   2. aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
   3. aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
   ```

1. 방금 생성한 텍스트 파일에서를 고유한 AWS 액세스 키 ID`YOUR_AWS_ACCESS_KEY`로 바꾸고를 고유한 AWS 보안 액세스 키`YOUR_AWS_SECRET_ACCESS_KEY`로 바꿉니다.

1. 파일을 저장합니다. 다음 표는 운영 체제에 따라 올바른 파일 위치 및 이름을 나타낸 것입니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ses/latest/dg/create-shared-credentials-file.html)
**중요**  
자격 증명 파일을 저장할 때 파일 확장명을 포함시키지 마세요.

# Amazon SES에서 지원하는 콘텐츠 인코딩
<a name="content-encodings"></a>

다음은 참조를 위해 제공됩니다.

Amazon SES는 다음 콘텐츠 인코딩을 지원합니다.
+ `deflate`
+ `gzip`
+ `identity`

[RFC 7231](https://tools.ietf.org/html/rfc7231#section-5.3.4) 사양에 따르면 Amazon SES는 다음의 Accept-Encoding 헤더 형식도 지원합니다.
+ `Accept-Encoding:deflate,gzip`
+ `Accept-Encoding:`
+ `Accept-Encoding:*`
+ `Accept-Encoding:deflate;q=0.5,gzip;q=1.0`
+ `Accept-Encoding:gzip;q=1.0,identity;q=0.5,*;q=0`

# Amazon SES 및 보안 프로토콜
<a name="security-protocols"></a>

이 주제에서는 Amazon SES와 연결할 때, 그리고 Amazon SES가 이메일을 받는 사람에게 전송할 때 사용할 수 있는 보안 프로토콜을 설명합니다.

## 이메일 발신자와 Amazon SES 연결
<a name="security-client-to-ses"></a>

Amazon SES와 연결할 때 사용하는 보안 프로토콜은 다음에서 설명하듯이 Amazon SES API 또는 Amazon SES SMTP 인터페이스를 사용하는가에 따라 달라집니다.

### HTTPS
<a name="security-client-to-ses-api"></a>

Amazon SES API(직접 또는 AWS SDK를 통해)를 사용하는 경우 모든 통신은 Amazon SES HTTPS 엔드포인트를 통해 TLS에 의해 암호화됩니다. Amazon SES HTTPS 엔드포인트는 TLS 1.2 및 TLS 1.3을 지원합니다.

### SMTP 인터페이스
<a name="security-client-to-ses-smtp"></a>

SMTP 인터페이스를 통해 Amazon SES에 액세스하는 경우 TLS(전송 계층 보안)를 사용하여 연결을 암호화해야 합니다. TLS는 종종 이전 프로토콜 이름 Secure Sockets Layer(SSL)로 불립니다.

Amazon SES는 TLS로 암호화된 연결 설정을 위한 두 가지 메커니즘인 STARTTLS 및 TLS 래퍼를 지원합니다.
+ **STARTTLS** - STARTTLS는 암호화되지 않은 연결을 암호화된 연결로 업그레이드하는 방법입니다. 다양한 프로토콜을 위한 여러 버전의 STARTTLS이 있으며, SMTP 버전은 [RFC 3207](https://www.ietf.org/rfc/rfc3207.txt)에서 정의됩니다. STARTTLS 연결의 경우 Amazon SES는 TLS 1.2, TLS 1.3을 지원합니다.
+ **TLS 래퍼** - TLS 래퍼(SMTPS 또는 핸드셰이크 프로토콜이라고도 함)는 먼저 암호화되지 않은 연결을 설정하지 않고 암호화된 연결을 시작하는 방법입니다. TLS 래퍼에서는 Amazon SES SMTP 엔드포인트가 TLS 협상을 수행하지 않습니다. TLS를 사용하여 엔드포인트와 연결한 후 전체 대화에 걸쳐 TLS를 계속 사용하는 것이 클라이언트의 책임입니다. TLS 래퍼는 더 오래된 프로토콜이지만 많은 클라이언트가 여전히 이 프로토콜을 지원합니다. TLS 래퍼 연결의 경우 Amazon SES는  TLS 1.2 및 TLS 1.3을 지원합니다.

이러한 방법을 사용한 Amazon SES SMTP 인터페이스 연결에 대한 자세한 내용은 [Amazon SES SMTP 엔드포인트에 연결](smtp-connect.md) 섹션을 참조하세요.

## Amazon SES와 수신자 연결
<a name="security-ses-to-receiver"></a>

 TLS 1.3은 기본 전송 방법이지만 SES는 이전 버전의 TLS를 사용하여 메일 서버에 이메일을 전송할 수 있습니다.

기본적으로 Amazon SES는 *opportunistic TLS*를 사용합니다. SES의 기회적 TLS는 항상 STARTTLS를 사용하며 TLS 래퍼를 포함하지 않습니다. 흐름에는 초기 일반 텍스트 연결을 설정한 다음 클라이언트와 서버가 모두 STARTTLS를 지원하는 경우 TLS 암호화 세션으로 업그레이드하는 작업이 포함됩니다. SES가 보안 연결을 설정할 수 없는 경우 암호화하지 않고 해당 메시지를 전송합니다.

이 동작은 구성 세트를 사용하여 변경할 수 있습니다. [PutConfigurationSetDeliveryOptions](https://docs.aws.amazon.com/ses/latest/APIReference/API_PutConfigurationSetDeliveryOptions.html) API 작업을 사용하여 구성 세트에 대한 `TlsPolicy` 속성을 `Require`에 설정합니다. [AWS CLI](https://aws.amazon.com/cli)를 사용하여 이렇게 변경할 수 있습니다.

**구성 세트에 대한 TLS 연결을 요청하여 Amazon SES를 구성하려면**
+ 명령줄에 다음 명령을 입력합니다.

  ```
  aws sesv2 put-configuration-set-delivery-options --configuration-set-name MyConfigurationSet --tls-policy REQUIRE
  ```

  이전 예제에서 *MyConfigurationSet*를 구성 세트의 이름으로 대체합니다.

  구성 세트를 사용하여 이메일을 전송할 경우, Amazon SES가 보안 연결을 설정할 수 있다면 수신 이메일 서버에 해당 메시지만을 전송합니다. Amazon SES가 수신 이메일 서버에 보안 연결을 할 수 없는 경우 해당 메시지를 삭제합니다.

## 종단 간 암호화
<a name="security-end-to-end"></a>

Amazon SES를 사용하여 S/MIME 또는 PGP를 통해 암호화된 메시지를 전송할 수 있습니다. 이러한 프로토콜을 사용하는 메시지는 발신자에 의해 암호화됩니다. 해당 콘텐츠는 메시지를 암호 해독하는 데 필요한 프라이빗 키를 소유하는 수신자만 볼 수 있습니다.

Amazon SES는 S/MIME으로 암호화된 이메일을 전송하는 데 사용할 수 있는 다음 MIME 유형을 지원합니다.
+ `application/pkcs7-mime`
+ `application/pkcs7-signature`
+ `application/x-pkcs7-mime`
+ `application/x-pkcs7-signature`

Amazon SES는 PGP로 암호화된 이메일을 전송하는 데 사용할 수 있는 다음 MIME 유형도 지원합니다.
+ `application/pgp-encrypted`
+ `application/pgp-keys`
+ `application/pgp-signature`

# Amazon SES 헤더 필드
<a name="header-fields"></a>

Amazon SES는 [RFC 822](https://www.rfc-editor.org/rfc/rfc822.html)에 설명된 형식을 따르는 모든 이메일 헤더를 허용할 수 있습니다.

메시지 헤더 섹션에 다음 필드를 두 번 이상 표시할 수 없습니다.
+ `Accept-Language`
+ `acceptLanguage`
+ `Archived-At`
+ `Auto-Submitted`
+ `Bounces-to`
+ `Comments`
+ `Content-Alternative`
+ `Content-Base`
+ `Content-Class`
+ `Content-Description`
+ `Content-Disposition`
+ `Content-Duration`
+ `Content-ID`
+ `Content-Language`
+ `Content-Length`
+ `Content-Location`
+ `Content-MD5`
+ `Content-Transfer-Encoding`
+ `Content-Type`
+ `Date`
+ `Delivered-To `
+ `Disposition-Notification-Options`
+ `Disposition-Notification-To`
+ `DKIM-Signature`
+ `DomainKey-Signature`
+ `Errors-To`
+ `From`
+ `Importance`
+ `In-Reply-To`
+ `Keywords`
+ `List-Archive`
+ `List-Help`
+ `List-Id`
+ `List-Owner`
+ `List-Post`
+ `List-Subscribe`
+ `List-Unsubscribe`
+ `List-Unsubscribe-Post`
+ `Message-Context`
+ `Message-ID`
+ `MIME-Version`
+ `Organization`
+ `Original-From`
+ `Original-Message-ID`
+ `Original-Recipient`
+ `Original-Subject`
+ `Precedence`
+ `Priority`
+ `References`
+ `Reply-To`
+ `Return-Path`
+ `Return-Receipt-To`
+ `Sender`
+ `Solicitation`
+ `Sensitivity`
+ `Subject`
+ `Thread-Index`
+ `Thread-Topic`
+ `User-Agent`
+ `VBR-Info`

**고려 사항**
+ `acceptLanguage` 필드는 표준이 아닙니다. 가능한 경우 `Accept-Language` 헤더를 대신 사용해야 합니다.
+ `Date` 헤더를 지정하면 Amazon SES에서 메시지를 수락한 UTC 시간대의 날짜와 시간에 해당하는 타임스탬프로 Amazon SES가 헤더를 재정의합니다.
+ `Message-ID` 헤더를 제공하면 Amazon SES가 자체 값으로 헤더를 재정의합니다.
+ `Return-Path` 헤더를 지정하면 Amazon SES가 지정된 주소로 반송 메일과 수신 거부 알림을 보냅니다. 하지만 수신자가 받은 메시지에서는 `Return-Path` 헤더의 값이 다릅니다.
+ Amazon SES API v2 `SendEmail` 작업을 *단순* 또는 *템플릿 형식* 콘텐츠와 함께 사용하거나 `SendBulkEmail` 작업을 사용하는 경우 SES에서 설정한 헤더에 대해 사용자 지정 헤더 콘텐츠를 설정할 수 없습니다. 따라서 다음 헤더는 사용자 지정 헤더로 허용되지 않습니다.
  + `BCC`, `CC`, `Content-Disposition`, `Content-Type`, `Date`, `From`, `Message-ID`, `MIME-Version`, `Reply-To`, `Return-Path`, `Subject`, `To`

# SES에서 이메일 첨부 파일 작업
<a name="attachments"></a>

SES의 이메일 첨부 파일은 SES API v2 `SendEmail` 및 `SendBulkEmail` 작업을 사용할 때 이메일 메시지에 포함할 수 있는 파일입니다. 이 기능을 사용하면 PDF, Word 파일, 이미지 또는 SES 지원 MIME 유형을 준수하는 기타 파일 유형과 같은 문서를 포함하여 이메일 콘텐츠를 보강할 수 있습니다. 수신자가 별도로 다운로드할 필요 없이 이메일 콘텐츠에 직접 렌더링되는 인라인 이미지를 포함할 수도 있습니다. 최대 40MB의 총 메시지 크기 한도까지 이메일당 여러 첨부 파일을 포함할 수 있습니다.

**참고**  
[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) `Raw` 콘텐츠 유형이 있는 SES API v2, SMTP 인터페이스 및 SES API v1은 [원시 이메일 MIME 메시지 구성](send-email-raw.md#send-email-raw-mime)을 통해 첨부 파일을 계속 처리합니다.

## SES에서 첨부 파일이 작동하는 방식
<a name="how-attachments-work"></a>

첨부 파일이 포함된 이메일을 보낼 때 서로 다른 단계에서 발생하는 두 가지 유형의 인코딩이 있습니다.

1단계 - SES로 데이터 전송:
+ SES에 첨부 파일을 보내려면 바이너리 데이터(예: PDF 또는 이미지)를 안전하게 전송할 수 있는 형식으로 변환해야 합니다.
+ 여기서 base64 인코딩이 사용됩니다. JSON 요청에서 원시 바이너리 데이터를 전송할 수 없기 때문에 필요합니다.
+  AWS SDK를 사용하는 경우이 인코딩이 자동으로 처리됩니다.
+ 를 사용하는 경우 첨부 파일을 보내기 전에 직접 base64 인코딩 AWS CLI해야 합니다.

2단계 - 이메일을 생성하는 SES:
+ SES가 데이터를 수신하면 첨부 파일이 포함된 실제 이메일을 생성해야 합니다.
+ 이때 [ContentTransferEncoding](#attachment-structure) 설정이 실행됩니다.
+ SES는 ContentTransferEncoding에서 지정한 인코딩 방법을 사용하여 최종 이메일에서 첨부 파일의 형식을 자동으로 지정합니다.

메일을 통해 패키지를 보내는 것과 비슷하다고 생각하세요. 먼저 패키지를 우체국으로 가져와야 합니다(1단계 - Base64-encoding 필요). 그러면 우체국에서 최종 배송에 적합하게 포장합니다(2단계 - ContentTransferEncoding).

## 첨부 파일 객체 구조
<a name="attachment-structure"></a>

SES를 통해 첨부 파일이 포함된 이메일을 보내면 서비스가 복잡한 MIME 메시지 구성을 자동으로 처리합니다. 다음 SES API v2 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Attachment.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Attachment.html) 객체 구조를 통해 첨부 파일 콘텐츠와 메타데이터를 제공하면 됩니다.
+ `FileName`(필수) - 수신자에게 표시되는 파일 이름입니다(파일 확장명을 포함해야 함). 제공되지 않으면 SES는 `ContentType`의 확장명에서 `FileName`을 파생시킵니다.
+ `ContentType`(선택 사항) - [IANA 호환 미디어 유형 식별자](https://www.iana.org/assignments/media-types/media-types.xhtml)입니다.
+ `ContentDisposition`(선택 사항) - `ATTACHMENT`*(기본값)* 또는 `INLINE`과 같이 첨부 파일을 렌더링하는 방법을 지정합니다.
+ `ContentDescription`(선택 사항) - 콘텐츠에 대한 간략한 설명입니다.
+ `RawContent`(필수) - 첨부 파일의 실제 콘텐츠입니다.
+ `ContentTransferEncoding`(선택 사항) - 첨부 파일 페이로드가 이메일의 Mime 메시지로 어셈블될 때 인코딩되는 방법을 지정합니다. `SEVEN_BIT`*(기본값)*, `BASE64` 또는 `QUOTED_PRINTABLE`입니다.

연결된 모든 콘텐츠는 전송을 위해 SES 엔드포인트로 전송하기 전에 base64로 인코딩되어야 합니다. AWS SDK 클라이언트를 사용하여 API를 호출하는 경우 자동으로 처리됩니다. 를 사용 AWS CLI중이거나 자체 클라이언트를 구현한 경우 다음과 같이 인코딩을 직접 수행해야 합니다.
+ 일반 텍스트 콘텐츠: `Text attachment sample content.`
+ Base64 인코딩: `VGV4dCBhdHRhY2htZW50IHNhbXBsZSBjb250ZW50Lg==`

다음 예제에서는 SES API v2로 첨부 파일을 지정할 때 첨부 파일 객체 구조를 사용하는 방법과 첨부 파일 객체 요소가 포함된 JSON 파일을 AWS CLI 참조하는 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html) 작업을 보여줍니다.

**Example - 간단한 콘텐츠가 포함된 SendEmail**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-simple.json
```
**request-send-email-simple.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Simple": {
            "Subject": {
                "Data": "Email with attachment"
            },
            "Body": {
                "Text": {
                    "Data": "Please see attached document."
                },
                "Html": {
                    "Data": "Please see attached <b>document</b>."
                }
            },
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example - 간단한 콘텐츠와 인라인 첨부 파일이 포함된 SendEmail**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-simple-inline-attachment.json
```
**request-send-email-simple-inline-attachment.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Simple": {
            "Subject": {
                "Data": "Email with attachment"
            },
            "Body": {
                "Html": {
                    "Data": "<html><body>Our logo:<br><img src=\"cid:logo123\" alt=\"Company Logo\"></body></html>"
                }
            },
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "INLINE",
                    "FileName": "logo.png",
                    "ContentId": "logo123",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example - 템플릿 콘텐츠가 포함된 SendEmail**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-template.json
```
**request-send-email-template.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{\"name\":\"John\"}",
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example - 첨부 파일 콘텐츠가 포함된 SendBulkEmail**  

```
aws sesv2 send-bulk-email --cli-input-json file://request-send-bulk-email.json
```
**request-send-bulk-email.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "DefaultContent": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{}",
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    },
    "BulkEmailEntries": [
        {
            "Destination": {
                "ToAddresses": [
                    "recipient@example.com"
                ]
            },
            "ReplacementEmailContent": {
                "ReplacementTemplate": {
                    "ReplacementTemplateData": "{\"name\":\"John\"}"
                }
            }
        }
    ]
}
```

## 모범 사례
<a name="attachments-best-practices"></a>
+ 총 메시지 크기(첨부 파일 포함)를 40MB 미만으로 유지합니다.
+ 가능한 경우 SES가 파일 확장명을 기반으로 콘텐츠 유형을 자동으로 감지하도록 합니다.
+ 콘텐츠 유형이 [일반적인 MIME 유형](https://developer.mozilla.org/en-US/docs/Web/HTTP/MIME_types/Common_types)을 벗어나는 경우에만 콘텐츠 유형을 명시적으로 지정합니다.
+ 더 나은 이메일 렌더링을 위해 인라인 이미지를 사용하는 것이 좋습니다.
+ SES는 [지원되지 않는 연결 형식](#mime-types)에 나열된 유형을 제외하고 첨부 파일에 대해 다양한 MIME 유형을 지원합니다.

## SES에서 지원되지 않는 첨부 파일 유형
<a name="mime-types"></a>

Multipurpose Internet Mail Extensions(MIME) 표준을 사용하여 Amazon SES를 통해 첨부 파일이 포함된 메시지를 전송할 수 있습니다. Amazon SES는 모든 첨부 파일 유형을 허용합니다(다음 목록의 확장명을 사용하는 첨부파일 *제외*).


|  |  |  |  |  | 
| --- |--- |--- |--- |--- |
| .ade .adp .app .asp .bas .bat .cer .chm .cmd .com .cpl .crt .csh .der .exe .fxp .gadget .hlp  | .hta .inf .ins .isp .its .js .jse .ksh .lib .lnk .mad .maf .mag .mam .maq .mar .mas .mat  | .mau .mav .maw .mda .mdb .mde .mdt .mdw .mdz .msc .msh .msh1 .msh2 .mshxml .msh1xml .msh2xml .msi .msp  | .mst .ops .pcd .pif .plg .prf .prg .reg .scf .scr .sct .shb .shs .sys .ps1 .ps1xml .ps2 .ps2xml  | .psc1 .psc2 .tmp .url .vb .vbe .vbs .vps .vsmacros .vss .vst .vsw .vxd .ws .wsc .wsf .wsh .xnk  | 

일부 ISP는 제한 사항(예: 보관된 첨부 파일 관련 제한 사항)을 추가로 두고 있으므로 프로덕션 이메일을 보내기 전에 주요 ISP를 통해 이메일 전송을 테스트하는 것이 좋습니다.