1. 이메일로 인증하기

 

보통 회원가입을 위해 이메일을 입력하면 이메일 인증 절차를 거친다. 해당 이메일이 실제 사용자가 사용하는 이메일인지를 인증하기 위해서, 이메일로 링크를 보내고 사용자가 그 링크를 열면 인증이 완료되는 방식이다. 

 

이메일로 보내지는 링크에는 여러 정보가 포함되어 있다. 회원가입으로 생성된 유저의 pk(primary key)를 인코딩한 값이나 고유한 토큰을 쿼리 스트링(query string)으로 받기도 한다. 

 

이번에 구현하는 기능에서는 사용자(유저)의 필드에 계정의 활성화 여부를 나타내는 필드를 사용했다. 

 

즉 이메일 인증이 없다면 입력한 정보 그대로 사용자 계정이 만들어지고 로그인이 된다. 반면 인증이 있다면 사용자 계정은 만들어지지만, 사용자의 활성화 필드가 False로 되어 있어서 계정은 있지만 로그인은 할 수 없다. 로그인하려면 이메일로 전송된 링크를 클릭해야 한다. 

 

따라서 이런 식의 이메일 인증을 구현해 둘 생각이라면, 처음부터 사용자(User) 모델에 계정 활성화 필드(is_active)를 만들고 처음부터 이를 적극 활용하자. 

 

 

2. 이메일로 폼 만들기

 

그러나 이런 링크 하나만 달랑 보내지는 않는다. 요즘 웹사이트들은 html 템플릿에 적절한 텍스트와 링크를 함께 실어서 보내준다. 

 

그러면 그냥 html 파일을 작성하고 이 파일에 적당한 매개변수 넣어서 이메일로 보내면 되는 거 아니야? 라고 할 수 있지만 그렇지 않다. 왜냐하면 html은 단순 텍스트(plain text)가 아니라 일종의 multiform, multipart data처럼 복잡한 데이터로 보기 때문이다. 그러니까 html을 일반 텍스트처럼 매개변수를 넣어서 보낸다면 html 템플릿이 코드로 깨져서 전송된다.

 

요즘은 이메일을 보내는 전용 라이브러리도 많고, html 퍼블리싱이 번거로울 때 사용할 수 있는 템플릿 사이트도 많다고 한다. 

 

내가 했던 삽질(...)은 다음과 같다. 

 

1. html 템플릿에서 장고의 autoescape 템플릿 문법 사용

2. EmailMessage 클래스

3. EmailMultipart 클래스

4. MIMEApplication, MIMEText 등 MIME 클래스 -> 성공

 

사실 EmailMessage나 EmailMultipart 클래스를 통해서도 이메일을 보낼 수 있었을지도 모른다(내가 방법을 몰랐을 뿐). 다행히도 MIME 클래스 타입의 인스턴스를 만들고, 여러 타입의 컨텐츠를 attach() 메소드를 통해서 붙일 수 있었다. 그래서 html 폼 뿐만 아니라 이미지, pdf 등의 파일을 한번에 붙여서 이메일로 보내는 것도 가능했다. 

 

 

3. 이메일 컨텐츠 구성하기

 

2번이 끝나면 다 되었겠거니 생각했다. 하지만 3번에서도 문제는 발생했다. 

 

1) 이메일 템플릿에서는 css 파일이나 style 태그를 통해서 스타일을 적용할 수 없다. html 안 개별 코드의 style 속성을 이용해야 스타일이 폼에 적용된다. 왜냐하면 이메일을 보내기 위해 폼을 인식시킬 때 style 태그를 인식하지 않기 때문이다. 

2) 메일을 확인하는 도메인에 따라서 보여지는 결과가 다를 수 있다. 같은 폼을 보냈는데 Gmail에서는 잘 나왔지만, 네이버 메일에서는 어떤 버튼의 밑부분이 약간 짤려서 나왔다. 

3) body 태그에서 스타일 속성을 적용하면 잘 적용되지 않는다. body 태그 내부에 table 태그를 한번 더 선언해 주자. 

 

 

4. 아쉬웠던 점

1) Gmail에서는 잘 나오던 html 버튼이 네이버 메일에서는 밑부분이 약간 짤려서 나왔었다. 그러나 배포까지 해당 오류를 해결할 시간이 빠듯해서 그냥 버튼을 링크로만 바꿨었다. 

2) EmailMessage, EmailMultipart 클래스 등을 제대로 알아보지 않고 주먹구구식으로 오류를 해결했었다. 오류 원인을 파악하고 잘 접근하기 위해선 관련 클래스의 역할, 메소드 등을 간략하게나마 파악하는 것이 참 중요한 것 같다..!

 

'개발 일기장 > 개발 일지' 카테고리의 다른 글

0706 WED 업무 일지  (0) 2022.07.07

+ Recent posts