Share this post:
De mogelijkheid om emails te versturen met PowerShell is een geweldige feature en kan ons enorm helpen als het op de juiste manier wordt geïmplementeerd. Dus ik zal je veel voorbeelden laten zien van hoe je e-mails kunt versturen met PowerShell en hoe je dit verder kunt implementeren in je dagelijkse IT routines.
Om e-mails te versturen met PowerShell gebruiken we Send-MailMessage PowerShell CmdLet en we hebben een paar vereisten nodig voordat we het gaan gebruiken die ik hier zal lay-out:
- Eerst hebben we een SMTP server nodig die een service zal bieden voor het verzenden van onze e-mails naar de ontvangers.
- Tweede, we krijgen SMTP-referenties (gebruikersnaam en wachtwoord) van onze SMTP-serverprovider om ons te authenticeren bij de service tijdens het verzenden van e-mails.
- Ten slotte kunnen we, nadat we de SMTP-serverprovider en de referenties hebben opgehelderd, Send-MailMessage PowerShell CmdLet gaan gebruiken met een aantal voorbeelden die ik voor je heb voorbereid.
Laten we ons eens verdiepen in een aantal geweldige voorbeelden, zodat we een goed beeld krijgen van de mogelijkheden voor het verzenden van e-mail met PowerShell.
Inhoudsopgave
E-mail verzenden met PowerShell – Eenvoudig voorbeeld
Zoals we al hebben geconcludeerd zal PowerShell Send-MailMessage CmdLet ons helpen om e-mail te verzenden vanuit PowerShell en hier is een heel eenvoudig voorbeeld:
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
BELANGRIJK: De waarden voor alle parameters behalve Port moeten worden vervangen door de werkelijke waarden die voor uw geval van toepassing zijn, om deze regel code te laten werken.
In dit eenvoudige voorbeeld hebben we slechts een paar noodzakelijke parameters van Send-MailMessage PowerShell CmdLet gebruikt om een eenvoudige e-mail naar de ontvanger te sturen:
- -To parameterwaarde is het e-mailadres van de ontvanger
- -From parameterwaarde is het e-mailadres van de afzender
- -Subject parameterwaarde is de onderwerptekst van de e-mail
- -Body parameterwaarde is de inhoud van de e-mail. Dit is eenvoudige tekst inhoud en later zullen we zien hoe we HTML inhoud in de body tekst van de e-mail kunnen versturen.
- -Credential parameter is de SMTP server gebruikersnaam en wachtwoord credentials. Kijk naar de volgende sub-onderwerpen in dit artikel waar ik de manieren heb uitgelegd om de credentials door te geven. Het is erg belangrijk, dus let daar goed op.
- -SmtpServer parameter waarde is het SMTP server adres.
- -Port parameter waarde is het poort nummer waar SMTP naar luistert voor de email berichten.
NOTE: Als je voor de -From parameter een afzender email adres gebruikt dat niet geregistreerd is als afzender bij de SMTP server dan kan het zijn dat je een email krijgt van SMTP server support dat je probeert emails te versturen van een niet geregistreerd afzender email adres. Je moet dus of een geregistreerd email adres gebruiken of een extra afzender email adres registreren.
Hier is de email die ik heb ontvangen met gebruik van mijn SMTP server adres en credentials. Zoals u kunt zien hebben we een voorbeeld van het verzenden van een e-mail met bijlage en zien we de Subject tekst en een deel van de e-mail body tekst in de Gmail Inbox.
In de e-mailbody kunnen we de inhoud zien van het e-mailbericht dat met PowerShell is verzonden. Dit is een voorbeeld van het verzenden van een e-mail met PowerShell met Subject tekst, via MailJet SMTP Server, body tekst is gewoon tekst en met bijlage bij de e-mail.
Er zijn nog veel meer parameters van Send-MailMessage CmdLet die we verderop in dit artikel in de volgende voorbeelden zullen zien.
Maar voordat we dieper ingaan op de voorbeelden en nuances van het verzenden van e-mails met PowerShell, moeten we eerst weten wat de vereisten zijn voor het verzenden van de e-mails en dat zijn SMTP Server en SMTP Server authenticatiegegevens.
Welke SMTP server te gebruiken en hoe een SMTP server te verkrijgen
Nu vraagt u zich waarschijnlijk af, wacht eens even, ik wil een email versturen met PowerShell en waarom hebben we het over een SMTP server.
Wel, herinnert u zich de oude dagen toen we berichten verstuurden in enveloppen? Leverde u uw enveloppen persoonlijk af bij de ontvanger? Natuurlijk niet. Er is een grote kans, op zijn minst te zeggen, dat u gebruik heeft gemaakt van een aantal providers zoals Post Office om dit voor u te doen.
So SMTP Server is onze provider die e-mails die we in PowerShell schrijven voor ons verstuurt en naar de ontvangers stuurt.
INFO: SMTP staat voor (Simple Mail Transfer Protocol) en het is een overeengekomen “taal” of communicatieprotocol voor de toepassingen op servers om e-mails te verzenden.
Als u zich afvraagt welke SMTP Server u moet gebruiken, doe dan uw onderzoek, want er zijn veel bedrijven op het internet die een dergelijke service bieden en om er maar een paar te noemen: Gmail, Hotmail, Yahoo, etc.
Voor mijn voorbeelden en om de code te testen heb ik MailJet gebruikt, gewoon omdat het makkelijk was om een account aan te maken en alles in te stellen.
Als ik een account heb aangemaakt bij MailJet is het mogelijk om de SMTP Instellingen te zien:
- het SMTP Server adres (“in-v3.mailjet.com”),
- een poort die wordt gebruikt (587),
- gebruikersnaam, en
- wachtwoord voor SMTP credentials.
Al deze informatie is belangrijk wanneer we e-mails willen verzenden met Send-MailMessage PowerShell CmdLet dus zorg ervoor dat je ze hebt voordat je begint met het gebruik van PowerShell send email feature.
How To Send SMTP email with authentication using PowerShell
Er zijn verschillende manieren om SMTP credentials te verstrekken tijdens het verzenden van e-mails met PowerShell. We zullen u twee verschillende benaderingen laten zien.
De eerste is eenvoudiger maar minder veilig omdat het SMTP-serverwachtwoord zichtbaar is voor anderen die toegang hebben tot de broncode.
De tweede heeft een extra stap, maar is veiliger omdat we het wachtwoord beveiligd en versleuteld kunnen bewaren in een extern bestand dat we kunnen gebruiken bij het verstrekken van SMTP-referenties.
SMTP credentials versturen met een zichtbaar wachtwoord in de broncode (minder veilig)
In dit voorbeeld geven we verschillende parameters aan Send-MailMessage CmdLet, maar de belangrijkste parameters voor de uitleg van dit voorbeeld zijn:
- SmtpServer
- Credential
NOOT: Om dit voorbeeld voor u te laten werken dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $EmailFrom, $EmailTo, $SMTPserver, $gebruikersnaam.
$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 parameter waarde heeft een adres van de SMTP Server, bijvoorbeeld, MailJet SMTP Server is “in-v3.mailjet.com”.
De Credential parameter omsluit gebruiker en wachtwoord SMTP Server credentials en moet worden doorgegeven als een PSCredential object. We moeten speciale aandacht besteden aan het doorgeven van een wachtwoord aan de creatie van een PSCredential object, omdat een wachtwoord geen platte tekst kan zijn, maar van het gegevenstype SecureString. Dus moeten we ons gewone wachtwoord omzetten in SecureString data type met behulp van ConvertTo-SecureString CmdLet.
$password = "your_password" | ConvertTo-SecureString -AsPlainText -Force
Zoals gezegd is deze methode niet al te gecompliceerd, maar heeft een beveiligingsprobleem omdat we ons SMTP Server wachtwoord als platte tekst in onze broncode bewaren, wat niet de beste werkwijze is.
Eindelijk is hier het resultaat en de ontvangen e-mail met dit voorbeeld:
SMTP-referenties verzenden met een verborgen wachtwoord in de broncode (veiliger)
In dit voorbeeld, geven we SMTP-referenties op terwijl we Send-MailMessage CmdLet oproepen, maar deze keer is het wachtwoord niet zichtbaar. Deze methode vereist echter een extra stap van onze kant om te kunnen werken.
Eerst versleutelen we ons wachtwoord in een extern txt-bestand en gebruiken dat bestand om ons wachtwoord te ontsleutelen en te lezen wanneer we dat nodig hebben in onze broncode.
Wanneer we deze code uitvoeren, wordt ons gevraagd om het SMTP-serverwachtwoord op te geven. Als we op OK klikken (zoals te zien is op de schermafbeelding) wordt het versleutelde wachtwoord opgeslagen in een extern bestand (in dit voorbeeld is dat MailJet.txt bestand).
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "C:\Users\dekib\Documents\PSCredential\MailJet.txt"
Nu is ons wachtwoord versleuteld en opgeslagen in een extern bestand, zodat we het kunnen gebruiken wanneer we Send-MailMessage CmdLet.
Hier volgt een voorbeeld dat laat zien hoe we versleuteld wachtwoord in een extern txt-bestand kunnen gebruiken.
NOOT: Om dit voorbeeld voor u te laten werken, dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $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
Nu we de manieren om SMTP credentials door te geven aan de Send-MailMessage CmdLet hebben weggewerkt, kunnen we ons richten op verschillende voorbeelden.
Hoe bijvoegsels bij e-mail verzenden met PowerShell
Soms is het erg handig om bij een e-mail bijlagen te voegen die ons extra informatie geven. Hoewel we al voorbeelden hebben gebruikt van het verzenden van e-mails met bijlagen met behulp van PowerShell, laten we nu eens kijken naar een specifiek voorbeeld. We gebruiken de parameter -Attachments van Send-MailMessage CmdLet om de klus te klaren:
NOOT: Om dit voorbeeld voor u te laten werken, dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $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
Als we meerdere bijlagen in dezelfde email willen versturen kunnen we dat eenvoudig doen aangezien -Attachments parameter van Send-MailMessage CmdLet een array van strings als invoerwaarden accepteert. Wees echter voorzichtig met hoe je de array van strings doorgeeft om niet verrast te worden door onverwachte uitkomsten.
Dit is de juiste manier om twee bijlagen door te geven
$Attachments = "$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls"
en deze ook:
$Attachments = @("$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls")
maar deze is fout. Let daar dus even op.
$Attachments = "$home\Documents\PSlogs\Error_Log.txt, $home\Documents\PSReports\Excel_report.xls"
E-mail naar meerdere ontvangers verzenden met PowerShell
Als we met PowerShell e-mails naar meerdere ontvangers willen verzenden, kunnen we in Send-MailMessage CmdLet de parameter -To gebruiken, waarmee een reeks tekenreeksen kan worden geaccepteerd. Het is belangrijk om aandacht te besteden aan hoe we meerdere e-mailadressen toevoegen als een array van strings en niet slechts een enkele string met door komma’s gescheiden waarden. Aan het eind van dit subtopic heb ik een aantal voorbeelden gegeven van de goede en foute manieren om meerdere ontvangers door te geven.
Hier volgt een voorbeeld van het versturen van e-mail naar meerdere ontvangers met behulp van PowerShell :
NOOT: Om dit voorbeeld voor u te laten werken dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $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
Merk het verschil op tussen het correct doorgeven van de e-mailadressen van de ontvanger als een string array:
$ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3"
en het foutief doorgeven als een enkele string (e-mailadressen zijn door komma’s gescheiden waarden, maar binnen een enkele string) in plaats van een string array.
$ToRecipients = "recipient’s email address 1, recipient’s email address 2, recipient’s email address 3"
Naast het versturen van emails naar meerdere ontvangers, hebben we gewoonlijk email functies voor het versturen van Cc (Carbon copy) en Bcc (Blind carbon copy) en daarvoor gebruiken we parameters -Cc en -Bcc (Send-MailMessage CmdLet) respectievelijk terwijl we de email adressen als waarden voor elk van hen opgeven.
Hoe verstuur ik een e-mail met HTML body met PowerShell
We hebben de mogelijkheid om onze e-mails met PowerShell te versturen met HTML-inhoud in de e-mailbody met Send-MailMessage CmdLet. Om e-mails met PowerShell als HTML te kunnen verzenden, moeten we twee extra dingen doen:
- -body parameterwaarde moet goed geformatteerde HTML zijn, zodat de e-mailclient ons een HTML-e-mail kan tonen.
- -BodyAsHtml schakelparameter is doorgegeven aan Send-MailMessage CmdLet alleen om het te laten weten dat -body parameter HTML-code bevat.
Hier volgt een voorbeeld van een oproep aan Send-MailMessage CmdLet die HTML e-mail creëert in plaats van platte tekst in de e-mailbody.
NOOT: Om ervoor te zorgen dat dit voorbeeld voor jou werkt, moet je de waarden van deze variabelen vervangen door je eigen gegevens: $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
Hier ziet u de e-mail die is ontvangen en zoals u kunt zien hebben we in de body van de e-mail een HTML-link naar deze website in plaats van alleen maar platte tekst.
Hoe verstuur ik E-mail verzenden vanuit PowerShell met behulp van Gmail SMTP-server
Misschien zal mijn antwoord u verrassen, maar ik raad u niet aan Gmail SMTP-server te gebruiken voor het verzenden van e-mails met PowerShell Send-MailMessage CmdLet.
De reden hiervoor is het feit dat we moeten inschakelen in Gmail-account functie: “Minder veilige apps inschakelen voor toegang tot Gmail”. Dit verlaagt de veiligheid van onze Gmail-account en ik geef er de voorkeur aan dit niet te doen, vooral omdat er genoeg andere opties publiekelijk beschikbaar zijn.
System.Net.Mail API
Eén van de alternatieve benaderingen om e-mails te verzenden met PowerShell is het gebruik van .NET klassen in System.Net.Mail namespace. Deze aanpak stamt uit de tijd voor Send-MailMessage CmdLet nog niet beschikbaar was.
Hier volgt een voorbeeldoproep met System.Net.Mail API:
NOOT: Om dit voorbeeld voor u te laten werken, dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $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)
Hier ziet u de ontvangen e-mail in de inbox na het vervangen van het voorbeeld door de werkelijke waarden van de benodigde parameters:
Naar mijn mening is het gebruik van System.Net.Mail .NET-naamruimteklassen een meer natuurlijke benadering voor .NET-ontwikkelaars, terwijl het gebruik van Send-MailMessage CmdLet een meer native PowerShell-benadering is. Hoe dan ook, het is goed om bekend te zijn met alternatieven en beide benaderingen zijn nuttig om te hebben in PowerShell scripting skillset.
Hoe schrijf je eigen CmdLet voor het verzenden van e-mails met behulp van PowerShell
Ik heb mijn eigen PowerShell CmdLet geschreven die de verzenden mail functionaliteit genaamd Send-Email CmdLet biedt.
Deze CmdLet behoort tot Efficiency Booster PowerShell Project. Dit project is de bibliotheek van verschillende CmdLets die ons IT-personeel kunnen helpen om onze dagelijkse taken efficiënter en nauwkeuriger uit te voeren.
Broncode voor Send-Email CmdLet kan worden gedownload van dit zip-bestand, dus voel je vrij om het te downloaden of kijk naar de broncode aan de onderkant van dit artikel.
Send-Email CmdLet is onderdeel van de Utils module en als u de broncode heeft gedownload kunt u deze vinden in de map …documentenWindowsPowerShellModules02utils
Ik zal niet te veel uitleggen over deze CmdLet omdat het in principe een wikkel is rond Send-MailMessage CmdLet en niet bijzonder vernieuwend maar het is belangrijk om PowerShell mogelijkheden van het verzenden van emails te gebruiken als een belangrijk mechanisme in automatisering en efficiency.
INFO: Als u wilt weten hoe u Efficiency Booster PowerShell Project bestanden installeert en configureert, lees dan het volgende artikel: Hoe PowerShell te installeren en te configureren: CmdLets, Modules, Profiles.
How To Use Send Email Feature In PowerShell
Ik zal u een paar voorbeelden geven van hoe ik e-mails heb gebruikt in combinatie met een aantal andere PowerShell functies om efficiënter te zijn of om een beter overzicht te hebben van het systeem dat onderhouden moet worden.
Voorbeeld: Disk Free Space On Servers
Ik wilde een overzicht hebben van de vrije ruimte op de schijven van servers die ik onderhield. Dus heb ik mijn eigen PowerShell CmdLet Get-DiskFreeSpace geschreven die de vrije ruimte op elke disk van alle servers controleert, verder is deze CmdLet gepland om een keer per week te draaien en een rapport te produceren als een Excel sheet dat naar mijn email wordt gestuurd zodat ik het kan bekijken en lage disk vrije ruimtes kan voorkomen.
Dit voorbeeld kan verder worden uitgebreid om te worden gebruikt voor capaciteitsplanning en de gegevens verder te sturen naar MS SQL Table en te combineren met MS SQL Reporting Service om grafieken te krijgen met trends van schijfopslaggebruik om upgrades en uitbreidingen van opslag in de toekomst te plannen.
Ik raad iedereen aan om het artikel te lezen dat aan deze PowerShell Cmdlet is gewijd “How To Get Disk Size And Disk Free Space Using PowerShell”.
Voorbeeld: Windows Event Logs On Servers
Het tweede voorbeeld maakt deel uit van mijn maandelijkse onderhoudsroutine om in alle Windows Event Logs te kijken naar fouten die zich op de servers voordoen, met name met betrekking tot OS en bedrijfskritische toepassingen.
Daartoe heb ik mijn eigen PowerShell CmdLet Get-ErrorFromEventLog geschreven waarmee ik Windows Event Logs controleer en op zoek ga naar fouten op alle servers. Dit script is gepland om eens per maand te draaien voor onderhoud en verder zou het Excel Sheet produceren zodat het gemakkelijk is om te filteren en de gegevens te bekijken. Tenslotte is er een Excel rapport naar mijn email adres gestuurd. Zo kan ik de fouten bekijken en de nodige maatregelen treffen om dezelfde fouten in de toekomst te voorkomen.
In die zin zou ik enorm veel tijd besparen door niet elke server handmatig te hoeven loggen en elk Windows Event Log op elke server handmatig te controleren.
Als je een omgeving met veel servers onderhoudt, raad ik je ten zeerste aan deze maandelijkse routine over te nemen en het artikel “How To Get Windows Event Logs Details Using PowerShell” te lezen.
Ik hoop dat deze twee voorbeelden je op ideeën brengen om fantastische mogelijkheden te implementeren door een e-mail te verzenden met behulp van PowerShell in combinatie met andere PowerShell-mogelijkheden.
Nuttige PowerShell Send Email-artikelen
Hier zijn enkele nuttige artikelen en bronnen:
- Send-MailMessage
- DE0005: SmtpClient mag niet worden gebruikt
- MailKit
- System.Net.Mail API
- SmtpClient
- NetworkCredential Class
Send-Email CmdLet – Source Code
DISCLAIMER: Send-Email functie is onderdeel van het Efficiency Booster PowerShell Project en maakt als zodanig gebruik van andere CmdLets die onderdeel zijn van hetzelfde project. Dus de beste optie voor u om deze functie te laten werken zonder enige extra aanpassing is om de broncode van het hele project van hier te downloaden.
INFO: Mijn beste advies aan elke PowerShell scripter is om te leren zelf PowerShell Advanced Functions en CmdLets te schrijven en ik heb verschillende artikelen geschreven waarin dit wordt uitgelegd, dus lees ze alsjeblieft. Hoe maak je een aangepaste PowerShell CmdLet (stap voor stap). Hier leg ik uit hoe je PowerShell Add-on Functie te gebruiken om sneller te zijn in het schrijven van PowerShell Functies Hoe schrijf je geavanceerde functies of CmdLets met PowerShell (snel).
Hier volgt de broncode van de hele Send-Email CmdLet:
NOOT: Om dit voorbeeld voor u te laten werken, dient u de waarden van deze variabelen te vervangen door uw eigen gegevens: $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