Django로 서버 개발 중 이메일을 보내고 싶어서 찾아보니 Django 만으로 이메일을 보낼 수 있었다.
Django를 사용해서 이메일을 보낼 것이므로 Django부터 설치
pip install Django
settings.py에 app 추가
INSTALLED_APPS = [
...
'app_name',
...
]
settings.py에 SMTP 관련한 설정을 추가한다.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.naver.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = '{email 발송할 계정의 이메일}'
EMAIL_HOST_PASSWORD = '{이메일 계정 비밀번호}'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_HOST_USER와 EMAIL_HOST_PASSWORD에는 발송하려는 이메일의 계정 정보를 입력한다.EMAIL_HOST에는 네이버 메일인 경우 위와 같이 작성하며 구글메일인 경우 'smtp.gmail.com'을 입력하면 된다.EMAIL_BACKEND, EMAIL_USE_TLS, EMAIL_PORT 설정은 구글/네이버 메일 모두 동일하다.view파일에 작성해도 되지만, 나는 파일을 따로 분리하여 utils.py 라는 이름으로 작성하였다.
import random
import string
from django.core.mail import EmailMessage
from django.contrib.auth import get_user_model
from django.template.loader import render_to_string
User = get_user_model()
def send_temp_password_email(user, temp_password):
title = '메일 제목 입력'
content = {
"message": '메일 내용 입력',
}
receive_email = [user.email]
from_email = '발송하는 메일 정보 입력'
emailContent = render_to_string('email.html', content)
emailObject = EmailMessage(subject=title, body=emailContent, to=receive_email, from_email=from_email)
emailObject.content_subtype = "html"
emailObject.send()
send_temp_password_email 메서드의 코드를 한줄씩 보면 다음과 같다.
먼저,
emailContent = render_to_string('email.html', content)
이 코드는 내가 작성해둔 email.html 파일에 content 변수 내용을 입력하여 이를 str 타입으로 렌더링 하는 부분이다.
이 emailContent를 이메일 내용으로 담아 보내는 부분은 아래 코드이다.
emailObject = EmailMessage(subject=title, body=emailContent, to=receive_email, from_email=from_email)
emailObject.content_subtype = "html"
emailObject.send()
EmailMessage()를 이용해 보내는데,
subject)은 위에서 선언해둔 title로, body)은 위에서 만든 emailContent로, to)은 receive_email, from_email)은 from_email = '발송하는 메일 정보 입력'메일 내용은 html 이므로, emailObject.content_subtype = "html"를 통해 이메일 내용의 subtype이 html이라고 명시해준다.
그리고 emailObject.send()를 통해 이메일을 발송하게 된다.
from_email에ㅁㅁㅁ <보낼 이메일@naver.com>이런 식으로 작성하면
메일에서ㅁㅁㅁ <보낼 이메일@naver.com>이렇게 보인다.
(맨 아래 이미지 참고)
EmailMessage 클래스를 살펴보면 객체가 생성될 때 다음과 같은 argument들을 받을 수 있도록 되어 있다.
class EmailMessage:
...
def __init__(
self,
subject="",
body="",
from_email=None,
to=None,
bcc=None,
connection=None,
attachments=None,
headers=None,
cc=None,
reply_to=None,
):
...
EmailMessage가 어떻게 동작하는지는 IDE에서 열어보면 잘 알 수 있으므로 여기서는 넘어가도록 한다.
이메일 내용으로 문장만 보낼 수도 있지만, 다른 사이트들처럼 글자 색도 입히고, 크기도 다르게 설정하거나 이미지도 넣고 싶을 것이다.
이를 위해 email.html 파일을 생성하여 이를 보내면 된다.
파일 이름은 자유롭게 작성하고, 위의 utils.py 에서 작성한 것처럼 어떤 html을 보내는 것인지 설정만 잘 해주면 된다.
같은 html 파일이어도 CSS를 어떻게 작성했는지에 따라 구글 메일과 네이버 메일에서 보이는 것이 다르다.
- 구글 메일: internal style sheet로 해도 CSS가 적용된다.
- 네이버 메일: inline으로 적용해야 모든 CSS가 적용된다.
처음에는 하던대로 외부 스타일 시트로 작성했다가 적용되지 않은 것을 보고 내부 스타일 시트로 수정도 해보았지만 구글메일에서만 적용되어 결국 인라인 스타일로 수정하였다.
이미지는 외부에서 열어볼 수 있는 링크면 구글 / 네이버 메일 모두 볼 수 있다.
(프로젝트 서버에 올려둔 이미지를 삽입해봤자 메일에서는 볼 수 없었다..)
프로젝트 당시에는 메일에 넣어 보낼 이미지를 S3에 업로드 한 뒤, public으로 접근할 수 있는 CDN 링크를 삽입하여 보내는 방식으로 처리하였다.
...
<img src="{외부에서 접근 가능한 이미지 링크}" style="height:200px;">
<h1 style="color: #7269FF; padding-top: 10px;">임시 비밀번호 발급 안내</h1>
<div class="label">
<p style="margin: 30px 0px; color: #251F4B;">
기재된 임시 비밀번호로 로그인 하신 후 <br>
비밀번호를 변경해 주시기 바랍니다.
</p>
</div>
<div class="output" style="color: #251F4B; font-weight: bolder; margin: 20px 0px;">임시 비밀번호 : {{ message }}</div>
...
대략 이런 식으로 인라인 스타일로 적용해주었다.
위에서 만들어둔 utils.py를 import 하고 필요한 함수 내에서 이를 호출하기만 하면 된다.
# 호출 예시
# 같은 폴더 내에 존재하는 파일이라면 from .utils, 다른 폴더라면 from ..utils
from .utils import send_temp_password_email
def reset_password(request):
...
send_temp_password_email(argument1, argument2)
...
다른 라이브러리를 쓰지 않고도 Django 만으로도 이메일을 보낼 수 있다.
이미지 삽입, CSS 적용도 생각보다 간단했다.
구글 메일
네이버 메일
보안 수준이 낮은 앱 및 Google 계정 설정을 해주어야하는데, 이는 2023년 5월부터 일반 계정에서 중지되었다. workspace를 쓰면 된다는데, 이는 유료라 네이버 메일을 사용했다.GitHub
utils.py
https://github.com/tein408/webmage/blob/main/manda_project/manda_app/manda_views/utils.pyemail.html
https://github.com/tein408/webmage/blob/main/manda_project/manda_app/templates/email.html