Pular para o conteúdo

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#

dataforge
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:

dataforge
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#

dataforge
out m.prever()
// {de: …, para: [ana@…, auditoria@…], assunto: …,
//  texto: …, html: …, anexos: [{nome: P-1.pdf, bytes: 84213}], tamanho: 85102}

Enviar#

dataforge
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"]
PortaO quê
587STARTTLS — o padrão
465TLS direto
25sem 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:

dataforge
caixa := Email.caixa()
caixa.enviar(m)

assert len(caixa.para("ana@exemplo.br")) is 1
assert caixa.ultimo()["assunto"] is "Seu pedido"