서론

이메일 서비스의 개념이해, 기능개발, 성능 개선까지 정리되었습니다.
이제 남은 것은 반송메일에 대해 어떻게 대응할 것인가입니다.

반송메일 대응의 중요성


Mailgun을 통해 발송한 메일이 반송되는 경우,
발송한 도메인의 평판에 좋지 않은 영향을 줄 수 있습니다.

도메인 평판이 좋지 않다면, 다른 서비스에서 메일 수신을 차단할 수 있습니다.

따라서 반송메일과 수신차단된 경우 적절한 대응이 필요합니다
보통 Gmail 같은 경우 반송되거나 수신차단되는 경우 오류 메세지에 이유가 포함됩니다.

받는 메일: afaosuhfkjashfjknafasjdhajkdhfjkahfgkahldas@gmail.com
반송 메일: 5.1.1 The email account that you tried to reach does not exist. Please try 5.1.1 double-checking the recipient's email address for typos or 5.1.1 unnecessary spaces. For more information, go to 5.1.1 ... (이후 생략)

Gmail로 테스트 했을 때 받은 반송메일로
수신처에 대한 정보를 확인할 수 없다는 내용입니다.

Mailgun의 Suppressions

Mailgun에서 반송메일 관리 기능을 제공해줍니다
해당 기능을 통해 반송메일 보낸 대상과 이유를 확인할 수 있습니다.

또한 이용등급을 업그레이드하면 분석 기능도 제공받을 수 있으며,
Google Postmaster나 Microsoft SNDS와 같은 외부 분석도구도 연결할 수 있습니다

현재 이용하고 있는 등급에서는 분석도구 기능을 사용할 수 없기 때문에,
별도의 테스트는 진행하지 않았습니다.

대응방법 고민

Mailgun에서 제공해주는 서비스를 이용해서 관리자가 정기적으로 확인해주고,
개발자에게 관련 정보를 알려줘서 대처하는 것이 가장 좋은 방법이라 생각했습니다.

반송메일의 유형은 크게 두가지로 나뉘어지는데,
이 유형에 따라 적절한 대응방법을 고민하면 됩니다.

소프트바운스

일시적인 문제로 반송메일을 발송하는 경우입니다.

  • 수신메일함 용량이 부족한 경우
  • 수신 이메일 서버가 다운된 경우

해당 경우에는 발신자 평판에 미치는 영향이 적으며, 다시 요청했을 때 정상 발송될 수 있습니다.

따라서 일정 시간, 일정 횟수 이상 요청을 해도 도착하지 않는 경우
관리자에게 연락하라는 발송확인알림을 추가하여 운영적으로 대응하도록 생각했습니다.

하드바운스

영구적인 문제로 이메일을 발송하지 못하는 상태입니다

  • 이메일 주소가 잘못되었거나 존재하지 않는 경우
  • 도메인 주소가 잘못되었거나 존재하지 않는 경우
  • 수신자가 발신 이메일 주소를 차단한 경우

이 경우에는 발신자 평판에 악영향을 줄 수 있습니다
따라서 해당 경우에는 미리 예외처리를 통해 발생가능성을 차단하거나
반복적으로 발생하는 IP나 사용자를 차단하는 방법을 생각했습니다.

하드바운스 예외처리

먼저 이메일 주소나 도메인 주소에 대한 하드바운스를 막기 위해,
별도의 검증 과정을 추가했습니다.

도메인 주소 검증

해당 프로젝트에서 사용하는 도메인은 3가지입니다.

  • sch.ac.kr
  • asan.sch.ac.kr
  • mail.sch.ac.kr

해당 도메인이 아닌 다른 도메인으로 이메일 발송을 요청하는 경우
이메일 발송을 중단하고 예외처리된 응답을 전송하도록 개발했습니다

String emailDomain = email.  
        substring(email  
                .lastIndexOf(SEPARATOR)+1);  
  
if(!VALIDATE_EMAIL_DOMAINS.contains(emailDomain)){  
    throw new ApiException(UNIVERSITY_EMAIL_NOT_VALID);  
}

이메일은 구분자 (@)를 기준으로 이메일 ID와 도메인 주소로 구분됩니다.
이 특징을 이용해서 도메인에 대한 검증로직을 구현하였고,
서버에서 지정한 도메인이 아닌 경우, 예외응답으로 대응하도록 개발했습니다

이메일 주소 검증

이메일 주소에서 구분자(@)의 앞 부분은 이메일 ID입니다.
Local-part라고도 하며, RFC 5321에 자세한 규칙이 나와있습니다

RFC 5321 4.5.3.1.1.
Local-part
The maximum total length of a user name or other local-part is 64 octets.

최대 길이를 64자로 제한한다고 명시되어있습니다.
따라서, 이메일 ID의 길이가 65자 이상인 경우 예외를 발생하도록 개발했습니다

String emailId = email.substring(0, email.lastIndexOf(SEPARATOR));

if(emailId.length() >= 65){  
    throw new ApiException(EMAIL_LENGTH_TOO_LONG);  
}

또한 일부 특수 문자의 경우 (대표적으로 ',') Mailgun API 자체에서
형식에 맞지 않는 주소라고 발송하지 않습니다.

아예 발송하지 않기 때문에, 반송 메일이 발생하지는 않겠지만
Mailgun Log에는 발송 Fail로 기록이 남습니다.
별로 좋은 기록은 아니므로 정규표현식을 사용하여 검증을 추가했습니다

if(!emailId.matches("^[a-zA-Z0-9]+$")){  
    throw new ApiException(EMAIL_NOT_FORMAT);  
}

'.'과 같은 특수문자를 허용하는 이메일 서버도 있으나,
학교 이메일 발송 주소록을 확인했을 때, 특수문자를 포함하는 이메일 주소는 없었습니다.
따라서 대소문자 영문자와 숫자 형식만 이메일 주소로 포함하도록 검증로직을 추가했습니다

수신차단

수신차단의 경우에는 블랙리스트에 넣어 이후 발송을 못하도록 막는 방법이 있습니다.
Mailgun 서비스 자체에서 블랙리스트로 관리하거나 서버 자체에서 막으면 됩니다.

수신차단 테스트

서버에서 수신차단 목록을 관리한다면 Mailgun API 요청 없이 차단할 수 있고,
사용자에게 메일을 발송할 수 없는 이유도 전달할 수 있습니다.

서버에서 수신차단 목록을 관리하기 위해서
어떤 양식으로 오류메세지가 전달되는지 확인이 필요했습니다.
따라서 개인 학교 이메일로 수신차단 목록에 넣은다음 이메일 발송 테스트를 진행했습니다

하지만 예상치 못한 결과를 얻었습니다

반송메일을 보내지 않는 메일 서버


수신자의 메일함에 도착하지는 않으면서,
Mailgun 서비스에도 반송메일이 도착하지 않았습니다


여러 번 테스트한 결과도 동일했기 때문에,
학교 메일 서버 자체에서 반송메일을 안 보내는 것 같다고 예상했습니다.

추가 테스트

다른 경우에도 반송메일을 보내지 않는지 테스트하고 위해
이번에는 아무도 가지고 있지 않을 것 같은 메일주소로 테스트했습니다.
해당 경우에도 반송메일을 받지 못했습니다


Mailgun에서는 정상적으로 이메일을 발송했다는 로그를 확인할 수 있습니다.
따라서 이메일은 정상적으로 발송되나,
학교 메일서버에서 오류가 발생해도 반송메일을 안 보낸다라고 결론을 내렸습니다

운영적인 대응방법

반송메일을 받지 않는다면, 도메인 평판과 관련해서도 크게 신경 쓸 필요가 없어집니다.

또한 이메일 발송 대상이 학교 이메일로만 한정되기 때문에,
다른 도메인의 경우 신경 쓸 필요가 없으며
이메일 형식 오류를 방지하기 위한 예외 처리를 유지한다면
위협이 되는 요소는 크게 없을 것으로 예상됩니다

하지만 반복해서 사용자에게 이메일이 도착하지 않는다면, 사용자의 이탈로 이어질 수 있습니다.
따라서 사용자가 적절한 대응을 할 수 있도록 알려줘야 합니다.

사용자가 일정시간 이상 이메일을 수신받지 못하는 경우를 대비하여,
수신메일함 용량 확인, 수신차단 확인, 관리자 연락 등의 내용을
발송 확인 알림에 추가하는 대응방법을 생각했습니다

해당 문구를 통해서 사용자가 적절한 대응을 할 수 있도록 한다면,
사용자가 서비스를 정상적으로 이용할 수 있도록 운영적으로 대처할 수 있을 것입니다.

마무리

이메일 서비스와 관련된 정리가 끝났습니다.
관련된 내용에 대해 깊이있게 학습할 수 있어서 좋은 시간이었습니다

정리과정에서 개발 도중에는 생각하지 못한 부분을 발견해 개선할 수 있었고
이메일과 관련된 개념에 대해 깊게 이해할 수 있었습니다.

길었던 이메일 서비스 이야기를 읽어주셔서 감사합니다.

참고:

profile
Software Developer

0개의 댓글