Repository navigation
email envio
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Nível: iniciante
Em uma frase: TRALSMTPClient envia uma mensagem por SMTP, com TLS e
login; TRALMailQueue envia em segundo plano e tenta de novo quando o servidor falha;
TRALDKIMSigner assina o que sai para os provedores confiarem no seu domínio.
Você vai precisar: o pacote RALModuleMailPackage (e-mail); OpenSSL ao
lado do executável para TLS; o servidor SMTP do seu provedor (endereço, porta,
usuário e senha, ou um token OAuth2).
uses RALMailMIME, RALSMTPClient;
procedure Enviar(AMsg: TRALMailMessage);
var
vSMTP: TRALSMTPClient;
begin
vSMTP := TRALSMTPClient.Create(nil);
try
vSMTP.Host := 'smtp.minhaempresa.com.br';
vSMTP.Security := msStartTLS; // porta 587
vSMTP.UserName := 'vendas@minhaempresa.com.br';
vSMTP.Password := 'senha';
vSMTP.Send(AMsg);
finally
vSMTP.Free;
end;
end;Send espera a resposta do servidor. Um destinatário recusado não impede os outros:
Results[i] diz o que o servidor respondeu a cada um (Code, Reply, Accepted).
Se nenhum for aceito, ou se o servidor recusar a mensagem, sai um ERALSMTPError
com o código (Code, 550 por exemplo) e o código estendido (Enhanced, 5.1.1).
Security |
porta padrão | o que faz |
|---|---|---|
msStartTLSIfOffered (padrão) |
25 | liga o TLS se o servidor oferecer |
msStartTLS |
587 | exige o TLS (STARTTLS); falha se o servidor não oferecer |
msImplicitTLS |
465 | TLS desde o primeiro byte ("SMTPS") |
msNone |
25 | sem TLS; só em rede interna |
Port 0 usa a porta padrão do modo. O certificado do servidor é conferido como no
cliente REST: SSL.CAFile, SSL.ServerName, SSL.Verify.
AuthMethod em maAuto escolhe pelo que o servidor oferece: com um token, XOAUTH2 ou
OAUTHBEARER; sem token, SCRAM-SHA-256 (a senha não atravessa a rede), depois PLAIN e
LOGIN (a senha vai como está: use com TLS). Para Gmail e Microsoft 365 com OAuth2, preencha
AccessToken, ou responda OnGetAccessToken, chamado a cada login, para entregar um
token sempre válido.
O cliente usa sozinho o que o servidor oferece; você não precisa ligar nada:
-
conexão mantida (
KeepConnection): várias mensagens no mesmo TCP e TLS; se o servidor fechou a conexão parada, a próxima abre outra sem erro; -
PIPELINING:
MAIL, todos osRCPT(eDATA) numa escrita só; -
CHUNKING (
BDAT): a mensagem vai inteira, sem a varredura de pontos doDATA; - 8BITMIME e SMTPUTF8: texto e endereços acentuados sem recodificar;
- SIZE: uma mensagem grande demais é recusada antes de enviar um byte.
Com um servidor que oferece tudo isso, uma mensagem custa duas idas e voltas.
OnLog mostra a conversa com o servidor, com senha e token mascarados. O verbo
"Testar conexão" (clique direito no componente) conecta, faz o login e mostra o
que o servidor oferece.
uses RALMailQueue;
FFila := TRALMailQueue.Create(Self);
FFila.Client := FSMTP; // o TRALSMTPClient configurado
FFila.Folder := 'C:\MeuApp\fila-email';
FFila.Workers := 2;
FFila.OnBounced := FilaRecusou;
FFila.Active := True;
...
FFila.Enqueue(vMsg); // volta na hora; o envio é em segundo plano- As mensagens ficam em
Folder: o programa pode fechar e abrir de novo que nada se perde.Foldervazio guarda na memória. - Uma falha temporária (código 4xx, rede fora) é tentada de novo depois de
RetryDelay(1 minuto), dobrando a cada vez atéRetryMaxDelay(1 hora), atéMaxAttempts(10) ouMaxAge(5 dias). Uma recusa definitiva (5xx) desiste na hora e chamaOnBounced. - Cada destinatário conta sozinho: os que o servidor aceitou não recebem de novo quando outro falha.
- Cada worker tem a sua cópia do cliente e a sua conexão.
- Os eventos (
OnDelivered,OnBounced,OnDeferred) rodam na thread do worker: useTThread.Queuepara mexer em tela. - A entrega é pelo menos uma vez: se o programa morre entre o "aceito" do servidor
e a baixa na fila, aquela mensagem sai de novo ao reabrir (com o mesmo
Message-ID, que os programas de e-mail usam para esconder a duplicata). -
Queueliga a uma fila de jobs que você já tem (no banco, por exemplo) em vez da fila própria.
O DKIM assina a mensagem com uma chave sua; o servidor de quem recebe confere com a chave pública publicada no seu DNS. Sem DKIM (e SPF), Gmail e Outlook mandam para o spam ou recusam.
uses RALDKIM;
FDKIM := TRALDKIMSigner.Create(Self);
FDKIM.Domain := 'minhaempresa.com.br';
FDKIM.Selector := 'ral1';
FDKIM.PrivateKeyFile := 'C:\MeuApp\dkim.pem'; // RSA, PEM
FSMTP.DKIM := FDKIM; // tudo o que o cliente envia sai assinadoFDKIM.KeyRecord devolve o texto do registro TXT a publicar em
ral1._domainkey.minhaempresa.com.br. Algorithm dkaEd25519SHA256 (RFC 8463) usa
uma chave curta (PrivateKey com a semente em base64); nem todo provedor confere
Ed25519 ainda, então assine com as duas chaves se precisar.
Uma chave RSA nova: openssl genrsa -out dkim.pem 2048.
| sintoma | causa | o que fazer |
|---|---|---|
530 5.7.0 |
o servidor pede login, ou TLS antes do login | preencha UserName/Password; use msStartTLS
|
535 5.7.8 |
usuário ou senha errados; no Gmail, senha normal com 2 fatores | use uma senha de app ou OAuth2 |
ERALSMTPError "certificate" |
o certificado do servidor não confere |
SSL.CAFile, ou o nome em Host diferente do certificado |
552 5.3.4 antes de enviar |
a mensagem passa do SIZE do servidor |
anexos menores, ou um link para o arquivo |
| tudo cai no spam | sem DKIM e SPF |
TRALDKIMSigner e o registro SPF do domínio |
- E-mail: a mensagem
- Receber e-mail
- Fila de jobs
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar