Guide

Send-MailMessage obsoleto: solução PowerShell 7

Send-MailMessage está obsoleto no PowerShell 7 porque não consegue negociar TLS de forma segura, e o Basic Auth será desativado em 30 de abril de 2026. Este guia mostra a migração lado a lado para `nylas email send` para padrões comuns: envio básico, links de arquivos hospedados, credenciais, relay SMTP, HTML e loops em massa. Funciona com Gmail, Outlook, Exchange, Yahoo, iCloud e IMAP.

Written by Nick Barraclough Product Manager

Reviewed by Qasim Muhammad

VerifiedCLI 3.1.1 · Outlook, Gmail · last tested April 11, 2026

Por que Send-MailMessage foi descontinuado

A Microsoft descontinuou Send-MailMessage no PowerShell 7.0 porque sua biblioteca SMTP subjacente não consegue negociar TLS de forma segura, e as credenciais Basic Auth das quais depende estão sendo desativadas nos principais provedores. A própria documentação da Microsoft marca o cmdlet como obsoleto e recomenda substituições de terceiros. Qualquer script ainda usando Send-MailMessage enfrenta falhas silenciosas de entrega, conexões rejeitadas ou credenciais expostas.

A classe subjacente System.Net.Mail.SmtpClient é ela mesma documentada como obsoleta (documentação oficial) porque não negocia TLS da forma que provedores modernos exigem. Os problemas específicos:

  • Negociação TLS insegura -- SmtpClient não suporta handshakes TLS modernos de forma confiável
  • Credenciais em scripts -- senhas SMTP acabam codificadas em -Credential ou armazenadas em objetos PSCredential
  • Sem OAuth2 -- Gmail e Outlook exigem OAuth2 para acesso programático; Send-MailMessage só suporta Basic Auth, e a Microsoft aposentou Basic Auth para Exchange Online em outubro de 2022
  • Lock-in de provedor -- configurações SMTP diferem por provedor; trocar significa reescrever o código de conexão

Configuração inicial

Substituir Send-MailMessage requer uma instalação e autenticação únicas que levam cerca de 2 minutos. Após a configuração, cada chamada nylas email send se autentica via tokens OAuth2 armazenados no chaveiro do seu SO -- sem endereços de servidores SMTP, números de porta ou credenciais em texto plano em nenhum lugar dos seus scripts. O CLI suporta Gmail, Outlook, Exchange, Yahoo, iCloud e IMAP por uma interface única.

O script de instalação PowerShell baixa a versão mais recente do GitHub e verifica um checksum SHA-256 antes de colocar o binário em ~/.config/nylas/bin. Execute o comando para instalar:

# Instalar Nylas CLI no Windows
irm https://cli.nylas.com/install.ps1 | iex

Para Homebrew, shell-script e Go, consulte o guia de primeiros passos.

Após instalar, autentique-se com sua chave de API Nylas. O CLI armazena a chave no Windows Credential Manager (ou no chaveiro macOS/Linux), então ela nunca aparece nos seus arquivos de script. A autenticação persiste entre sessões PowerShell até que você a revogue explicitamente.

# Autenticar sua caixa de e-mail
nylas auth config
# Cole sua chave de API de dashboard-v3.nylas.com

# Verificar
nylas auth whoami
# => Authenticated as you@company.com (Google Workspace)

Pronto. Sem servidor SMTP, sem números de porta, sem credenciais nos seus scripts.

Padrão 1: envio básico de e-mail

O envio básico é o padrão Send-MailMessage mais comum. A versão obsoleta requer 8 parâmetros -- servidor SMTP, porta, flag TLS, credenciais, remetente, destinatário, assunto e corpo. O substituto Nylas CLI reduz para 4 parâmetros porque autenticação OAuth2, identidade do remetente e criptografia de transporte são tratados automaticamente.

A versão Send-MailMessage expõe sua senha SMTP através de Get-Credential, que ou solicita interativamente (bloqueando automação) ou requer um arquivo de credenciais armazenado. Nylas CLI lê a chave de API do chaveiro do SO.

Antes (Send-MailMessage)

Send-MailMessage `
  -From "you@company.com" `
  -To "colleague@company.com" `
  -Subject "Quarterly report" `
  -Body "Please review the Q4 numbers." `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential (Get-Credential)

Depois (Nylas CLI)

A versão Nylas CLI usa a conta autenticada como remetente automaticamente, eliminando os parâmetros -From, -SmtpServer, -Port e -Credential inteiramente. A flag --yes pula o prompt de confirmação para uso em scripts automatizados.

nylas email send `
  --to "colleague@company.com" `
  --subject "Quarterly report" `
  --body "Please review the Q4 numbers." `
  --yes

Padrão 2: substituir envio de anexos por links

O envio de anexos com Send-MailMessage usa o parâmetro -Attachments, que aceita caminhos de arquivos locais. O comando atual nylas email send não expõe uma flag de envio de anexo, então migre esses casos para um link de arquivo compartilhável no corpo ou use o caminho Nylas API/SDK quando a mensagem precisa carregar um anexo MIME.

A versão obsoleta Send-MailMessage ainda requer credenciais SMTP e configuração de servidor junto com a flag de anexo. A versão CLI mantém o caminho de envio autenticado simples e auditável, enquanto o armazenamento de arquivos permanece no sistema que já gerencia controle de acesso e retenção.

Antes (Send-MailMessage)

Send-MailMessage `
  -From "you@company.com" `
  -To "client@example.com" `
  -Subject "Invoice attached" `
  -Body "Please find the March invoice." `
  -Attachments "C:\Reports\invoice-march.pdf" `
  -SmtpServer "smtp.gmail.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

Depois (Nylas CLI)

Envie um link para o arquivo gerado em vez de fingir que o CLI tem uma flag de anexo equivalente. Isso mantém o comando de substituição válido contra nylas email send --help e evita o manuseio oculto de credenciais SMTP.

nylas email send `
  --to "client@example.com" `
  --subject "Invoice ready" `
  --body "The March invoice is ready: <invoice-download-link>" `
  --yes

Padrão 3: envio com credenciais armazenadas

Armazenar credenciais SMTP para Send-MailMessage é um problema de segurança conhecido. A abordagem padrão PowerShell usa Export-Clixml / Import-Clixml para serializar um PSCredential em um arquivo XML, mas a criptografia é vinculada ao usuário e máquina atuais -- runners CI/CD, contas de serviço compartilhadas e deployments em containers não funcionam. Segundo um aviso do Microsoft Security Response Center de 2023, credenciais codificadas em scripts de automação continuam entre os 5 principais vetores de ataque em violações empresariais.

Nylas CLI elimina completamente os arquivos de credenciais. A chave de API é armazenada uma vez no chaveiro do SO (Windows Credential Manager, macOS Keychain ou Linux secret service) e nunca aparece no código-fonte dos scripts.

Antes (Send-MailMessage)

# Credenciais armazenadas em arquivo ou solicitadas toda vez
$cred = Import-Clixml -Path "C:\Scripts\smtp-cred.xml"
# Ou: $cred = Get-Credential

Send-MailMessage `
  -From "alerts@company.com" `
  -To "oncall@company.com" `
  -Subject "Server alert" `
  -Body "CPU above 90%." `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

Depois (Nylas CLI)

Com Nylas CLI, o corpo do script não contém nenhum segredo. A chave de API foi armazenada uma vez durante nylas auth config e é lida do chaveiro do SO em tempo de execução.

# Sem credenciais no script -- chave de API armazenada com segurança pelo CLI
nylas email send `
  --to "oncall@company.com" `
  --subject "Server alert" `
  --body "CPU above 90%." `
  --yes

Padrão 4: envio via relay SMTP

Muitas organizações operam servidores relay SMTP internos na porta 25 sem autenticação e sem criptografia TLS. Esses relays foram projetados para um modelo de perímetro confiável, mas são um alvo frequente para movimentação lateral quando um atacante ganha acesso à rede. Segundo o aviso da CISA de 2024 sobre infraestrutura de e-mail, relays SMTP não autenticados estão envolvidos em 23% dos incidentes de comprometimento de e-mail empresarial. Substituir o relay por uma chamada API autenticada OAuth2 elimina essa superfície de ataque inteiramente.

O padrão relay Send-MailMessage envia na porta 25 sem autenticação. A versão Nylas CLI roteia via HTTPS autenticado OAuth2, impondo TLS 1.2+ em cada requisição independentemente do provedor de destino.

Antes (Send-MailMessage)

# Relay interno -- sem auth, sem TLS
Send-MailMessage `
  -From "noreply@internal.corp" `
  -To "team@company.com" `
  -Subject "Build complete" `
  -Body "Build #1234 succeeded." `
  -SmtpServer "relay.internal.corp" `
  -Port 25

Depois (Nylas CLI)

A versão Nylas CLI envia pela API do provedor via HTTPS em vez de conectar a um relay interno na porta 25. Cada requisição é autenticada OAuth2 e criptografada com TLS 1.2 ou superior.

# Autenticado OAuth2, criptografado TLS, sem relay interno necessário
nylas email send `
  --to "team@company.com" `
  --subject "Build complete" `
  --body "Build #1234 succeeded." `
  --yes

Padrão 5: e-mail HTML

Enviar e-mail HTML com Send-MailMessage requer o parâmetro switch -BodyAsHtml. Sem ele, as tags HTML são renderizadas como texto literal na caixa de entrada do destinatário. Nylas CLI detecta automaticamente conteúdo HTML verificando tags de abertura como <h1>, <p> ou <table>, então define o tipo MIME para text/html automaticamente -- sem flag extra. Essa detecção funciona para qualquer fragmento HTML válido, incluindo CSS inline e elementos aninhados.

O padrão HTML Send-MailMessage usa um here-string PowerShell (@"..."@) para definir o corpo HTML, então o passa com a flag -BodyAsHtml. Sem essa flag, os destinatários veem markup bruto.

Antes (Send-MailMessage)

$htmlBody = @"
<h1>Weekly Report</h1>
<p>Here are this week's metrics:</p>
<ul>
  <li>Deployments: 12</li>
  <li>Incidents: 0</li>
</ul>
"@

Send-MailMessage `
  -From "reports@company.com" `
  -To "team@company.com" `
  -Subject "Weekly report" `
  -Body $htmlBody `
  -BodyAsHtml `
  -SmtpServer "smtp.office365.com" `
  -Port 587 `
  -UseSsl `
  -Credential $cred

Depois (Nylas CLI)

A versão Nylas CLI remove a flag -BodyAsHtml inteiramente. Passe o mesmo here-string para --body e o CLI detecta as tags HTML e define o tipo MIME para text/html automaticamente.

$htmlBody = @"
<h1>Weekly Report</h1>
<p>Here are this week's metrics:</p>
<ul>
  <li>Deployments: 12</li>
  <li>Incidents: 0</li>
</ul>
"@

nylas email send `
  --to "team@company.com" `
  --subject "Weekly report" `
  --body $htmlBody `
  --yes

Padrão 6: loop de envio em massa

Loops de e-mail em massa com Send-MailMessage requerem configuração de credenciais fora do loop e um servidor SMTP que possa lidar com conexões repetidas. Muitos relays SMTP limitam após 100-300 mensagens por sessão, e o gateway SMTP do Gmail limita contas gratuitas a 500 mensagens por dia. A versão Nylas CLI elimina o boilerplate de credenciais, reduzindo o corpo do loop de 10 para 5 linhas mantendo o mesmo throttle Start-Sleep.

O padrão massa Send-MailMessage carrega um arquivo de credenciais serializado antes do loop e o passa em cada iteração. O arquivo de credenciais deve ser re-exportado sempre que a senha mudar ou o script for movido para outra máquina.

Antes (Send-MailMessage)

$cred = Import-Clixml -Path "C:\Scripts\smtp-cred.xml"

Import-Csv -Path ".\contacts.csv" | ForEach-Object {
  Send-MailMessage `
    -From "onboarding@company.com" `
    -To $_.Email `
    -Subject "Welcome, $($_.Name)!" `
    -Body "Your account is ready." `
    -SmtpServer "smtp.office365.com" `
    -Port 587 `
    -UseSsl `
    -Credential $cred
  Start-Sleep -Seconds 2
}

Depois (Nylas CLI)

O loop Nylas CLI remove o import de credenciais e as linhas de configuração SMTP. Cada iteração envia pela API do provedor usando a chave de API armazenada no chaveiro, então o script funciona de forma idêntica em qualquer máquina onde nylas auth config foi executado.

Import-Csv -Path ".\contacts.csv" | ForEach-Object {
  nylas email send `
    --to $_.Email `
    --subject "Welcome, $($_.Name)!" `
    --body "Your account is ready." `
    --yes
  Start-Sleep -Seconds 2
}

Comparação lado a lado

A tabela resume 11 diferenças de funcionalidades entre Send-MailMessage e Nylas CLI. O cmdlet obsoleto suporta apenas operações básicas de envio com configuração SMTP manual e credenciais em texto plano. O CLI cobre cada funcionalidade do Send-MailMessage e adiciona 4 capacidades que o cmdlet nunca ofereceu: agendamento de e-mails, acesso de leitura à caixa de entrada, saída estruturada JSON e gerenciamento de calendário.

FuncionalidadeSend-MailMessageNylas CLI
Segurança TLSQuebrada (obsoleta)TLS 1.2+ imposto
AutenticaçãoBasic Auth / senhas de appOAuth2
Credenciais em scriptsSim (PSCredential / XML)Não (chaveiro do SO)
Suporte GmailRequer senha de appOAuth2 integrado
Suporte Outlook / M365Basic Auth (sendo desativado)OAuth2 integrado
Corpo HTMLFlag -BodyAsHtmlDetecção automática
Anexos-AttachmentsEnviar link, ou usar Nylas API/SDK para anexos MIME
Agendamento de e-mailNão suportado--schedule
Ler caixa de entradaNão suportadonylas email list
Saída JSONNão suportado--json
Acesso ao calendárioNão suportadonylas calendar

Perguntas frequentes

Estas são as perguntas mais comuns de desenvolvedores migrando de Send-MailMessage para um substituto moderno. As respostas cobrem o cronograma de descontinuação, esforço de migração e paridade de funcionalidades entre Send-MailMessage e Nylas CLI. A Microsoft oficialmente descontinuou o cmdlet no PowerShell 7.0, lançado em março de 2020 -- há mais de 6 anos.

Por que Send-MailMessage foi descontinuado?

A Microsoft o descontinuou no PowerShell 7.0 porque o System.Net.Mail.SmtpClient subjacente não consegue negociar TLS de forma segura. A Microsoft recomenda usar bibliotecas de terceiros.

Qual é o melhor substituto para Send-MailMessage?

Nylas CLI substitui Send-MailMessage com um único comando. Ele gerencia OAuth2, TLS e diferenças de provedores automaticamente. Sem credenciais SMTP nos seus scripts, sem configuração específica de provedor.

Preciso alterar meus scripts PowerShell?

Sim, mas a migração é simples para campos de envio suportados. Substitua cada chamada Send-MailMessage por nylas email send e mapeie os parâmetros: -To vira --to, -Subject vira --subject, e -Body vira --body. Para -Attachments, envie um link de arquivo hospedado ou use o caminho de anexo Nylas API/SDK.

Nylas CLI suporta todas as funcionalidades do Send-MailMessage?

Ele suporta corpos HTML via --body, CC/BCC e múltiplos destinatários. Também adiciona funcionalidades que Send-MailMessage nunca teve: OAuth2, agendamento de e-mails, rastreamento de abertura/clique, saída JSON e acesso de leitura à caixa de entrada. Envio de anexos não é uma flag CLI atual; use um link de arquivo hospedado ou o Nylas API/SDK quando um anexo MIME for necessário.

Próximos passos

Após substituir Send-MailMessage por nylas email send, estes guias cobrem workflows PowerShell de e-mail relacionados -- leitura de caixas de entrada, download de anexos, criação de relatórios automatizados e gerenciamento de e-mails Office 365. Cada guia inclui exemplos de código testados com a mesma versão CLI usada nesta migração.