Category: Simple Email Service


Amazon SES로 수신 메일 처리하기

지난 2011년 Amazon Simple Email Service (SES)를 출시했습니다. 대용량 메일 전송을 위해 만들어졌으며, 현재 Amazon과 고객 간 연간 수십 억 개의 메일을 통해 마케팅 활동에 사용하고 있습니다. 그동안 많은 요청이 있었던 SES의 새로운 기능을 출시합니다. SES 전체 도메인 또는 해당 도메인의 개별 메일 주소 메일 수신을 할 수 있게 되었습니다. 이를 통해 확장성이 높고 고도로 자동화 된 메일 송수신 및 처리 시스템을 만들 수 있습니다.

즉, 정교한 규칙 세트 및 IP 주소 필터를 사용하여 개별 메시지의 목적지를 제어 할 수 있습니다. 규칙에 적합한 메일 헤더를 추가하거나 S3 버킷에 저장하거나, SNS 토픽으로 전달하거나 Lambda 함수에 반영 시킬 수 있습니다.

메일 수신 및 처리
신규 기능을 사용하기 위해서는 사용하고 싶은 도메인 보유 여부를 인증 해야 합니다. 이미 SES를 통해 이메일을 보내고 있다면, 다시 할 필요는 없습니다.

이메일을 SES로 수신 처리하기 위해 메일을 재전송 해야 하는데, 이를 위해 두 가지 방법이 있습니다. 하나는 도메인의 MX 레코드를 리전별 SES의 SMTP 엔드포인트에 연결 하는 것입니다. 또 하나는 기존의 메일 시스템을 SES의 SMTP 엔드 포인트에 전송하는 것입니다.

다음 절차는 수신 메일에 대한 설정인데, 이를 위해 인바운드 규칙(Receipt rules)을 만듭니다. 규칙 집합(Rules sets)으로 여러 도메인에 적용 할 수 있습니다. 다른 AWS 서비스와 마찬가지로 이러한 설정은 리전 마다 개별적으로 지정해야 합니다. 사용 중인 규칙 세트는 각각의 리전에서 하나 뿐입니다. 그 규칙이 없으면 모든 메일은 수신 거부 (reject)됩니다.

이러한 규칙에는 다음과 같은 속성이 있습니다.

  • Enabled –사용 여부 플래그
  • Recipients – 적용할 메일 주소 또는 도메인 전체 목록. 이 속성이 부여되지 않은 경우, 규칙은 도메인 모든 주소에 적용
  • Scan – 규칙 해당 메일 중 스팸 및 바이러스 검사를 수행할지 여부 플래그 (기본값은 설정됨).
  • TLS – 규칙 해당 이메일을 TLS로 암호화하여 전달할지 여부 플래그
  • Action List – 규칙 해당 이메일을 처리 목록

SES가 메시지를 받으면 그 메시지에 향후 처리 내용에 대한 허용 여부를 확인 합니다.

  • 소스 IP 주소는 SES가 내부에서 관리하고있는 목록과 비교하여 거절 여부 판단 (목록 자체는 덮어 쓸 수 있음)
  • 소스 IP 주소는 사용자가 만든 IP 주소 목록과 비교하여 거절 여부 판단
  • 메시지는 규칙의 이메일 주소 또는 도메인과 일치하는지 확인하여 허용 여부 판단

이 메일 메시지가 규칙에 적합하여야 과금은 발생하지 않습니다. 일단 메시지가 허용(accept)되면 SES는 규칙 따라 동작이 발생합니다.

  • Add 메시지에 헤더 추가
  • Store S3 버킷에 메시지를 저장합니다. 옵션에서 AWS Key Management Service (KMS) 키를 사용해 암호화 수 있습니다. 전체 메시지 (헤더 및 본문)은 30MB 이하
  • Publish 메시지를 SNS 토픽으로 보냅니다. 전체 메시지는 150KB 이하
  • Invoke Lambda 기능을 수행합니다. 동기 및 비동기 (기본값)에서 실행
  • Return 보낸 사람에게 메시지 반송
  • Stop 규칙 작업 중단

각 동작은 규칙 작성 순서대로 처리됩니다. Lambda의 경우, spam 및 virus 검사 결과에 접근합니다. Lambda 기능을 메시지 본문에 적용하는 경우, 먼저 메시지를 S3에 저장해야 합니다.

데모 보기

아래에는 Lambda 기능(MyFunction)을 통해, 수신 메일을 SNS 토픽(MyTopic)에 보내고, KMS키 (aws/ses)에서 S3 암호화를 통해(MyBucket) 저장하는 규칙을 만들게합니다

전체 규칙 목록을 볼 수 있습니다

아래는 Spam과 Virus 검사가 실패했을 경우에 처리하는 Lambda 기능의 예제 코드입니다. 이 기능을 필요한데로 작동하도록 동기화(RequestResponse) 실행이 진행 됩니다.

exports.handler = function(event, context) {
    console.log('Spam filter');
    
    var sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
 
    // Check if any spam check failed
    if (sesNotification.receipt.spfVerdict.status      === 'FAIL'
        || sesNotification.receipt.dkimVerdict.status  === 'FAIL'
        || sesNotification.receipt.spamVerdict.status  === 'FAIL'
        || sesNotification.receipt.virusVerdict.status === 'FAIL')
    {
        console.log('Dropping spam');
        // Stop processing rule set, dropping message
        context.succeed({'disposition':'STOP_RULE_SET'});
    }
    else
    {
        context.succeed();   
    }
};

자세한 사항은 Amazon SES Developer GuideReceiving Email을 참조하십시오.

가격 및 사용 지역
수신 비용은 메일 1,000 통마다 0.10 달러입니다. 메시지는 256KB 또는 256KB 단위 1000 청크 당 0.09 달러가 부과됩니다. 예를 들어, 768KB의 메시지는 3 청크로 계산합니다. S3와 SNA 또는 Lambda에서도 사용한 리소시 비용이 청구됩니다. 자세한 내용은 Amazon SES Pricing을 참조하십시오.
이 새로운 기능은 오늘부터 US East (버지니아 북부), US West (오레곤), 유럽 (아일랜드) 지역에서 사용할 수 있습니다.

— Jeff;

이 글은 New – Receive and Process Incoming Email with Amazon SES의 한국어 번역입니다.