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
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
-Credentialou armazenadas em objetosPSCredential - 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 | iexPara 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." `
--yesPadrã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 $credDepois (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>" `
--yesPadrã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 $credDepois (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%." `
--yesPadrã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 25Depois (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." `
--yesPadrã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 $credDepois (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 `
--yesPadrã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.
| Funcionalidade | Send-MailMessage | Nylas CLI |
|---|---|---|
| Segurança TLS | Quebrada (obsoleta) | TLS 1.2+ imposto |
| Autenticação | Basic Auth / senhas de app | OAuth2 |
| Credenciais em scripts | Sim (PSCredential / XML) | Não (chaveiro do SO) |
| Suporte Gmail | Requer senha de app | OAuth2 integrado |
| Suporte Outlook / M365 | Basic Auth (sendo desativado) | OAuth2 integrado |
| Corpo HTML | Flag -BodyAsHtml | Detecção automática |
| Anexos | -Attachments | Enviar link, ou usar Nylas API/SDK para anexos MIME |
| Agendamento de e-mail | Não suportado | --schedule |
| Ler caixa de entrada | Não suportado | nylas email list |
| Saída JSON | Não suportado | --json |
| Acesso ao calendário | Não suportado | nylas 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.
- Substituir Send-MgUserMessage -- migrando dos cmdlets Graph PowerShell mais recentes?
- Send-MgUserMail vs Send-MailMessage -- compare SMTP obsoleto, Graph PowerShell e o caminho de envio CLI
- Enviar e-mail do PowerShell -- padrões avançados, agendamento e scripting
- Ler e buscar e-mails no PowerShell -- listar não lidos, buscar por remetente, exportar para CSV
- Baixar anexos de e-mail no PowerShell -- filtrar por tipo, download em lote, renomear
- Relatórios de e-mail automatizados com PowerShell -- relatórios CSV, envios agendados, templates
- Gerenciar e-mails Office 365 do PowerShell -- ler, buscar e organizar sua caixa M365
- Referência completa de comandos -- cada flag e subcomando documentado