Relatório semanal que precisa ir para o chefe toda sexta, aviso para clientes quando um arquivo está pronto, alerta quando um script termina: enviar e-mails por código é uma das automações mais úteis e das mais simples de montar. O cuidado maior não está no código, e sim em como guardar a senha.
Como o envio funciona por trás
O e-mail trafega por um protocolo chamado SMTP. Seu script se conecta ao servidor SMTP do provedor (Gmail, Outlook, o da sua hospedagem etc.), se identifica com usuário e senha e entrega a mensagem. Os dados de conexão você encontra na ajuda do provedor:
- o endereço do servidor SMTP;
- a porta, que costuma ser 587 (com início de conexão segura STARTTLS) ou 465 (conexão segura desde o começo);
- o usuário, normalmente o próprio endereço de e-mail.
O Python já traz tudo o que precisa na biblioteca padrão: smtplib para a conexão e email.message para montar a mensagem. Não é preciso instalar nada.
Passo 1: gerar uma senha de app
Muitos provedores não aceitam mais a senha normal em programas externos, principalmente quando a verificação em duas etapas está ativa (e ela deveria estar, como explica verificação em duas etapas: o que é). A solução é criar uma senha de app:
- entre na página de segurança da sua conta;
- confirme que a verificação em duas etapas está ligada;
- procure a opção de senhas de app (o nome e o caminho variam conforme o provedor);
- crie uma para o seu script e copie o código mostrado.
Essa senha aparece uma vez. Guarde-a com cuidado, como veremos a seguir. Se o provedor da sua conta não oferece esse recurso, consulte a documentação dele para a forma oficial de autenticar programas.
Passo 2: guardar a senha fora do código
Escrever a senha dentro do arquivo .py é o erro mais perigoso: se você enviar o arquivo a alguém, subir para o GitHub ou colar numa IA, a senha vai junto. Em vez disso, use variáveis de ambiente. No script, você lê o valor com os.environ. O passo a passo está em variáveis de ambiente e arquivo .env.
Resumo da regra: no código fica só o nome da variável. O valor fica no ambiente da máquina ou num arquivo .env que nunca vai para o repositório.
Passo 3: montar e enviar a mensagem
A sequência de um envio simples é:
- criar um objeto EmailMessage;
- preencher os campos From, To e Subject (remetente, destinatário e assunto);
- definir o corpo com set_content;
- abrir a conexão com smtplib.SMTP (ou SMTP_SSL na porta 465);
- se usar a porta 587, chamar starttls;
- fazer login com usuário e senha de app;
- chamar send_message e fechar a conexão.
Usar o bloco with faz a conexão fechar sozinha mesmo se der erro.
Anexos e vários destinatários
Para anexar um arquivo, leia os bytes dele e use o método add_attachment, informando o tipo (por exemplo, application/pdf) e o nome. Para vários destinatários, você pode repetir o envio em um laço, personalizando o nome de cada pessoa na mensagem. Isso é mais indicado que colocar todos no campo Para, o que expõe os endereços entre si.
Se o corpo precisa de formatação, o EmailMessage aceita uma versão HTML além do texto simples. Mantenha sempre uma versão em texto, porque ajuda na entrega e na leitura.
Por que o e-mail pode cair no spam
O envio por script funciona, mas a entrega depende da reputação do remetente. Para reduzir o risco:
- envie só para quem espera ou pediu para receber;
- use assunto claro, sem excesso de maiúsculas e exclamações;
- evite muitos links e anexos pesados;
- não envie dezenas de mensagens de uma vez a partir de uma conta pessoal;
- se usa domínio próprio, configure a autenticação (SPF, DKIM e DMARC) no painel de DNS, seguindo a orientação do seu provedor de e-mail.
Mensagens comerciais precisam de consentimento e de forma de descadastro, conforme a LGPD. Para ver mais, leia LGPD para pequenas empresas.
Erros comuns
- Falha de autenticação: senha errada, senha de app não criada ou acesso bloqueado pelo provedor. Releia a mensagem de erro (veja como ler mensagens de erro).
- Tempo esgotado: porta errada ou rede que bloqueia saída SMTP.
- Acentos quebrados: o EmailMessage já cuida da codificação, mas teste mesmo assim.
- Limite de envios: provedores gratuitos limitam mensagens por dia.
Ideias de uso que respeitam quem recebe
Nem todo e-mail automático é bem-vindo. Os usos mais seguros e úteis costumam ser:
- Avisos para você mesmo: o script terminou, o backup falhou, o site saiu do ar.
- Relatórios internos: o resumo semanal que a equipe espera receber.
- Confirmações pedidas pela pessoa: quem preencheu um formulário e aguarda o retorno.
- Lembretes combinados: prazos e vencimentos que o destinatário solicitou.
Evite mandar mensagens promocionais para quem não pediu. Além de irritar, isso pode violar a LGPD e levar sua conta ao bloqueio. Quando a mensagem for de marketing, inclua sempre uma forma clara de a pessoa deixar de receber.
Para começar
Faça um primeiro script que envie um e-mail de teste para si mesmo com senha de app em variável de ambiente. Quando funcionar, combine com uma tarefa agendada, como em agendar tarefas no computador, para receber seu relatório sem tocar em nada.