본문 바로가기

About/Flask

[Flask] Jinja2 템플릿을 이용한 이메일 생성

플라스크는 텍스트 기반의 문서를 다루기 위해 Jinja라는 템플릿 엔진을 포함한다. 플라스크가 Jinja와 통합한 주된 이유는 HTML 문서를 생성하기 위해서이다. render_template() 같은 함수는 Jinja 템플릿과 주어진 테스트를 사용해 응답을 만든다.

 

Jinja는 꼭 HTML 이나 다른 태그 기반의 문서만 사용할 수 있는 것은 아니고, 텍스트 기반이라면 어떤 문서도 만들 수 있다.

 

다음은 이메일 템플릿의 예시이다.

Date: {{date}}
From: {{from}}
Subject: {{subject}}
To: {{to}}
Content-Type: text/plain

Hello {{name}},

We have received your payment!

Below is the list of items we will deliver for lunch:

{% for item in items %} - {{item['name']}} ({{item['price']}} in Euros)
{% endfor %}

Thank You for your business!

--
Jimmy

 

Jinja는 두 개의 중괄호로 변수를 표시한다. 런타임에 Jinja에 전달될 수 있다면 어떤 것도 변수가 될 수 있다.

 

파이썬의 if와 for도 다음과 같은 표기로 템플릿 내에 직접 사용할 수 있다.

{% for x in y % }...{% endfor %}
{% if x %}...{% endif %}

 

따라서 다음은 이메일 템플릿을 이용해 이메일 텍스트를 생성하는 코드이다.

from datetime import datetime
from jinja2 import Template
from email.utils import format_datetime

data = {
    'date': format_datetime(datetime.now()),
    'to': 'to@example.com',
    'from': 'from@example.com',
    'subject': 'example subject',
    'name': 'Jimmy',
    'items': [{'name': 'Burger', 'price': 4.5},
              {'name': 'Fries', 'price': 2},
              {'name': 'Coke', 'price': 1}]
}


def render_email(**data):
    with open('email_template.eml') as f:
        template = Template(f.read())
    return template.render(**data)

print(render_email(**data))

 

실행 결과

실행 결과

 


다음 도서를 참고하였습니다.

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=191830482