Partilhar este post:
A possibilidade de enviar e-mails usando PowerShell é uma grande funcionalidade e pode ajudar-nos tremendamente se implementada da forma correcta. Assim, vou mostrar-lhe muitos exemplos de como pode enviar emails usando PowerShell e como pode implementar isto nas suas rotinas diárias de TI.
Para enviar emails usando PowerShell, vamos usar o Send-MailMessage PowerShell CmdLet e precisamos de alguns pré-requisitos antes de começar a usá-lo que vou apresentar aqui:
- Primeiro, precisamos de um servidor SMTP que forneça um serviço de transmissão dos nossos emails para os destinatários.
- Segundo, iremos obter credenciais SMTP (nome de utilizador e palavra-passe) do nosso fornecedor de Servidor SMTP, de modo a autenticar-nos ao serviço enquanto transmitimos e-mails.
- Finalmente, após limparmos o fornecedor do servidor SMTP e as credenciais, podemos começar a utilizar o Send-MailMessage PowerShell CmdLet com vários exemplos que preparei para si.
Vamos mergulhar em vários exemplos fantásticos para que possamos ter a aparência e a sensação de capacidades de envio de correio electrónico utilizando o PowerShell.
Tabela de Conteúdos
Enviar Email usando PowerShell – Exemplo Fácil
Como já concluímos o PowerShell Send-MailMessage CmdLet irá ajudar-nos a enviar email a partir de PowerShell e aqui está um exemplo muito simples:
Send-MailMessage -To "recipient’s email address" -From "sender’s email address" -Subject "Your message subject" -Body "Message text!" -Credential (Get-Credential) -SmtpServer "SMTP server" -Port 587
IMPORTANTE: Os valores para todos os parâmetros excepto Porto devem ser substituídos por valores reais aplicáveis ao seu caso, para que esta linha de código funcione.
Neste exemplo simples utilizámos apenas alguns parâmetros necessários de Send-MailMessage PowerShell CmdLet para enviar um simples e-mail ao destinatário:
- -O valor do parâmetro é o endereço de e-mail do destinatário
- -Do valor do parâmetro é o endereço de e-mail do remetente
- -O valor do parâmetro do sub-projecto é o texto do assunto do e-mail
- -O valor do parâmetro do corpo é o conteúdo do e-mail. Isto é conteúdo de texto simples e mais tarde veremos como podemos enviar conteúdo HTML no corpo de texto do e-mail.
- -Parâmetro de credencial é o nome de utilizador do servidor SMTP e as credenciais da palavra-passe. Por favor, veja os seguintes subtópicos neste artigo onde expliquei as formas de passar as credenciais. É muito importante, portanto preste atenção a isso.
- -SmtpServer parameter value is SMTP’s server address.
- -Port parameter value is the port number that SMTP listenens for the email messages.
NOTE: Se para -De parâmetro utilizar um endereço de correio electrónico do remetente que não esteja registado como remetente no servidor SMTP poderá obter um correio electrónico do suporte do servidor SMTP que tente enviar correio electrónico de um endereço de correio electrónico do remetente não registado. Assim, terá de utilizar um endereço de correio electrónico registado ou registar um endereço de correio electrónico adicional do remetente.
Aqui está o correio electrónico que recebi utilizando o meu endereço e credenciais do servidor SMTP. Como pode ver, temos um exemplo de envio de um e-mail com anexo e vemos o texto Assunto e parte do texto do corpo do e-mail na Caixa de Entrada do Gmail.
No corpo do e-mail, podemos ver o conteúdo da mensagem de correio electrónico enviada utilizando o PowerShell. Este é um exemplo de envio de uma mensagem de correio electrónico utilizando PowerShell com texto Subject, via MailJet SMTP Server, o corpo do texto é apenas texto simples e com anexo ao correio electrónico.
Existem muitos mais parâmetros de Envi…MailMessage CmdLet que veremos nos seguintes exemplos um pouco mais abaixo neste artigo.
Mas antes de mergulharmos com mais exemplos e nuances de envio de emails usando PowerShell, vamos esclarecer os pré-requisitos necessários para o envio dos emails e esses são as credenciais de autenticação de Servidor SMTP e Servidor SMTP.
Que Servidor SMTP utilizar e como obter um Servidor SMTP
Agora provavelmente está a pensar, espere um minuto, eu quero enviar um e-mail usando PowerShell e porque é que estamos a falar de servidor SMTP.
Bem, lembra-se dos velhos tempos em que estávamos a enviar mensagens em envelopes? Entregou os seus envelopes pessoalmente ao destinatário? Claro que não. Há uma grande probabilidade, pelo menos para dizer, de ter usado alguns provedores como os Correios para o fazer por si.
Portanto, o Servidor SMTP é o nosso provedor que enviará e-mails que escrevemos em PowerShell e os enviará aos destinatários por nós.
INFO: SMTP significa (Simple Mail Transfer Protocol) e é uma “linguagem” ou protocolo de comunicação acordado para as aplicações nos servidores para transmitir e-mails.
Se se perguntar qual o Servidor SMTP a utilizar, por favor faça a sua pesquisa uma vez que existem muitas empresas na Internet que fornecem esse serviço e apenas para citar algumas: Gmail, Hotmail, Yahoo, etc.
Para os meus exemplos e para testar o código que utilizei MailJet apenas porque foi fácil criar uma conta e configurar tudo.
Quando criei uma conta com MailJet é possível ver as definições SMTP:
- o endereço do servidor SMTP (“in-v3.mailjet.com”),
- uma porta que é utilizada (587),
- nome de utilizador, e
- palavra-passe para credenciais SMTP.
Todos estes pedaços de informação são importantes quando queremos enviar emails usando o CmdLet PowerShell Send-MailMessage, por isso certifique-se de que os tem antes de começar a usar o recurso PowerShell enviar email.
Como enviar email SMTP com autenticação usando PowerShell
Há várias maneiras de fornecer credenciais SMTP enquanto envia emails usando PowerShell. Mostraremos duas abordagens diferentes.
A primeira é mais simples mas menos segura uma vez que a palavra-passe do servidor SMTP é visível para os outros que têm acesso ao código fonte.
A segunda tem um passo adicional mas é mais segura uma vez que nos permite manter a palavra-passe segura e encriptada num ficheiro externo que podemos utilizar ao fornecer credenciais SMTP.
Enviar credenciais SMTP com uma palavra-passe visível no código fonte (menos seguro)
Neste exemplo, fornecemos vários parâmetros para Send-MailMessage CmdLet mas os parâmetros mais importantes para explicar este exemplo são
- SmtpServer
- Credential
NOTE: Para que este exemplo funcione para si por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$username="your_user_name" $password = "your_password" | ConvertTo-SecureString -AsPlainText -Force$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
SmtpServer o valor do parâmetro tem um endereço do Servidor SMTP, por exemplo, MailJet SMTP Server é “in-v3.mailjet.com”.
O parâmetro Credential envolve as credenciais do utilizador e palavra-passe do Servidor SMTP e precisa de ser passado como um objecto PSCredential. Precisamos de prestar especial atenção ao passar uma senha para a criação de um objecto PSCredential, uma vez que uma senha não pode ser um texto simples, mas sim um tipo de dados SecureString. Portanto, precisamos de converter a nossa palavra-passe simples em tipo de dados SecureString usando ConvertTo-SecureString CmdLet.
$password = "your_password" | ConvertTo-SecureString -AsPlainText -Force
Como já foi mencionado, este método não é demasiado complicado, mas tem problemas de segurança, uma vez que mantemos a nossa palavra-passe do servidor SMTP como texto simples no nosso código fonte, o que não é a melhor prática.
Finalmente, aqui está o resultado e e-mail recebidos utilizando este exemplo:
Envio de credenciais SMTP com uma palavra-passe oculta no código fonte (mais seguro)
Neste exemplo, forneceremos credenciais SMTP enquanto chamamos a Send-MailMessage CmdLet mas desta vez a password não será visível. No entanto, este método requer um passo adicional do nosso lado para funcionar.
Primeiro encriptaremos a nossa palavra-passe num ficheiro txt externo apenas uma vez e usaremos esse ficheiro para decifrar e ler a nossa palavra-passe sempre que precisarmos no nosso código fonte.
Quando executarmos este código ser-nos-á pedido que forneçamos a credencial de palavra-passe do Servidor SMTP. Clicando no botão OK (como pode ver na captura de ecrã) a palavra-passe encriptada será guardada num ficheiro externo (neste exemplo, que é o ficheiro MailJet.txt).
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "C:\Users\dekib\Documents\PSCredential\MailJet.txt"
Agora a nossa palavra-passe é encriptada e guardada num ficheiro externo para que a possamos utilizar ao chamar a Send-MailMessage CmdLet.
Aqui está um exemplo que nos mostra como utilizar a palavra-passe encriptada num ficheiro txt externo.
NOTE: Para que este exemplo funcione para si, por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Agora, quando tivermos eliminado as formas de passar credenciais SMTP para o Send-MailMessage CmdLet, podemos concentrar-nos em diferentes exemplos.
Como enviar anexo(s) com e-mail usando PowerShell
Por vezes é muito conveniente acompanhar o e-mail com alguns anexos que nos darão informação adicional. Embora já tenhamos utilizado exemplos de envio de emails com anexos utilizando PowerShell, vejamos um exemplo dedicado. Estamos a utilizar o parâmetro -Attachments de Send-MailMessage CmdLet para terminar o trabalho:
NOTE: Para que este exemplo funcione para si por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $EmailTo -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Se quisermos enviar vários anexos no mesmo e-mail, podemos fazê-lo facilmente, uma vez que -Notachments parameter of Send-MailMessage CmdLet aceita um array de strings como valores de entrada. Contudo, tenha cuidado com a forma como passa o array de strings apenas não para se surpreender com resultados inesperados.
Esta é a forma correcta de passar dois anexos
$Attachments = "$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls"
e este também:
$Attachments = @("$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls")
mas este está errado. Portanto, preste atenção a isso.
$Attachments = "$home\Documents\PSlogs\Error_Log.txt, $home\Documents\PSReports\Excel_report.xls"
Como Enviar Email a Vários Destinatários Usando PowerShell
Se quisermos enviar emails usando PowerShell a vários destinatários do que temos uma conveniência de parâmetro – Para isso aceitamos uma série de strings em Send-MailMessage CmdLet. É importante prestar atenção à forma como adicionamos múltiplos endereços de correio electrónico como um conjunto de strings e não apenas uma única string com valores separados por vírgulas. No final deste subtópico, dei vários exemplos das formas certas e erradas de passar múltiplos destinatários.
Aqui está um exemplo de envio de e-mail para múltiplos destinatários utilizando PowerShell :
NOTE: Para que este exemplo funcione para si por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $ToRecipients, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $ToRecipients -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Note a diferença entre a passagem correcta dos endereços de correio electrónico do destinatário como uma string array:
$ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3"
e passagem errada apenas como uma única string (os endereços de correio electrónico são valores separados por vírgulas mas dentro de uma única string) em vez de uma string array.
$ToRecipients = "recipient’s email address 1, recipient’s email address 2, recipient’s email address 3"
Além de enviar e-mails a múltiplos destinatários, temos normalmente características de envio de Cc (Cópia a Carbono) e Bcc (Cópia a Carbono Cego) e, para isso, usamos os parâmetros -Cc e -Bcc (Send-MailMessage CmdLet), respectivamente, enquanto fornecemos os endereços de e-mail como valores para cada um deles.
Como enviar e-mail com corpo HTML usando PowerShell
Temos a opção de enviar os nossos e-mails usando PowerShell com conteúdo HTML dentro do corpo do e-mail usando Send-MailMessage CmdLet. Para podermos enviar e-mails usando PowerShell como HTML precisamos de fazer duas coisas adicionais:
- – o valor do parâmetro do corpo deve ser HTML bem formatado para que o cliente de e-mail nos mostre um e-mail em HTML.
- – o parâmetro de comutação do corpo do PowerShell foi passado para Send-MailMessage CmdLet apenas para o notificar que – o parâmetro do corpo do e-mail tem código HTML.
Aqui está um exemplo de uma chamada para Send-MailMessage CmdLet que cria e-mail HTML em vez de texto simples no corpo do e-mail.
NOTE: Para que este exemplo funcione para si, por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. HTML Example" $EmailHTMLBody = 'Learn PowerShell With Dejan - ImproveScripting.com'$SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailHTMLBody" -BodyAsHtml -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Aqui está o e-mail resultante que foi recebido e, como pode ver no corpo do e-mail, temos um link HTML para este website em vez de apenas texto simples.
Como enviar E-mail do PowerShell Usando o servidor Gmail SMTP
Talvez a minha resposta o surpreenda, mas não recomendo usar o servidor Gmail SMTP para enviar e-mails usando o PowerShell Send-MailMessage CmdLet.
A razão disso é o facto de termos de activar na funcionalidade de conta Gmail: “Habilitar aplicações menos seguras para aceder ao Gmail”. Isto irá baixar a segurança da nossa conta Gmail e prefiro não o fazer especialmente porque existem muitas outras opções disponíveis publicamente.
System.Net.Mail API
Uma das abordagens alternativas para enviar e-mails utilizando PowerShell é utilizar classes .NET em System.Net.Mail namespace. Esta abordagem é pré-Send-MailMessage CmdLet time quando Send-MailMessage CmdLet não estava disponível.
Aqui está uma chamada de exemplo utilizando System.Net.Mail API:
NOTE: Para que este exemplo funcione para si por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address”$EmailTo = "recipient’s email address”$EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (System.Net.Mail API Example)”$EmailBody = "This email has as the attachments error log."$SMTPServer = "SMTP server”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password);$SMTPClient.Send($EmailFrom, $EmailTo, $EmailSubject, $EmailBody)
Aqui está o e-mail recebido na caixa de entrada depois de substituir o exemplo por valores reais dos parâmetros necessários:
Na minha opinião, a utilização de classes de espaço de nomes System.Net.Mail .NET é uma abordagem mais natural para programadores .NET enquanto que a utilização de Send-MailMessage CmdLet é uma abordagem mais nativa de PowerShell. De qualquer modo, é bom estar familiarizado com alternativas e ambas as abordagens são úteis para ter em PowerShell scripting skillset.
Como escrever a própria CmdLet para o envio de emails usando PowerShell
Eu escrevi a minha própria CmdLet PowerShell que fornece a funcionalidade de envio de emails chamada Send-Email CmdLet.
Esta CmdLet pertence ao projecto Efficiency Booster PowerShell. Este projecto é a biblioteca de diferentes CmdLets que pode ajudar-nos pessoalmente a fazer as nossas tarefas diárias de forma mais eficiente e precisa.
Código fonte para Send-Email CmdLet pode ser descarregado a partir deste ficheiro zip, por isso, sinta-se à vontade para o descarregar ou veja o código fonte no fundo deste artigo.
Send-Email CmdLet faz parte do módulo Utils e se descarregou o código fonte pode ser encontrado na pasta …Documents\WindowsPowerShell\Modules\02utils
Não vou explicar muito sobre esta CmdLet uma vez que é basicamente um invólucro em torno do Send-MailMessage CmdLet e não é especialmente inovador, mas é importante usar as capacidades PowerShell de enviar e-mails como um mecanismo importante na automatização e eficiência.
INFO: Se quiser saber como instalar e configurar os ficheiros do Projecto PowerShell de Aumento de Eficiência, leia o artigo seguinte: Como instalar e configurar o PowerShell: CmdLets, Módulos, Perfis.
Como Usar Enviar Funcionalidade de Email no PowerShell
Dar-lhe-ei alguns exemplos de como tenho usado emails combinados com algumas outras funcionalidades PowerShell para ser mais eficiente ou para ter uma melhor visão geral do sistema que precisa de ser mantido.
Exemplo: Espaço livre em disco nos servidores
Queria ter uma visão geral do espaço livre nos discos dos servidores que estava a manter. Assim, escrevi o meu próprio PowerShell CmdLet Get-DiskFreeSpace que irá verificar o espaço livre em cada disco de todos os servidores; além disso, esta CmdLet foi programada para funcionar uma vez por semana e produzir um relatório como uma folha de Excel que será enviada para o meu e-mail para que eu possa analisá-lo e evitar espaços livres em disco baixos.
Este exemplo pode ser expandido para ser utilizado no planeamento da capacidade e enviar os dados para MS SQL Table e combinado com MS SQL Reporting Service para obter gráficos com tendências de utilização de armazenamento em disco para planear actualizações e expansões de armazenamento no futuro.
Recomendo vivamente que todos leiam o artigo dedicado a este PowerShell Cmdlet “Como obter tamanho de disco e espaço livre em disco utilizando o PowerShell”.
Exemplo: Logs de Eventos em Servidores Windows
O segundo exemplo tem sido parte da minha rotina de manutenção mensal para procurar em todos os Logs de Eventos do Windows por erros que estão a ocorrer nos servidores especialmente com respeito a SO e aplicações de missão crítica.
Para esse efeito, escrevi o meu próprio PowerShell CmdLet Get-ErrorFromEventLog que irá verificar os Logs de Eventos do Windows e procurar por erros em todos os servidores. Este script foi programado para ser executado uma vez por mês antes da manutenção e, além disso, produziria uma folha de Excel para que seja fácil de filtrar e olhar para os dados. Finalmente, foi enviado um relatório Excel para o meu endereço de correio electrónico. Assim, posso rever os erros e estar preparado para fazer as acções necessárias e evitar os mesmos erros no futuro.
Nesse sentido, pouparia um tempo tremendo ao não fazer um trabalho manual de registo em cada servidor e verificar manualmente cada Registo de Eventos do Windows em cada servidor.
Se mantiver um ambiente com muitos servidores, recomendo vivamente que adopte esta rotina mensal e veja o artigo escrito sobre o assunto “Como Obter Detalhes de Registo de Eventos do Windows Usando o PowerShell”.
Espero que estes dois exemplos desencadeiem as suas ideias para implementar possibilidades fantásticas, enviando um e-mail usando o PowerShell combinado com outras capacidades PowerShell.
Artigos Úteis PowerShell Enviar Email Artigos
Aqui estão alguns artigos e recursos úteis:
- Send-MailMessage
- DE0005: SmtpClient não deve ser usado
li>MailKitli>System.Net.Mail APIli>SmtpClientli>ClasseNetworkCredential/ul>
Send-Email CmdLet – Source Code
DISCLAIMER: A função Send-Email faz parte do Projecto Efficiency Booster PowerShell e como tal utiliza outras CmdLets que fazem parte do mesmo projecto. Assim, a melhor opção para que esta função funcione sem qualquer personalização adicional é descarregar o código fonte de todo o projecto daqui.
INFO: O meu melhor conselho para cada scripter PowerShell é aprender a escrever as próprias funções avançadas PowerShell e CmdLets e escrevi vários artigos a explicar isto, por isso leia-os por favor. Como Criar uma PowerShell CmdLet Personalizada (Passo a Passo). Aqui explico como utilizar a função adicional PowerShell para ser mais rápido a escrever funções PowerShell Como Escrever Funções Avançadas ou CmdLets com PowerShell (Rápido).
Aqui está o código fonte de todo o Send-Email CmdLet:
NOTE: Para que este exemplo funcione para si, por favor substitua os valores destas variáveis pelos seus próprios dados: $EmailFrom, $EmailTo, $SMTPserver, $EncryptedPasswordFile, $username.
<#.SYNOPSISSend email..DESCRIPTIONSend email..PARAMETER AttachmentsEmail attachments. File path to file(s) that will be attachments..PARAMETER PriorityEmail priority. Valid values are: Normal, High, and Low..PARAMETER errorlogWrite to Error log or not. Switch parameter. Error log is in PSLogs Folder of My documents..PARAMETER clientOK - O clientBK - B client.PARAMETER solutionFIN - Financial solution HR - Humane Resource solution.EXAMPLESend-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose.NOTESFunctionName : Send-EmailCreated by : Dejan MladenovicDate Coded : 09/23/2020 15:13:00More info : https://improvescripting.com/send-emails-using-powershell-with-many-examples/.LINK Send-MailMessagehttps://improvescripting.com/send-emails-using-powershell-with-many-examples/#>Function Send-Email {param ( ]$Attachments, $Priority = "Normal", $errorlog, $client, $solution)BEGIN { }PROCESS { try { Write-Verbose "Sending email..." if( $client -eq "OK" -and $solution -eq "FIN") { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Report from Financial solution - OK client." $EmailBody = "This email has as attachments error log and report file from Financial Solution - OK client." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } elseif ( $client -eq "Test" -and $solution -eq "Test" ) { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Test of Send-Email cmdlet" $EmailBody = "This is test email." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } Write-Verbose "Email sent." } catch { Write-Warning "There was a problem with sending email, check error log. Value of error is: $_" if ( $errorlog ) { $errormsg = $_.ToString() $exception = $_.Exception $stacktrace = $_.ScriptStackTrace $failingline = $_.InvocationInfo.Line $positionmsg = $_.InvocationInfo.PositionMessage $pscommandpath = $_.InvocationInfo.PSCommandPath $failinglinenumber = $_.InvocationInfo.ScriptLineNumber $scriptname = $_.InvocationInfo.ScriptName Write-Verbose "Start writing to Error log." Write-ErrorLog -hostname "Send Email was failing." -errormsg $errormsg -exception $exception -scriptname $scriptname -failinglinenumber $failinglinenumber -failingline $failingline -pscommandpath $pscommandpath -positionmsg $pscommandpath -stacktrace $stacktrace Write-Verbose "Finish writing to Error log." } }}END { }}#Send-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose