Skip to content
mobius1qwe edited this page Nov 13, 2026 · 1 revision

Home > E-mail > Enviar

Enviar e-mail

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).

Enviar uma mensagem

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.

Login

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.

Mais rápido

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 os RCPT (e DATA) numa escrita só;
  • CHUNKING (BDAT): a mensagem vai inteira, sem a varredura de pontos do DATA;
  • 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.

Fila

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. Folder vazio 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) ou MaxAge (5 dias). Uma recusa definitiva (5xx) desiste na hora e chama OnBounced.
  • 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: use TThread.Queue para 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).
  • Queue liga a uma fila de jobs que você já tem (no banco, por exemplo) em vez da fila própria.

DKIM

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 assinado

FDKIM.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.

Erros comuns

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

Veja também

Começar

Servidor

MQTT 🚧

E-mail 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally