Galite naudoti įmontuotąSend-MailMessagecmdlet siųsti SMTP el. laiškus iš PowerShell (anksčiau galėjote naudoti .NetSystem.Net.Mailklasėje siųsti el. pašto žinutes). Send-MailMessage leidžia siųsti pranešimus su priedais, naudoti HTML formatą laiško turiniui, įgalinti pristatymo pranešimą, siųsti žinutę keliems gavėjams vienu metu ir tt Šiame straipsnyje sužinosime, kaip naudotiSend-MailMessagecmdlet, kad išsiųstumėte el. pašto pranešimus iš savo „PowerShell“ scenarijų.
Turinys:
- PowerShell Send-MailMessage cmdlet: parametrai ir pavyzdžiai
- Naudojant Send-MailMessage su SMTP Auth ir TLS/SSL
- Kaip išsiųsti el. laišką per „Gmail“ SMTP naudojant „PowerShell“?
PowerShell Send-MailMessage cmdlet: parametrai ir pavyzdžiai
Norėdami gauti cmdlet sintaksę, paleiskite šią komandą:
get-help Send-MailMessage
Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String>] [[-SmtpServer] <String>] [-Attachments <String[]>] [-Bcc <String[]>] [-BodyAsHtml] [-Cc <String[]>] [-Credential <PSCredential>] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding <Encoding>] -From <String> [-Port <Int32>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]
The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.
Štai pagrindinės parinktys:
- Nuo– yra siuntėjo adresas. Galite išsiųsti el. laišką bet kurio el. pašto adreso vardu, jei SMTP serveris netikrina siuntėjo adreso (anoniminis perdavimas);
- Į– gavėjo elektroninio pašto adresą;
- SMTPServeris– SMTP serverio adresas, per kurį norite siųsti el.
SMTP serverio adresas nereikalingas, jei nustatote pašto serverio adresą $PSEmailServer aplinkos kintamajame:
$PSEmailServer = "smtp.woshub.com"
Ši PowerShell komanda išsiųs el. laišką su nurodyta tema ir tekstu keliems gavėjams.
Send-MailMessage -From '[email protected]' -To '[email protected]','[email protected]' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'
Galite siųsti el. laišką į vieną ar daugiau gavėjų pašto dėžučių, į Teams kanalą arba į Exchange platinimo grupės adresą.
Kad būtų lengviau redaguoti cmdlet atributus, komandą Send-MailMessage galima pavaizduoti taip:
Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To '[email protected]','[email protected]' `
-From '[email protected]' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'
Atminkite, kad paskutinėje komandoje mes papildomai nustatėmeUTF8pašto kodavimas. Priešingu atveju, jei el. laiško temoje arba tekste yra ne ANSI simbolių, jie bus rodomi neteisingai.
„Windows PowerShell“ pagal numatytuosius nustatymus naudoja ANSI ir ASCII kodavimą. Jei atnaujinote savo PS versiją į PowerShell Core, atminkite, kad pagal numatytuosius nustatymus ši versija jau naudoja UTF-8 kodavimą.
Rekomenduojama skaityti:El. laiško siuntimas į „Microsoft Teams“ kanalą
Galite nurodyti kelis gavėjus naudodami parametrus:
To– įprasto gavėjo el. pašto adresai;Cc– el. pašto adresai, skirti išsiųsti el. laiško kopiją (CC);Bcc– el. pašto adresai, kurie gaus el. laiško kopiją, bet nebus nurodyti kaip pranešimo gavėjai.
Naudodami el. laiško pristatymo pranešimą galite įjungti-Pristatymo pranešimo parinktys(tai leidžia jums būti įspėtam, kai gavėjas gauna el. laišką). Galimi pranešimų tipai:
- OnSuccess(Praneškite, jei pristatymas sėkmingas)
- Dėl nesėkmės(Pranešti, jei pristatymas nesėkmingas)
- Vėlavimas(Praneškite, jei pristatymas vėluoja)
Vienoje komandoje galite nurodyti kelias parinktis:
Send-MailMessage … -DeliveryNotificationsOptions 'OnSuccess', 'OnFailure'
Pranešimas apie pristatymą bus išsiųstas į pašto dėžutę, kuri nurodyta laukelyje „Nuo“.
Taip pat galite nustatyti el. laiško prioritetą (nerodomas kai kuriose programose):
-Priority High|Low|Normal
Jei prie el. pašto norite pridėti priedą, naudokite-Priedaivariantas. Toliau pateiktame pavyzdyje mes ketiname siųsti el. laišką HTML formatu (-BodyAsHtml) ir pridėkite failą1.txt ir report.xsls iš vietinio disko.
$MailMessage = @{
To = "[email protected]"
Bcc = "[email protected]", "[email protected]"
From = "DC server <[email protected]>"
Subject = "DC Server Report"
Body = "<h1>Welcome!</h1> <p><strong>Generated:</strong> $(Get-Date -Format g)</p>”
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:Logsfile1.txt”, “C:Logsreport.xlsx”
}
Send-MailMessage @MailMessage -Credential $cred
Šiame pavyzdyje taip pat pakeitėme gavėjo rodomą vardą į „DC server“.
Štai kaip HTML el. laiškas su priedais atrodo „Gmail“ sąsajoje.


Kai siunčiate el. laišką „Exchange“ / „Microsoft 365“ bendrinamos pašto dėžutės, kuriai jums buvo suteikti „SendAs“ leidimai, vardu, galite nurodyti, kad pranešimo kopija būtų išsaugota šaltinio pašto dėžutės aplanke Išsiųstieji. Norėdami tai padaryti, įjunkiteMessageCopyForSentAsEnabledpašto dėžutės parametras:
Set-Mailbox it_dept -MessageCopyForSentAsEnabled $True
Naudojant Send-MailMessage su SMTP Auth ir TLS/SSL
Pagal numatytuosius nustatymus cmdlet Send-MailMessage siunčia el. laišką per numatytąjį nešifruotą SMTP prievadą TCP 25. Jei jūsų SMTP serveris leidžia siųsti el. laiškus tik naudojant šifruotą protokolą, prievado numerį galite nurodyti-Uostasatributas (dažniausiai tai yra 465 arba 587) ir –UseSslvariantas:
-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl
Klaida įvyks, jei SMTP serverio SSL sertifikatas nesutampa su FQDN, nurodytu HELO:
Send-MailMessage: The remote certificate is invalid according to the validation procedure.
Taip pat galite gauti klaidą, kai siunčiate el. laišką naudodami SSL/TLS šifravimą:
Send-MailMessage : Unable to read data from the transport connection: net_io_connectionclosed
Tokiu atveju rekomenduojama patikrinti toliau nurodytus dalykus
- Ar nurodytas SMTP prievadas yra atidarytas ir pasiekiamas iš jūsų kompiuterio:
Test-NetConnection smtp.woshub.com –Port 465 - Išbandykite kitą SMTP prievadą. Pavyzdžiui, 587 (msa), o ne 465 (smtps). 587 prievadas yra numatytasis, kai naudojamas STARTTLS plėtinys;
- Jei naudojate senesnę operacinę sistemą („Windows Server 2012“ / „Windows 8“ ir senesnę), turite įgalinti „PowerShell“ TLS 1.2 protokolo palaikymą naudodami komandą:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Toliau esančioje lentelėje pateikiami populiarių viešojo el. pašto paslaugų teikėjų SMTP serverio nustatymai, kuriuos galite naudoti siųsdami pranešimus iš „PowerShell“ (atminkite, kad paskyros sąsajoje turite leisti siųsti el. laiškus SMTP).
| Vardas | SMTP serverio adresas | Uostas | Šifravimo tipas |
| Gmail | smtp.gmail.com | 587 25 465 | TLS TLS SSL |
| Microsoft (Office) 365 | smtp.office365.com | 587 | TLS |
| Outlook.com | smtp-mail.outlook.com | 587 | TLS |
| Yahoo | smtp.mail.yahoo.com | 587 | TLS |
| iCloud paštas | smtp.mail.me.com | 587 | TLS |
| AOL | smtp.aol.com | 465 | SSL |
Jei SMTP serveris neleidžia anoniminio el. pašto adreso (perdavimas uždraustas), pamatysite šią klaidą:
5.7.1 Client was not authenticated.
arba:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM.
Tada galite autentifikuoti SMTP serverį naudodami- Pažymėjimasvariantas.
Galite interaktyviai prašyti vartotojo kredencialų autentifikavimui:
Send-MailMessage …… -Credential (Get-Credential)


Taip pat galite nurodyti paskyros kredencialus, kurie bus naudojami autentifikavimui kintamajame:
$cred = Get-Credential
Send-MailMessage ... -Credential $cred
Kaip išsiųsti el. laišką per „Gmail“ SMTP naudojant „PowerShell“?
Norėdami išsiųsti el. laišką iš savo pašto dėžutės vienoje iš viešųjų pašto paslaugų, rekomenduojama naudoti elProgramos slaptažodisvietoj slaptažodžio, kad galėtumėte pasiekti paskyrą / pašto dėžutę. Pavyzdžiui, sistemoje „Gmail“ galite sukurti programos slaptažodį, kai įgalinsite „Google“ paskyros dviejų veiksnių autentifikavimą. Sukurkite ir nukopijuokite programos slaptažodį sistemoje „Google“ (tai 16 simbolių slaptažodis).


Šiame pavyzdyje parodyta, kaip siųsti el. laišką iš „Google“ pašto dėžutės naudojant „PowerShell“. Vietoj „Google“ paskyros slaptažodžio turite naudoti programos slaptažodį. Šiame pavyzdyje programos slaptažodį, skirtą prisijungti prie „Gmail“ SMTP serverio, nurodysime tiesiogiai „PowerShell“ scenarijaus kode.
$From = "[email protected]"
$To = "[email protected]"
$Subject = "Test PowerShell email from $($env:computername)"
$Body = "some message test "
$Password = "your_google_app_password" | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $From, $Password
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer "smtp.gmail.com" -port 587 -UseSsl -Credential $Credential
Atminkite, kad „PowerShell“ išsaugo komandą su paprasto teksto slaptažodžiu „PowerShell“ komandų istorijos faile.
Kai naudojate komandą Send-MailMessage naujose PowerShell Core 7.x versijose, rodomas įspėjimas:
WARNING: The command 'Send-MailMessage' is obsolete. This cmdlet does not guarantee secure connections to SMTP servers. While there is no immediate replacement available in PowerShell, we recommend you do not use Send-MailMessage at this time. See https://aka.ms/SendMailMessage for more information.


„Send-MailMessage“ cmdlet naudoja .NET SmtpClient klasę, kuri nepalaiko šiuolaikinių autentifikavimo metodų, įskaitant „Microsoft Modern Authentication“. Norint siųsti el. laiškus iš PowerShell per Microsoft 365/Exchange Online, rekomenduojama naudoti Graph API (naudojantSend-MgUserMailcmdlet arbaInvoke-RestMethodnorėdami iškviesti sendMail metodą per REST API).











