Arcane.Email
Montar e enviar e-mail: texto e HTML juntos, anexos, cópia oculta que não vaza e caixa de teste.
Todo sistema manda e-mail: a confirmação de cadastro, a redefinição de senha, o relatório de madrugada. Não havia como, e a saída era chamar um serviço de fora por HTTP — o que funciona e cobra por mensagem.
Montar#
adopt Arcane.Email as Email
m := Email.mensagem("forja@exemplo.br", "ana@exemplo.br", "Seu pedido")
m.html("<h1>Obrigado</h1><p>Pedido <b>P-1</b> confirmado.</p>")
m.copia_oculta(["auditoria@exemplo.br"])
m.anexar("notas/P-1.pdf")HTML ganha alternativa em texto#
Sem ela, o cliente de texto puro mostra a marcação crua — e é o que boa parte dos leitores de tela recebe. Quando você não passa uma, ela é derivada do HTML:
m.html("<h1>Olá</h1><p>tudo bem</p>")
out m.prever()["texto"] // "Olá tudo bem"
m.html(corpo_rico, alternativa := "Seu pedido P-1 foi confirmado.")A cópia oculta não vai no cabeçalho#
Um Bcc escrito no cabeçalho é visível para todo mundo — o oposto do que ele significa. Aqui ele entra só na lista de entrega.
Prever antes de mandar#
out m.prever()
// {de: …, para: [ana@…, auditoria@…], assunto: …,
// texto: …, html: …, anexos: [{nome: P-1.pdf, bytes: 84213}], tamanho: 85102}Enviar#
r := Email.enviar(m, "smtp.exemplo.br", porta := 587,
usuario := "forja@exemplo.br", senha := OS.env("SMTP_SENHA"))
out r["entregues"], r["recusados"], r["ok"]| Porta | O quê |
|---|---|
587 | STARTTLS — o padrão |
465 | TLS direto |
25 | sem cifra (seguro := no) |
Quando o login é recusado, a mensagem lembra o que costuma ser: muitos provedores exigem uma senha de aplicativo, e não a senha da conta.
Caixa de teste#
O mesmo contrato, sem mandar nada — então o código que envia não muda entre o teste e a produção:
caixa := Email.caixa()
caixa.enviar(m)
assert len(caixa.para("ana@exemplo.br")) is 1
assert caixa.ultimo()["assunto"] is "Seu pedido"