Como fazer envio de e-mail com template HTML customizavél no corpo do e-mail. Para isso vamos utilizar uma biblioteca nativa do Django EmailMessage.
Vídeo Tutorial Link
Configurações Iniciais
Ambiente Virtual Linux/Windows
-
Ambiente Virtual Linux/Windows
Lembrando… Precisa ter Python instalado no seu ambiente.
Criar o ambiente virtual Linux/Windows
## Windows python -m venv .venv source .venv/Scripts/activate # Ativar ambiente ## Linux ## Caso não tenha virtualenv. "pip install virtualenv" virtualenv .venv source .venv/bin/activate # Ativar ambiente
Instalar os seguintes pacotes.
pip install django pip install pillow
Para criar o arquivo requirements.txt
pip freeze > requirements.txt
Criando o Projeto
Configurar Settings e Arquivos Static
-
Configurar Settings e Arquivos Static
import os # base_dir config BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEMPLATE_DIR = os.path.join(BASE_DIR,'templates') STATIC_DIR=os.path.join(BASE_DIR,'static') # Database DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } STATIC_ROOT = os.path.join(BASE_DIR,'static') STATIC_URL = '/static/' MEDIA_ROOT=os.path.join(BASE_DIR,'media') MEDIA_URL = '/media/' # Internationalization # Se quiser deixar em PT BR LANGUAGE_CODE = 'pt-br' TIME_ZONE = 'America/Sao_Paulo' USE_I18N = True USE_L10N = True USE_TZ = True
urls.py
from django.contrib import admin from django.conf import settings from django.conf.urls.static import static from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ] urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # Adicionar Isto urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # Adicionar Isto
Criando Aplicativo
Template base e Bootstrap Configuração
-
Template base e Bootstrap Configuração
Doc: https://getbootstrap.com/docs/5.2/getting-started/introduction/
Com Base na documentação para utilizar os recursos Boostrap basta adicionar as tags de CSS e JS. No HTML da Pagina Base.
<!-- CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> <!-- JS --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
1 - criar um arquivo base base.html onde vamos renderizar nosso conteúdo.
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}{% endblock %}</title> <!-- CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> </head> <body> {% block content %} {% endblock %} <!-- JS--> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script> </body> </html>
Iniciar Aplicativo
-
Iniciar Aplicativo
myapp/templates/form-contact.html
{% extends 'base.html' %} {% block title %}Formulário de Contato{% endblock %} {% block content %} <h1> Formulário aqui</h1> {% endblock %}
myapp/views.py
from django.shortcuts import render # Create your views here. def contact_me(request): return render(request, 'form-contact.html')
criar arquivo myapp/urls.py
from django.urls import path from myapp import views urlpatterns = [ path('', views.contact_me, name='contact'), ]
urls.py do projeto. core/urls.py
from django.contrib import admin from django.urls import path, include # adicionar include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include('myapp.urls')), # url do app ] urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # Adicionar Isto urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # Adicionar Isto
Rodar o projeto para ver como está.
python manage.py makemigrations && python manage.py migrate python manage.py runserver
Cria modelo formulário
-
Cria modelo formulário
myapp/models.py
from django.db import models # Create your models here. class ContactMe(models.Model): name = models.CharField(max_length=50) email = models.EmailField(max_length=100) subject = models.CharField(max_length=100) message = models.TextField()
Criar arquivo myapp/forms.py
from django import forms from .models import ContactMe class ContactMeForm(forms.ModelForm): class Meta: model = ContactMe fields = ['name', 'email', 'subject', 'message'] def __init__(self, *args, **kwargs): # Adiciona super().__init__(*args, **kwargs) for field_name, field in self.fields.items(): field.widget.attrs['class'] = 'form-control'
myapp/templates/form-contact.html
{% extends 'base.html' %} {% block title %}Formulário de Contato{% endblock %} {% block content %} <form method="POST" autocomplete="off"> <h4>Entre em contato conosco</h4> {% csrf_token %} {{form}} <button type="submit" class="btn btn-success">Salvar</button> </form> {% endblock %}
myapp/views.py
from django.shortcuts import render, redirect from .forms import ContactMeForm # Create your views here. def contact_me(request): if request.method == 'POST': form = ContactMeForm(request.POST) if form.is_valid(): form = form.save(commit=False) form.save() return redirect('contact') else: form = ContactMeForm() return render(request, 'form-contact.html', {'form': form})
Vamos rodar o projeto e testar.
python manage.py makemigrations python manage.py migrate
Já está salvando as informações.
Configura Envio de E-mail
-
Configura Envio de E-mail
Vamos utilizar a bilbioteca nativa do Django para envio de e-mail. EmailMessage.
Na documentação tem um exemplo que vamos seguir
https://docs.djangoproject.com/en/4.1/topics/email/
Mas antes vamos precisar configurar nosso servidor para envio de email. (não vamos utilizar backend email do django não. Fica tranquilo) Vamos configurar envio de e-mail real.
Eu vou utilizar Host do outlook.com, mas pode ser qualquer um de sua preferencia. Gmail, yahoo, mail.
Para usar uma configuração diferente você precisará do HOST, PORT, TLS. As demais informações você preenche com suas credenciais.
core/settings.py
# Host do outlook tenho essas configurações. EMAIL_HOST = 'smtp.office365.com' EMAIL_HOST_USER = 'seu e-mail do outlook' EMAIL_HOST_PASSWORD = 'sua senha do outlook' EMAIL_PORT = 587 EMAIL_USE_TLS = True DEFAULT_FROM_EMAIL = 'seu email do outlook' SERVER_EMAIL = DEFAULT_FROM_EMAIL
myapp/views.py
Para pegar as informações do formulário e disparar o email, vamos utilizar
request.POST.get()
def contact_me(request): if request.method == 'POST': form = ContactMeForm(request.POST) if form.is_valid(): form = form.save(commit=False) form.save() # data, puxo as informações dos campos name, email, subject. data = { 'name': request.POST.get('name'), 'email': request.POST.get('email'), 'subject': request.POST.get('subject'), } sendmail_contact(data) # Aqui vou criar uma função para envio # chamei de sendmail_contact return redirect('contact') else: form = ContactMeForm() return render(request, 'form-contact.html', {'form': form})
Vamos criar uma função para envio de e-mail. Está igual a documentação, apenas acrescentei um detalhe. get_template para ler o template.html e .render(data) renderiza as informações no template. Então message_body que é nosso template será enviado no
from django.conf import settings from django.template.loader import get_template from django.core.mail import EmailMessage def sendmail_contact(data): message_body = get_template('send.html').render(data) sendmail = EmailMessage('Formulário de Contato', message_body, settings.DEFAULT_FROM_EMAIL, to=['leticialimacgi@gmail.com']) sendmail.content_subtype = "html" return sendmail.send()
Cria um template para envio de e-mail. Chamei de send.html
myapp/templates/send.html
{% extends 'base.html' %} {% block title %}Formulário de Contato{% endblock %} {% block content %} <h1>Envia Formulario de contato</h1> <p>{{name}}</p> <p>{{email}}</p> <p>{{subject}}</p> {% endblock %}
python manage.py runserver
Como Converter template HTML para PDF e enviar por e-mail com Weasyprint. Link