Articles

Adam the Automator

Posted on

Para esta PowerShell cmdlet do dia, estamos a cobrir a PowerShell cmdlet Send-MailMessage. Esta PowerShell cmdlet serve apenas um propósito e uma finalidade; enviar correio electrónico de muitas maneiras diferentes.

Desde que existem tantas maneiras que a Send-MailMessage cmdlet pode enviar mensagens de correio electrónico, vamos mergulhar e começar a cobrir todos os exemplos comuns com que se pode deparar. Neste artigo, vamos cobrir muitos exemplos que vão desde os mais simples até alguns cenários que não desejo a ninguém!

Este post será um grande recurso para marcar em favoritos no caso de alguma vez se deparar com instâncias em que tenha de enviar correio electrónico com PowerShell e esquecer a sintaxe.

Table of Contents

O Servidor SMTP

Todo o correio electrónico tem de passar por um servidor SMTP algures através de um servidor e de uma porta. Para especificar um servidor SMTP a utilizar, usar um parâmetro chamado SMTPServer que lhe permite especificar o servidor SMTP para estabelecer uma ligação e retransmitir correio através. Contudo, não é necessário.

Se não especificar um valor para o parâmetro SMTPServer, será utilizado o valor armazenado no parâmetro $PSEmailServer variável de preferência. Pode atribuir um valor a esta variável tal como faria com qualquer outra variável.

PS51> $PSEmailServer = 'smtp.server.local'

No entanto, esta variável não vive nas sessões PowerShell. Isto significa que deve defini-la sempre que uma nova sessão PowerShell estiver aberta. Por esta razão, recomendo ou a sua utilização, definindo-a acima do seu Send-MailMessage referência ou não a definindo toda. Em vez disso, eu forneceria pessoalmente o SMTPServer valor do parâmetro. Desta forma, não tem de gerir uma variável externa que possa mudar em si.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

Port

Por defeito, o valor que o cmdlet tentará enviar um e-mail através do servidor SMTP é a porta 25. Este é um SMTP simples, não encriptado. No entanto, actualmente, é mais comum enviar correio electrónico encriptado usando SSL/TLS (Cobriremos estes cenários mais tarde).

Se precisar de alterar a porta de 25, pode usar o parâmetro Port.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587

Recipientes e Originadores

Para enviar um e-mail a diferentes destinatários através de métodos como os campos To, Cc e Bcc, o cmdlet tem vários parâmetros para acomodar isto.

Os parâmetros To, Cc e Bcc no campo Send-Mailmessage Cmdlet

O cmdlet tem três parâmetros cada um suportando múltiplos destinatários separados por uma vírgula chamada ToCc e Bcc.

p>Pode especificar endereços únicos como abaixo.

PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'

ou pode especificar múltiplos destinatários para cada valor de parâmetro.

PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'

O Parâmetro de Parâmetro

Ao enviar e-mail, também pode especificar o parâmetro From que irá definir o cabeçalho de repostagem no e-mail. Este parâmetro permite apenas um endereço. Se um destinatário escolher responder ao e-mail, este será o endereço de e-mail que responderá a.

PS51> Send-MailMessage -From -To -Subject 'this is a subject'

Por defeito, utilizando um endereço de e-mail mostrará simplesmente o endereço de e-mail no campo FROM do destinatário. Contudo, se desejar especificar um nome ou algum tipo de etiqueta como Service Account Mailbox, poderá também especificar um nome e um email como:

Adam Bertram <>

Notificação de que o parâmetro foi utilizado. Este parâmetro é sempre necessário. Verá este parâmetro utilizado em todos os exemplos.

Corpo

O parâmetro Body permite-lhe especificar o que estará no corpo do correio electrónico. No mais simples, pode especificar qualquer texto que deseje e o cmdlet enviá-lo-á via plaintext.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'

Envio de e-mails de corpo HTML

Também pode enviar um corpo de e-mail via HTML em vez de plaintext. Para tal, utilize o mesmo parâmetro Body como faria com o texto em texto simples, mas utilize HTML para a string e utilize o parâmetro switch.

$body = @'<table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr></table>'@PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body $body -BodyAsHtml

Notificação no exemplo acima, incluí a string corporal em @' e '@. A isto chama-se uma corda aqui. Isto permite definir cadeias longas tipicamente vistas em corpos de correio electrónico que contêm devoluções de transporte. Aqui cadeias de caracteres preservam a formatação de cadeias de caracteres e é uma óptima maneira de definir o corpo do e-mail, especialmente se estiver em HTML.

Codificação

Se tiver caracteres especiais no assunto ou corpo do seu e-mail, pode usar o parâmetro Encoding. Este parâmetro permite-lhe codificar o assunto e o corpo do e-mail através do tipo de codificação especificado antes do envio.

Tem aqui algumas opções:

  • ASCII (por defeito)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Default
  • OEM

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

Anexos

O cmdlet também pode anexar um ou mais ficheiros. Para o fazer, pode usar o parâmetro Attachments e fornecer o caminho para o(s) ficheiro(s) que gostaria de anexar.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

Também pode especificar múltiplos anexos através de uma colecção separando-os com uma vírgula.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

O parâmetro Attachments também lhe permite canalizar ficheiros através de cmdlets como Get-Item e Get-ChildItem ao Send-MailMessage cmdlet também.

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'

Email Seguro e Autenticado

Por defeito, a cmdlet envia email via comunicação SMTP não encriptada pela porta 25. Contudo, também tem suporte para o envio de correio electrónico encriptado via SSL/TLS com um nome de utilizador e palavra-passe.

Se tentar transmitir correio electrónico através de um servidor SMTP que requeira autenticação, o comando falha com uma mensagem de erro como abaixo.

The SMTP server requires a secure connection or the client was notauthenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

Para remediar isto, deve primeiro especificar a porta (tipicamente 587 para TLS) e o parâmetro UseSsl. Isto diz ao cmdlet para tentar ligar à porta 587 no Servidor SMTP e encriptar toda a mensagem. Normalmente (sempre?) também terá de especificar o nome de utilizador/senha para autenticar no servidor SMTP usando o parâmetro Credential.

PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

Acima estou a agarrar um objecto de credencial (PSCredential) usando o Get-Credential cmdlet. Isto por vezes coloca um problema porque é um significado interactivo que impede o script de pedir um nome de utilizador e uma palavra-chave. Para evitar isto, poderia criar um objecto PSCredential on the fly.

Um exemplo comum de correio electrónico é usar o Gmail. Usando o conhecimento adquirido acima, pode agora facilmente enviar e-mail através do Gmail usando o servidor SMTP smtp.gmail.com, como mostrado abaixo.

$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams

Atribuição de prioridade de e-mail

Embora uma característica do e-mail que eu pessoalmente desejasse morresse, pode atribuir níveis de prioridade aos e-mails que envia através do parâmetro Priority. Esta prioridade é então interpretada de várias maneiras pelo cliente de e-mail.

Mensagem de alta prioridade no Outlook
Mensagem de alta prioridade no Outlook

Mensagem de e-mail enviada permite-lhe atribuir um e-mail com três prioridades diferentes.

  • Normal (por defeito)
  • alto
  • baixo
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High

Mas por favor, por amor de Deus, não pense que todos os seus emails são de alta prioridade!

Notificações de entrega

Finalmente, pode especificar notificações de entrega para emails. As notificações de entrega são o que é tipicamente conhecido como recibos de leitura em alguns clientes de correio electrónico. As notificações de entrega permitem-lhe ser notificado se/quando o email é recebido pelo destinatário. No entanto, o destinatário deve ainda permitir.

Você tem quatro opções ao solicitar notificações de entrega.

  • Nenhum (por defeito)
  • li>OnSuccess (quando a entrega é bem sucedida)li>OnFailure (notificar se a entrega não for bem sucedida)li>Delay (quando o e-mail é atrasado através de um servidor SMTP)

Pode especificar uma opção de notificação de entrega usando o parâmetro DeliveryNotificationOptions.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

P>Pode também solicitar várias notificações de entrega de uma só vez separando-as com uma vírgula.

PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

Resumo

Neste post, ficou a saber tudo sobre a mensagem de correio electrónico cmdlet e o que ela pode. Cobrimos este cmdlet extensivamente utilizando todos os parâmetros que tem, juntamente com exemplos. Espero que este post possa servir de referência para si quando utilizar a mensagem de correio electrónico cmdlet.

Leitura adicional

Não se esqueça de verificar alguns outros posts relacionados!

  • Usando o Get-ChildItem PowerShell cmdlet
  • Usando o Set-Content PowerShell cmdlet
  • Usando o Out-File PowerShell cmdlet

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *