Share this post:
Możliwość wysyłania emaili za pomocą PowerShell jest świetną funkcją i może nam bardzo pomóc, jeśli zostanie wdrożona w odpowiedni sposób. Pokażę wam wiele przykładów jak możecie wysyłać emaile używając PowerShell i jak możecie to dalej implementować w waszej codziennej rutynie IT.
Aby wysyłać emaile używając PowerShell użyjemy Send-MailMessage PowerShell CmdLet i potrzebujemy kilku warunków wstępnych zanim zaczniemy go używać, które tutaj rozłożę:
- Po pierwsze, potrzebujemy serwera SMTP, który będzie dostarczał usługę przesyłania naszych emaili do odbiorców.
- Po drugie, otrzymamy dane uwierzytelniające SMTP (nazwę użytkownika i hasło) od naszego dostawcy serwera SMTP w celu uwierzytelnienia nas do usługi podczas przesyłania e-maili.
- Wreszcie, po oczyszczeniu dostawcy serwera SMTP i poświadczeń możemy zacząć używać Send-MailMessage PowerShell CmdLet z kilkoma przykładami, które przygotowałem dla Ciebie.
Zanurzmy się w kilku niesamowitych przykładach, abyśmy mogli uzyskać wygląd i poczucie możliwości wysyłania wiadomości e-mail za pomocą PowerShell.
Spis treści
Wysyłanie emaili za pomocą PowerShell – Prosty przykład
Jak już doszliśmy do wniosku PowerShell Send-MailMessage CmdLet pomoże nam wysłać email z PowerShell i oto bardzo prosty przykład:
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
WAŻNE: Wartości dla wszystkich parametrów z wyjątkiem Portu powinny być zastąpione rzeczywistymi wartościami mającymi zastosowanie w twoim przypadku, aby ta linia kodu działała.
W tym prostym przykładzie użyliśmy tylko kilku niezbędnych parametrów Send-MailMessage PowerShell CmdLet do wysłania prostego e-maila do odbiorcy:
- -Tow parametr wartość to adres e-mail odbiorcy
- -From parametr wartość to adres e-mail nadawcy
- -Subject parametr wartość to temat e-maila
- -Body parametr wartość to treść e-maila. Jest to zwykła treść tekstowa, a później zobaczymy, jak możemy wysłać treść HTML w treści wiadomości.
- -Credential parametr jest nazwą użytkownika serwera SMTP i hasłem poświadczającym. Proszę spojrzeć na następujące podtematy w tym artykule, gdzie wyjaśniłem sposoby przekazywania danych uwierzytelniających. Jest to bardzo ważne więc zwróć na to uwagę.
- -SmtpServer wartość parametru to adres serwera SMTP.
- -Port wartość parametru to numer portu, na którym SMTP nasłuchuje wiadomości email.
UWAGA: Jeśli dla parametru -From użyjesz adresu email nadawcy, który nie jest zarejestrowany jako nadawca na serwerze SMTP możesz otrzymać email od obsługi serwera SMTP, że próbujesz wysyłać emaile z niezarejestrowanego adresu email nadawcy. Musisz więc użyć albo zarejestrowanego adresu email albo zarejestrować dodatkowy adres email nadawcy.
Tutaj jest email, który otrzymałem używając mojego adresu serwera SMTP i danych uwierzytelniających. Jak widać, mamy przykład wysłania wiadomości z załącznikiem i widzimy tekst tematu oraz część treści wiadomości w skrzynce odbiorczej Gmaila.
W treści wiadomości e-mail możemy zobaczyć treść wiadomości e-mail wysłanej za pomocą PowerShell. To jest przykład wysłania emaila za pomocą PowerShell z tekstem Subject, przez MailJet SMTP Server, tekstem body jest zwykły tekst i z załącznikiem do emaila.
Istnieje wiele więcej parametrów Send-MailMessage CmdLet, które zobaczymy w kolejnych przykładach nieco dalej w tym artykule.
Zanim jednak zanurzymy się w przykładach i niuansach wysyłania emaili za pomocą PowerShell, wyjaśnijmy sobie warunki wstępne potrzebne do wysyłania emaili, a są nimi serwer SMTP oraz dane uwierzytelniające serwera SMTP.
Jaki serwer SMTP użyć i jak zdobyć serwer SMTP
Teraz pewnie zastanawiasz się, poczekaj chwilę, chcę wysłać email używając PowerShell i dlaczego mówimy o serwerze SMTP.
Czy pamiętasz stare czasy, kiedy wysyłaliśmy wiadomości w kopertach? Czy dostarczaliście swoje koperty osobiście do odbiorcy? Oczywiście, że nie. Istnieje duże prawdopodobieństwo, przynajmniej tak można powiedzieć, że korzystaliście z dostawców takich jak Poczta, którzy robili to za Was.
Serwer SMTP jest więc naszym dostawcą, który będzie wysyłał maile, które napiszemy w PowerShell i wyśle je do odbiorców za nas.
INFO: SMTP to skrót od (Simple Mail Transfer Protocol) i jest to uzgodniony „język” lub protokół komunikacyjny dla aplikacji na serwerach do przesyłania e-maili.
Jeśli zastanawiasz się, którego serwera SMTP użyć, proszę zrób swoje badania, ponieważ istnieje wiele firm w Internecie, które świadczą takie usługi i tylko po to, aby wymienić kilka: Gmail, Hotmail, Yahoo, etc.
Do moich przykładów i do testowania kodu użyłem MailJet tylko dlatego, że łatwo było założyć konto i wszystko skonfigurować.
Po utworzeniu konta w MailJet można zobaczyć ustawienia SMTP:
- adres serwera SMTP („in-v3.mailjet.com”),
- port, który jest używany (587),
- nazwa użytkownika, oraz
- hasło dla poświadczeń SMTP.
Wszystkie te informacje są ważne kiedy chcemy wysłać email używając Send-MailMessage PowerShell CmdLet więc upewnij się, że je posiadasz przed rozpoczęciem używania funkcji wysyłania emaili PowerShell.
Jak wysłać email SMTP z uwierzytelnieniem używając PowerShell
Istnieje kilka sposobów na dostarczenie poświadczeń SMTP podczas wysyłania emaili używając PowerShell. Pokażemy dwa różne podejścia.
Pierwsze jest prostsze, ale mniej bezpieczne, ponieważ hasło do serwera SMTP jest widoczne dla innych, którzy mają dostęp do kodu źródłowego.
Drugie ma jeden dodatkowy krok, ale jest bardziej bezpieczne, ponieważ pozwala nam na przechowywanie hasła zabezpieczonego i zaszyfrowanego w zewnętrznym pliku, który możemy wykorzystać podczas dostarczania poświadczeń SMTP.
Wysyłanie poświadczeń SMTP z widocznym hasłem w kodzie źródłowym (mniej bezpieczne)
W tym przykładzie, przekazujemy kilka parametrów do Send-MailMessage CmdLet ale najważniejsze parametry dla wyjaśnienia tego przykładu to:
- SmtpServer
- Credential
UWAGA: Aby ten przykład działał u Ciebie proszę zastąpić wartości tych zmiennych własnymi danymi: $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
Wartość parametru SMTPServer zawiera adres serwera SMTP, na przykład serwer SMTP MailJet to „in-v3.mailjet.com”.
Parametr Credential zawiera poświadczenia użytkownika i hasła serwera SMTP i musi być przekazany jako obiekt PSCredential. Musimy zwrócić szczególną uwagę podczas przekazywania hasła do tworzenia obiektu PSCredential, ponieważ hasło nie może być zwykłym tekstem, ale typem danych SecureString. Tak więc musimy przekonwertować nasze zwykłe hasło na typ danych SecureString używając ConvertTo-SecureString CmdLet.
$password = "your_password" | ConvertTo-SecureString -AsPlainText -Force
Jak już wspomniałem ta metoda nie jest zbyt skomplikowana, ale ma problem z bezpieczeństwem, ponieważ przechowujemy nasze hasło serwera SMTP jako zwykły tekst w naszym kodzie źródłowym, co nie jest najlepszą praktyką.
Na koniec, oto wynik i email otrzymany przy użyciu tego przykładu:
Wysyłanie poświadczeń SMTP z ukrytym hasłem w kodzie źródłowym (bezpieczniej)
W tym przykładzie, przekażemy poświadczenia SMTP podczas wywoływania Send-MailMessage CmdLet, ale tym razem hasło nie będzie widoczne. Jednak ta metoda wymaga dodatkowego kroku z naszej strony aby zadziałała.
Po pierwsze zaszyfrujemy nasze hasło w zewnętrznym pliku txt tylko raz i użyjemy tego pliku do odszyfrowania i odczytania naszego hasła kiedy tylko będziemy tego potrzebować w naszym kodzie źródłowym.
Gdy uruchomimy ten kod zostaniemy poproszeni o podanie poświadczenia hasła serwera SMTP. Klikając na przycisk OK (jak widać na zrzucie ekranu) zaszyfrowane hasło zostanie zapisane w zewnętrznym pliku (w tym przykładzie jest to plik MailJet.txt).
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "C:\Users\dekib\Documents\PSCredential\MailJet.txt"
Teraz nasze hasło jest zaszyfrowane i zapisane w zewnętrznym pliku, dzięki czemu możemy go użyć podczas wywołania Send-MailMessage CmdLet.
Tutaj jest przykład, który pokazuje nam jak użyć zaszyfrowanego hasła w zewnętrznym pliku txt.
UWAGA: Aby ten przykład działał proszę zastąpić wartości tych zmiennych swoimi własnymi danymi: $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
Teraz, gdy już pozbyliśmy się sposobów na przekazanie danych uwierzytelniających SMTP do Send-MailMessage CmdLet możemy skupić się na innych przykładach.
Jak wysłać załącznik(i) z emaila używając PowerShell
Czasami bardzo wygodnie jest dołączyć do emaila jakiś załącznik, który da nam dodatkowe informacje. Pomimo tego, że mieliśmy już przykłady wysyłania emaili z załącznikami za pomocą PowerShell’a spójrzmy na jeden dedykowany przykład. Korzystamy z parametru -Attachments w Send-MailMessage CmdLet to finish the job:
UWAGA: Aby ten przykład zadziałał u Ciebie proszę zamienić wartości tych zmiennych na własne dane: $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
Jeśli chcemy wysłać kilka załączników w tym samym emailu, możemy to łatwo zrobić, ponieważ parametr -Attachments w Send-MailMessage CmdLet akceptuje tablicę łańcuchów jako wartości wejściowe. Należy jednak uważać, aby nie dać się zaskoczyć nieoczekiwanymi rezultatami.
To jest poprawny sposób na przekazanie dwóch załączników
$Attachments = "$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls"
i ten również:
$Attachments = @("$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls")
ale ten jest błędny. Zwróć więc na to uwagę.
$Attachments = "$home\Documents\PSlogs\Error_Log.txt, $home\Documents\PSReports\Excel_report.xls"
Jak wysłać email do wielu odbiorców przy użyciu PowerShell
Jeśli chcemy wysłać email przy użyciu PowerShell do kilku odbiorców to mamy ułatwienie w postaci parametru -To, który przyjmuje tablicę łańcuchów w Send-MailMessage CmdLet. Ważne jest aby zwrócić uwagę na to w jaki sposób dodajemy wiele adresów email jako tablicę ciągów znaków a nie tylko pojedynczy ciąg znaków z wartościami oddzielonymi przecinkami. Na końcu tego podtematu podałem kilka przykładów dobrych i złych sposobów przekazywania wielu odbiorców.
Przedstawiam przykład wysyłania emaila do wielu odbiorców za pomocą PowerShella :
UWAGA: Aby ten przykład działał u Ciebie proszę zamienić wartości tych zmiennych na własne dane: $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
Zauważ różnicę pomiędzy poprawnym przekazaniem adresów email odbiorców jako tablicę łańcuchów:
$ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3"
a niepoprawnym przekazaniem jako pojedynczy łańcuch (adresy email są wartościami rozdzielonymi przecinkami, ale w ramach pojedynczego łańcucha) zamiast tablicy łańcuchów.
$ToRecipients = "recipient’s email address 1, recipient’s email address 2, recipient’s email address 3"
Oprócz wysyłania emaili do wielu odbiorców, mamy zazwyczaj funkcje wysyłania Cc (Carbon copy) i Bcc (Blind carbon copy) i do tego używamy parametrów -Cc i -Bcc (Send-MailMessage CmdLet) odpowiednio podając adresy email jako wartości dla każdego z nich.
Jak wysłać email z treścią HTML używając PowerShell
Mamy możliwość wysyłania naszych emaili używając PowerShell z zawartością HTML wewnątrz treści emaila używając Send-MailMessage CmdLet. Aby móc wysyłać emaile używając PowerShell jako HTML musimy zrobić dwie dodatkowe rzeczy:
- -body parametr powinien być dobrze sformatowanym HTML aby klient email pokazał nam email w HTML.
- -BodyAsHtml parametr switch został przekazany do Send-MailMessage CmdLet tylko po to aby powiadomić go, że -body parametr ma w sobie kod HTML.
Tutaj znajduje się przykład wywołania Send-MailMessage CmdLet, który tworzy email HTML zamiast zwykłego tekstu w treści emaila.
UWAGA: Aby ten przykład działał dla Ciebie, proszę zamień wartości tych zmiennych na swoje własne dane: $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
Tutaj znajduje się wynikowy email, który został odebrany i jak widać w treści emaila mamy link HTML do tej strony zamiast zwykłego tekstu.
Jak wysłać Email From PowerShell Using Gmail SMTP Server
Może moja odpowiedź Cię zaskoczy, ale nie polecam używania serwera Gmail SMTP do wysyłania emaili za pomocą PowerShell Send-…MailMessage CmdLet.
Powodem tego jest fakt, że musimy włączyć w koncie Gmail funkcję: „Enable less secure apps to access Gmail”. Obniży to bezpieczeństwo naszego konta Gmail i wolałbym tego nie robić zwłaszcza, że jest wiele innych opcji dostępnych publicznie.
System.Net.Mail API
Jednym z alternatywnych podejść do wysyłania emaili za pomocą PowerShella jest użycie klas .NET w przestrzeni nazw System.Net.Mail. Podejście to jest sprzed czasów Send-MailMessage CmdLet, kiedy Send-MailMessage CmdLet nie było dostępne.
Przykładowe wywołanie przy użyciu System.Net.Mail API:
UWAGA: Aby ten przykład zadziałał proszę zastąpić wartości tych zmiennych własnymi danymi: $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)
Tutaj znajduje się otrzymany email w skrzynce odbiorczej po zastąpieniu przykładu rzeczywistymi wartościami niezbędnych parametrów:
W mojej opinii używanie klas System.Net.Mail .NET namespace jest bardziej naturalnym podejściem dla programistów .NET, podczas gdy używanie Send-MailMessage CmdLet jest bardziej natywnym podejściem PowerShell. Tak czy inaczej, dobrze jest znać alternatywy i oba podejścia są przydatne w zestawie umiejętności skryptowych PowerShell.
Jak napisać własny CmdLet do wysyłania emaili używając PowerShell
Napisałem mój własny CmdLet PowerShell, który dostarcza funkcjonalność wysyłania poczty o nazwie Send-Email CmdLet.
Ten CmdLet należy do projektu Efficiency Booster PowerShell. Projekt ten jest biblioteką różnych CmdLetów, które mogą pomóc nam, informatykom, w wykonywaniu naszych codziennych zadań bardziej efektywnie i dokładnie.
Kod źródłowy Send-Email CmdLet może być pobrany z tego pliku zip, więc zapraszam do pobrania go lub przejrzenia kodu źródłowego na dole tego artykułu.
Send-Email CmdLet jest częścią modułu Utils i jeśli pobrałeś kod źródłowy, można go znaleźć w folderze …Dokumenty WindowsPowerShell/Moduły
Nie będę wyjaśniał zbyt wiele na temat tego CmdLet, ponieważ jest to w zasadzie wrapper wokół Send-MailMessage CmdLet i nie jest szczególnie innowacyjny, ale ważne jest, aby korzystać z możliwości PowerShell w zakresie wysyłania e-maili jako ważnego mechanizmu w automatyzacji i wydajności.
INFO: Jeśli chcesz wiedzieć jak zainstalować i skonfigurować pliki projektu Efficiency Booster PowerShell przeczytaj poniższy artykuł: How To Install And Configure PowerShell: CmdLets, Modules, Profiles.
Jak wykorzystać funkcję Send Email w PowerShell
Podam kilka przykładów jak wykorzystałem emaile w połączeniu z kilkoma innymi funkcjami PowerShell aby być bardziej wydajnym lub mieć lepszy przegląd systemu, który musi być utrzymywany.
Przykład: Disk Free Space On Servers
Chciałem mieć przegląd wolnego miejsca na dyskach serwerów, którymi się opiekowałem. Napisałem więc własny PowerShell CmdLet Get-DiskFreeSpace który sprawdzi wolne miejsce na każdym dysku wszystkich serwerów, dalej ten CmdLet został zaplanowany tak aby uruchamiał się raz w tygodniu i tworzył raport jako arkusz Excel który będzie wysyłany na mój email abym mógł go przejrzeć i uniknąć niskiego poziomu wolnego miejsca na dyskach.
Przykład ten może być dalej rozbudowywany w celu wykorzystania go do planowania pojemności i przesyłania danych do MS SQL Table i w połączeniu z MS SQL Reporting Service, aby uzyskać wykresy z trendami wykorzystania pamięci dyskowej w celu zaplanowania modernizacji i rozbudowy pamięci masowej w przyszłości.
Bardzo polecam wszystkim przeczytanie artykułu poświęconego temu Cmdletowi PowerShell „How To Get Disk Size And Disk Free Space Using PowerShell”.
Przykład: Windows Event Logs On Servers
Drugi przykład jest częścią mojej comiesięcznej rutyny konserwacyjnej, aby zajrzeć do wszystkich dzienników zdarzeń Windows w poszukiwaniu błędów, które występują na serwerach, szczególnie w odniesieniu do systemu operacyjnego i aplikacji krytycznych.
W tym celu napisałem mój własny skrypt PowerShell CmdLet Get-ErrorFromEventLog, który sprawdzi dzienniki zdarzeń Windows i poszuka błędów na wszystkich serwerach. Ten skrypt został zaplanowany do uruchomienia raz w miesiącu przed konserwacją i dalej będzie produkować arkusz Excel, więc łatwo jest filtrować i patrzeć na dane. Wreszcie, raport Excel został wysłany na mój adres e-mail. W ten sposób mogę przejrzeć błędy i być przygotowanym do podjęcia niezbędnych działań w celu uniknięcia tych samych błędów w przyszłości.
W tym sensie zaoszczędziłbym ogromną ilość czasu nie wykonując ręcznej pracy polegającej na logowaniu się na każdym serwerze i ręcznym sprawdzaniu każdego Windows Event Log na każdym serwerze.
Jeśli utrzymujesz środowisko z dużą ilością serwerów, gorąco polecam przyjęcie tej comiesięcznej rutyny i spojrzenie na artykuł napisany na ten temat „How To Get Windows Event Logs Details Using PowerShell”.
Mam nadzieję, że te dwa przykłady uruchomią twoje pomysły na wdrożenie fantastycznych możliwości wysyłania wiadomości e-mail za pomocą PowerShell w połączeniu z innymi możliwościami PowerShell.
Przydatne artykuły PowerShell Send Email
Znajdziesz tu kilka przydatnych artykułów i zasobów:
- Send-MailMessage
- DE0005: SmtpClient should not be used
- MailKit
- System.Net.Mail API
- SmtpClient
- KlasaNetworkCredential
CmdLet Send-Email – kod źródłowy
DISCLAIMER: Funkcja Send-Email jest częścią projektu Efficiency Booster PowerShell i jako taka wykorzystuje inne CmdLety, które są częścią tego samego projektu. Tak więc najlepszą opcją dla Ciebie, aby ta funkcja działała bez żadnych dodatkowych dostosowań jest pobranie kodu źródłowego całego projektu stąd.
INFO: Moją najlepszą radą dla każdego skryptera PowerShell jest nauczenie się pisania własnych funkcji zaawansowanych PowerShell i CmdLets i napisałem kilka artykułów wyjaśniających to, więc proszę je przeczytać. Jak stworzyć własny CmdLet PowerShella (krok po kroku). Tutaj wyjaśniam jak używać funkcji dodatku PowerShell aby być szybszym w pisaniu funkcji PowerShell Jak pisać zaawansowane funkcje lub CmdLets z PowerShell (szybko).
Tutaj jest kod źródłowy całego Send-Email CmdLet:
UWAGA: Aby ten przykład działał dla Ciebie proszę zamienić wartości tych zmiennych na swoje własne dane: $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