개발 노트/개발 삽질

[AWS] SESv2를 이용한 수신측 메일 열람여부 확인하기

j4ko 2024. 6. 3. 22:29
728x90
반응형

목차

     

    개요 

    백엔드 개발자가 되고 나서 얼마 지나지 않는 시점의 일이었다. "메일을 전송했을 때 수신한 사람이 메일을 열어봤는지를 확인할 수 있는가"에 대한 기능 구현이 가능한지를 논의하던 자리였다. 해당 기능에 대한 구현은 굳이 열어봤는지까지 확인할 필요가 없는 것으로 일단락되었던 것으로 기억한다.

     

    그 당시에는 신입 개발자였기에 “그걸 어떻게 개발하지?” 라는 생각으로 궁금증만 남았다. 시간이 계속 흘러감에도 이 기능에 을 어떻게 구현할 수 있을까라는 생각이 남아있었다. 그러나 최근 AWS SES v2 문서를 보면서 해당 기능에 대한 구현 가능성을 엿보게 되었다.

     

    이 포스팅은 제목과 같이 AWS SESv2와 SNS를 이용해 송신한 이메일을 수신한 측에서 열어봤는지를 알 수 있는 방법에 관련한 내용을 기록하려고 한다.

     

     

    AWS-SES 문서로부터 알게 된 사실

    개요에서 언급한  기능의 구현 가능성을 떠올리게 된 건 AWS SES의 개발자 가이드를 보던 중이었다. AWS SES 개발자 가이드의 “FAQ > 이메일 지표 FAQ”에 다음과 같은 글이 있었다.

    SES에서 이메일을 전송할 때 1x1픽셀을 심는다고 한다.(후에 찾아보니 이는 “추적픽셀”이라 부르는 듯하다.)

     

    이 문서를 처음 읽었을 때 수신 측에서 이메일을 열람할 때 이메일에 포함된 그리고 어딘가에 존재하는 해당 픽셀의 이미지 주소를 요청함으로써 동작하는 것이라 이해했다.

     

    AWS-SES와 SNS사용하기

    SES 문서를 읽었을 땐 픽셀을 심어서 해당 이메일을 열람했을 때 열람여부를 확인이 가능한 듯 보인다. 그렇다면 이메일을 열람했다는 이벤트를 수신받고 싶으면 어떻게 해야 되는지가 문제였다.

     

    SESv2에는 “구성세트”라는 기능이 존재한다. 특정 이벤트가 일어나면 AWS-SNS으로 이벤트를 넘겨준다. 만약 Daemon이나 Batch와 같은 Server 기반의 작업형태라면 SNS의 Pub/Sub을 이용할 수도 있을 것이다.

     

    AWS SES의 구성 세트 설정

    아직 서울리전에는 구성 세트 설정이 없다. SES의 구성 세트 설정이 가능한 리전인지를 확인하자.

    전송한 이메일을 수신자가 열람했을 때 해당 내역을 확인할 수 있는 것이 목적이기 “열기” 추적만 선택하고 구성세트를 생성하자. 또한 이 이벤트를 넘길 대상 앞서 언급한 SNS를 지정하자.

    이후 sns에서 구독 설정을 해주자

     

     

     

    Naver 메일을 통해 확인해 보자.

    이제 Naver 메일을 통해 수신자가 메일 열람 시 열람 내용이 확인이 되는지 시도해 보자. 환경상의 제한으로 송신 및 수신도 같은 메일로 진행했다. python의 boto3을 이용해 다음과 같은 코드를 사용해 메일을 전송해 보자.

    import boto3
    from datetime import datetime
    
    AWS_ACCESS_KEY = ""
    AWS_ACCESS_SECRET_KEY = ""
    AWS_REGION_NAME = "ap-northeast-1"
    
    ses_client = boto3.client(
    	  "sesv2",
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_ACCESS_SECRET_KEY,
        region_name=AWS_REGION_NAME
    )
    
    email_subject = 'Test Email'
    
    # 이메일 구성
    email = {
        'FromEmailAddress': "@naver.com",
        'Destination': {
            'ToAddresses': ['@naver.com'],
        },
        'Content': {
            'Simple': {
                'Subject': {
                    'Data': email_subject
                },
                'Body': {
                    'Text': {
                        'Data': "test"
                    },
                    'Html': {
                        'Data': "<h1>TEST MAIL</h1>"
                    }
                }
            }
        },
        "ConfigurationSetName": 'open_tracker_test',
    }
    
    response = ses_client.send_email(**email)

    위 코드를 실행하면 다음과 메일이 들어와 있다.

     

    조금 지난 후에 메일함을 Refresh 하면 다음과 같은 메일이 들어와 있다.

     

     

    SES로부터 발생한 Event를 SNS를 통해서 받은 내역이다. 해당 메일의 내용은 다음과 같은 Event Message이다.

    그러나 “메일 수신자가의 메일 열람 확인”을 증명하기 위해 “Test Email”을 열었을 때는 별다른 알림을 받지 못했다.

     

     

    추적 픽셀 링크를 열어보자

    앞서 AWS 개발자 문서에서 SES에서 “열기” 이벤트를 추적하기 위해 메일이 추적 픽셀을 심는다고 한 것을 확인했다. 테스트용으로 발송한 “Test Email”을 열람해서 F12로 열어본 결과 다음과 같이 추적 픽셀이 들어있다.

     

    해당 링크를 클릭하여 열게 되면 다음과 같은 메일이 추가로 메일함에 들어와 있는 게 확인된다.

    해당 링크를 메일을 열람했을 때 동작할 수 있게 처리하는 방법을 찾으면 발송한 메일에 대해 수신자가 열람했을때 “메일을 열어봤다”라고 할 수 있을 텐데 이에 대한 해결 방법은 찾지 못했다.

     

    마치며

    AWS의 SES로 메일을 발송했을 때 수신자의 메일 열람 여부를 확인이 가능한지를 테스트해 봤다. 본문에 기술한 내용을 통해서는 아직 불가능하다는 것이 결론이긴 하다. 그러나 이는 필자가 “특정 메일을 열람했을 때”를 기준으로 잡았기 때문이다.

     

    만약 “특정 메일에 대해 수신자가 열람한 것”을 메일 열람의 기준으로 본 것이 아니라 “메일링 리스트를 열어봤을 때 해당 메일의 존재 여부를 수신자가 확인했다”라고 가정한다고 하면 본문의 기재한 내용이 더 적합하다고 보인다.

    728x90
    반응형