Você está criando um pequeno site, hospedado gratuitamente, seja para experimentar ou começar um projeto promissor. Mas, está sem condições de "pagar" por um servidor de e-mail descente para enviar e-mails automatizados pelo site. É possível enviar e-mails pelo Google / Gmail, conectando a conta a um aplicativo, por exemplo, usando Python / Django.
Com o Django é bem simples. Você configura o backend SMTP no settings.py e depois usa send_mail() ou EmailMessage().
Verifique e adicione as linhas abaixo no final do arquivo:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'seu_email@gmail.com'
EMAIL_HOST_PASSWORD = 'xxxx xxxx xxxx xxxx' # senha de aplicativo
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
A senha de aplicativo é obtida nesta página e exige que o endereço de e-mail tenha a autenticação multifatores ativada.
⚠ IMPORTANTE!
Nunca compartilhe esta senha no GitHub, em um prompt de IA ou qualquer outro local. Caso aconteça, revogue a senha e crie outra.
Para SSL na porta 465:
EMAIL_PORT = 465
EMAIL_USE_SSL = True
EMAIL_USE_TLS = False
Mas normalmente a configuração mais comum e compatível é TLS + porta 587.
Em qualquer view, comando ou shell:
from django.core.mail import send_mail
send_mail(
subject='Teste Django',
message='Funcionou!',
from_email=None, # usa DEFAULT_FROM_EMAIL
recipient_list=['destinatario@gmail.com'],
fail_silently=False,
)
Se tudo estiver correto, o e-mail será enviado imediatamente.
Para mensagens formatadas com HTML:
from django.core.mail import EmailMultiAlternatives
email = EmailMultiAlternatives(
subject='Teste HTML',
body='Seu cliente de e-mail não suporta HTML.',
from_email=None,
to=['destinatario@gmail.com']
)
html = """
<h1>Olá!</h1>
<p>Este e-mail foi enviado pelo <b>Django</b>.</p>
"""
email.attach_alternative(html, "text/html")
email.send()
from django.http import HttpResponse
from django.core.mail import send_mail
def send_test_email(request):
send_mail(
'Bem-vindo!',
'Seu cadastro foi realizado com sucesso.',
None,
['cliente@email.com']
)
return HttpResponse('E-mail enviado!')
Isso costuma ficar mais organizado:
from django.template.loader import render_to_string
from django.core.mail import EmailMultiAlternatives
html = render_to_string(
'emails/welcome.html',
{
'name': 'Luferat',
}
)
email = EmailMultiAlternatives(
subject='Bem-vindo!',
body='Seu cliente não suporta HTML.',
to=['destinatario@gmail.com']
)
email.attach_alternative(html, 'text/html')
email.send()
O ideal é usar variáveis de ambiente:
import os
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
Crie ou edite o arquivo .env:
EMAIL_HOST_USER=seu_email@gmail.com
EMAIL_HOST_PASSWORD=abcd efgh ijkl mnop
Se estiver usando o pacote python-dotenv:
from dotenv import load_dotenv
load_dotenv()
Lembre-se de nunca enviar o arquivo .env final para a Internet! Adicione-o ao .gitignore.
Alguns problemas, podem surgir. Antes de "entrar em pânico", veja algumas possibilidades:
SMTPAuthenticationError
A conta não possui autenticação em dois fatores.
A senha de aplicativo está incorreta.
Você usou a senha normal da conta ao invés da senha de aplicativo.
ConnectionRefusedError
Firewall bloqueando a porta 587.
Antivírus interceptando conexões SMTP.
SMTPServerDisconnected
Mistura de TLS e SSL:
Erros comuns: tive esse problema ao pedir ajuda para uma IA.
EMAIL_PORT = 587
EMAIL_USE_SSL = True
O correto, se usar TLS, é:
EMAIL_PORT = 587
EMAIL_USE_TLS = True
ou, usando SSL:
EMAIL_PORT = 465
EMAIL_USE_SSL = True
Inicie um shell do Django:
python manage.py shell
Comande:
from django.core.mail import send_mail
send_mail(
'Teste',
'Mensagem de teste',
None,
['seu_outro_email@gmail.com']
)
Se retornar:
1
Significa que o Django entregou a mensagem ao servidor SMTP do Google com sucesso. O resto do caminho (spam, filtros etc.) passa a ser responsabilidade do provedor do destinatário.