1. Para o cmdlet do PowerShell do dia, estamos abordando o cmdlet Send-MailMessage. Este cmdlet do PowerShell serve apenas um propósito; enviar e-mails de muitas maneiras diferentes.
Como o cmdlet Send-MailMessage pode enviar mensagens de e-mail de várias maneiras, vamos direto ao assunto e começar a cobrir todos os exemplos comuns que você pode encontrar. Neste artigo, vamos abordar muitos exemplos, desde os mais simples até alguns cenários que eu não desejo a ninguém!
Este post será um ótimo recurso para marcar, caso você se depare com situações em que precise enviar e-mails com o PowerShell e esqueça a sintaxe.
O Servidor SMTP
Todo e-mail precisa passar por um servidor SMTP em algum lugar, via um servidor e uma porta. Para especificar o servidor SMTP a ser usado, use um parâmetro chamado SMTPServer
, que permite especificar o servidor SMTP para estabelecer uma conexão e encaminhar o correio. No entanto, isso não é obrigatório.
Se você não especificar um valor para o parâmetro SMTPServer
, será usado o valor armazenado na variável de preferência $PSEmailServer
. Você pode atribuir um valor a essa variável da mesma forma que faria com qualquer outra variável.
No entanto, esta variável não persiste entre as sessões do PowerShell. Isso significa que você deve defini-la toda vez que uma nova sessão do PowerShell for aberta. Por esse motivo, recomendo que você a defina acima da sua referência Send-MailMessage
ou que não a defina de forma alguma. Em vez disso, eu pessoalmente forneceria o valor do parâmetro SMTPServer
. Dessa forma, você não precisa gerenciar uma variável externa que pode mudar inesperadamente.
Porta
Por padrão, o valor que o cmdlet tentará usar para enviar um e-mail através do servidor SMTP é a porta 25. Isso é SMTP simples e não criptografado. No entanto, hoje em dia, é mais comum enviar e-mails criptografados usando SSL/TLS (Abordaremos esses cenários mais tarde).
Se você precisar alterar a porta de 25, pode usar o parâmetro Port
.
Destinatários e Remetentes
Para enviar um e-mail para diferentes destinatários através de métodos como os campos To, Cc e Bcc, o cmdlet possui vários parâmetros para acomodar isso.
Os Parâmetros To, Cc e Bcc no Cmdlet Send-Mailmessage
O cmdlet possui três parâmetros, cada um suportando vários destinatários separados por vírgula, chamados To
, Cc
e Bcc
.
Você pode especificar endereços únicos como mostrado abaixo.
Ou pode especificar vários destinatários para cada valor do parâmetro.
O Parâmetro From
Quando enviar um e-mail, você também pode especificar o parâmetro From
, que definirá o cabeçalho “reply-to” no e-mail. Este parâmetro permite apenas um endereço. Se um destinatário optar por responder ao e-mail, este será o endereço de e-mail para o qual a resposta será enviada.
Por padrão, ao usar um endereço de e-mail, apenas o endereço de e-mail será exibido no campo FROM do destinatário. No entanto, se você deseja especificar um nome ou algum tipo de rótulo como Caixa de Correio da Conta de Serviço, você também pode especificar um nome e um e-mail assim:
Observe que o parâmetro
Subject
foi usado. Este parâmetro é sempre obrigatório. Você verá este parâmetro usado em todos os exemplos.
Corpo
O parâmetro Body
permite que você especifique o que estará no corpo do e-mail. No mais simples, você pode especificar qualquer texto que desejar, e o cmdlet o enviará como texto simples.
Envio de E-mails com Corpo HTML
Você também pode enviar um corpo de e-mail via HTML em vez de texto simples. Para fazer isso, use o mesmo parâmetro Body
como faria com texto simples, mas use HTML para a string e use o parâmetro de comutação BodyAsHtml
.
Observe no exemplo acima, eu envolvi a string do corpo em
@'
e'@
. Isso é chamado de here string. Isso permite que você defina strings longas geralmente vistas nos corpos de e-mail que contêm quebras de linha. As here strings preservam a formatação das strings e são uma ótima maneira de definir o corpo do e-mail, especialmente se estiver em HTML.
Codificação
Se você tiver caracteres especiais no assunto ou no corpo do seu e-mail, pode usar o parâmetro Codificação
. Esse parâmetro permite codificar o assunto e o corpo do e-mail por meio do tipo de codificação especificado antes de enviar.
Você tem algumas opções aqui:
- ASCII (padrão)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Padrão
- OEM
Anexos
O cmdlet também pode anexar um ou mais arquivos. Para fazer isso, você pode usar o parâmetro Anexos
e fornecer o caminho para o(s) arquivo(s) que deseja anexar.
Você também pode especificar vários anexos por meio de uma coleção, separando-os com uma vírgula.
O parâmetro Anexos
também permite que você envie arquivos por meio de cmdlets como Get-Item
e Get-ChildItem
para o cmdlet Send-MailMessage
também.
Email Seguro e Autenticado
Por padrão, o cmdlet envia e-mails por meio de comunicação SMTP não criptografada na porta 25. No entanto, ele também tem suporte para o envio de e-mails criptografados via SSL/TLS com um nome de usuário e senha.
Se você tentar encaminhar um e-mail por meio de um servidor SMTP que requer autenticação, o comando falhará com uma mensagem de erro como abaixo.
Para resolver isso, você deve primeiro especificar a porta (tipicamente 587 para TLS) e o parâmetro UseSsl
. Isso indica ao cmdlet para tentar se conectar à porta 587 no servidor SMTP e criptografar toda a mensagem. Geralmente (sempre?), você também precisará especificar o nome de usuário/senha para autenticar-se no servidor SMTP usando o parâmetro Credential
.
Aqui estou obtendo um objeto de credencial (PSCredential) usando o cmdlet
Get-Credential
. Isso às vezes pode ser um problema porque é interativo, o que significa que interrompe o script para solicitar um nome de usuário e senha. Para evitar isso, você pode criar um objeto PSCredential na hora.
A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.
Atribuindo Prioridade ao E-mail
Embora seja uma característica do e-mail que eu pessoalmente gostaria que desaparecesse, você pode atribuir níveis de prioridade aos e-mails que envia usando o parâmetro Priority
. Essa prioridade é então interpretada de várias maneiras pelo cliente de e-mail.

O Send-mailmessage permite que você atribua um e-mail com três prioridades diferentes.
- Normal (padrão)
- Alta
- Baixa
Mas por favor, pelo amor de Deus, não pense que todos os seus e-mails são de alta prioridade!
Notificações de Entrega
Finalmente, você pode especificar notificações de entrega para e-mails. Notificações de entrega são o que geralmente é conhecido como recibos de leitura em alguns clientes de e-mail. As notificações de entrega permitem que você seja notificado se/quando o e-mail for recebido pelo destinatário. No entanto, o destinatário ainda deve permitir isso.
Você tem quatro opções ao solicitar notificações de entrega.
- Nenhuma (padrão)
- OnSuccess (quando a entrega do e-mail é bem-sucedida)
- OnFailure (notificar se a entrega não for bem-sucedida)
- Atraso (quando o e-mail é atrasado via um servidor SMTP)
Você pode especificar uma opção de notificação de entrega usando o parâmetro DeliveryNotificationOptions
.
Você também pode solicitar várias notificações de entrega de uma vez, separando-as com uma vírgula.
Resumo
Neste post, você aprendeu tudo sobre o cmdlet Send-mailmessage e o que ele pode fazer. Cobrimos este cmdlet extensivamente usando todos os parâmetros que possui, juntamente com exemplos. Espero que este post possa servir como uma referência para você ao usar o cmdlet Send-mailmessage.
Leitura Adicional
Não deixe de conferir alguns outros posts relacionados!