Send-MailMessage: PowerShell ile E-posta Gönderme
PowerShell'den SMTP e-postaları göndermek için yerleşik Send-MailMessage cmdlet'ini kullanabilirsiniz. PowerShell sürüm 2.0 ve daha yeni sürümlerde e-posta göndermek için bu cmdlet'i kullanabilirsiniz (önceden .Net
System.Net.Maile-posta mesajları göndermek için sınıf). Send-MailMessage, ekleri olan mesajlar göndermenize, mesajın gövdesi için HTML biçimini kullanmanıza, teslim bildirimini etkinleştirmenize, aynı anda birden fazla alıcıya mesaj göndermenize vb. olanak tanır.
Send-MailMessagePowerShell betiklerinizden e-posta iletileri göndermek için cmdlet.
PowerShell Send-MailMessage Cmdlet: Parametreler ve Örnekler
Cmdlet'in sözdizimini almak için şu komutu çalıştırın:
get-help Send-MailMessageSend-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.
İşte ana seçenekler:
Kimden - bir gönderen adresidir. SMTP sunucusu gönderen adresini kontrol etmezse (anonim geçiş);
Kime - alıcının e-posta adresi;
SMTPServer - e-postayı göndermek istediğiniz SMTP sunucusunun adresi.
Posta sunucusu adresini $PSEmailServer ortam değişkeninde ayarlarsanız, SMTP sunucu adresi gerekli değildir:
$PSEmailServer = "smtp.a-d.site"Aşağıdaki PowerShell komutu, belirtilen konu ve gövdeye sahip bir e-postayı birden çok alıcıya gönderir.
Send-MailMessage -From 'ps-script@a-d.site' -To 'serveradmin@a-d.site','helpdesk@a-d.site' -Subject "Test Email Alert" -Body "This is email body text" -SmtpServer 'smtp.a-d.site'Bir veya daha fazla alıcı posta kutusuna, Teams kanalına veya Exchange dağıtım grubundaki bir adrese e-posta gönderebilirsiniz.
Bir cmdlet'in özniteliklerini düzenlemeyi kolaylaştırmak için Send-MailMessage komutu aşağıdaki gibi gösterilebilir:
Send-MailMessage `
-SmtpServer smtp.a-d.site `
-To 'serveradmin@a-d.site','helpdesk@a-d.site' `
-From 'ps-script@a-d.site' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'Son komutta ayrıca e-posta için UTF8 kodlamasını ayarladığımızı unutmayın. Aksi takdirde, e-posta konusu veya gövdesi ANSI olmayan karakterler içeriyorsa, bunlar yanlış görüntülenecektir.
Windows PowerShell, varsayılan olarak ANSI ve ASCII kodlamasını kullanır. PS sürümünüzü PowerShell Core olarak güncellediyseniz, bu sürümün zaten varsayılan olarak UTF-8 kodlamasını kullandığını unutmayın.
Parametreleri kullanarak birden çok alıcı belirtebilirsiniz:
To- normal alıcının e-posta adresleri;
Cc- e-posta mesajının karbon kopyasının (CC) gönderileceği e-posta adresleri;
Bcc- e-postanın bir kopyasını alacak ancak mesajın alıcısı olarak listelenmeyecek olan e-posta adresleri.
-DeliveryNotificationOptions'ı kullanarak bir e-posta için teslimat bildirimini etkinleştirebilirsiniz (bu, alıcı bir e-posta aldığında bilgilendirilmenizi sağlar). Mevcut bildirim türleri şunlardır:
OnSuccess (Teslimin başarılı olup olmadığını bildir)
OnFailure (Teslimin başarısız olup olmadığını bildir)
Gecikme (Teslimat gecikirse bildir)
Tek bir komutta birden çok seçenek belirleyebilirsiniz:
Send-MailMessage … -DeliveryNotificationsOptions 'OnSuccess', 'OnFailure'Gönderme bildirimi “Kimden” alanında belirtilen posta kutusuna gönderilecektir.
E-posta mesajının önceliğini de ayarlayabilirsiniz (bazı istemcilerde gösterilmez):
-Priority High|Low|NormalE-postanıza bir ek eklemek istiyorsanız, -Ekler seçeneğini kullanın. Aşağıdaki örnekte HTML formatında (-BodyAsHtml) bir e-posta göndereceğiz ve file1.txt ve report.xsls 'i ekleyeceğiz. yerel sürücüden.
$MailMessage = @{
To = "admin@a-d.site"
Bcc = "manager@a-d.site", "manager2@a-d.site"
From = "DC server <dc01@a-d.site>"
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:\Logs\file1.txt”, “C:\Logs\report.xlsx”
}
Send-MailMessage @MailMessage -Credential $credBu örnekte, alıcının görünen adını da "DC sunucusu" ile değiştirdik.
Ekleri olan HTML e-postası Gmail arayüzünde şu şekilde görünür.
Size Farklı Gönder izinlerinin verildiği bir Exchange/Microsoft 365 paylaşılan posta kutusu adına bir e-posta gönderdiğinizde, iletinin bir kopyasının Gönderilmiş Öğeler klasörüne kaydedilmesi gerektiğini belirtebilirsiniz. kaynak posta kutusu. Bunun için posta kutusu için MessageCopyForSentAsEnabled parametresini etkinleştirin:
Set-Mailbox it_dept -MessageCopyForSentAsEnabled $TrueSend-MailMessage'ı SMTP Kimlik Doğrulaması ve TLS/SSL ile Kullanma
Varsayılan olarak, Send-MailMessage cmdlet'i varsayılan şifrelenmemiş SMTP bağlantı noktası TCP 25 aracılığıyla bir e-posta gönderir. SMTP sunucunuz yalnızca şifreli bir protokol kullanarak e-posta gönderilmesine izin veriyorsa, bağlantı noktası numarasını -Port'ta belirtebilirsiniz. özelliği (çoğunlukla 465 veya 587'dir) ve -UseSsl seçeneği:
-SmtpServer 'smtp.a-d.site' -Port 465 -UseSslSMTP sunucusunun SSL sertifikası HELO'da belirtilen FQDN ile eşleşmezse bir hata oluşur:
Send-MailMessage: The remote certificate is invalid according to the validation procedure.SSL/TLS şifrelemesi kullanarak bir e-posta gönderirken de hata alabilirsiniz:
Send-MailMessage : Unable to read data from the transport connection: net_io_connectionclosedBu durumda, aşağıdakileri kontrol etmeniz önerilir.
Belirtilen SMTP bağlantı noktasının açık ve bilgisayarınızdan erişilebilir olması:
Test-NetConnection smtp.a-d.site -Port 465Farklı bir SMTP bağlantı noktası deneyin. Örneğin, 465 (smtps) yerine 587 (msa). STARTTLS uzantısı kullanılırken 587 numaralı bağlantı noktası varsayılandır;
Daha eski bir işletim sistemi kullanıyorsanız (Windows Server 2012/Windows 8 ve altı), aşağıdaki komutu kullanarak PowerShell için TLS 1.2 protokol desteğini etkinleştirmelisiniz:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Aşağıdaki tablo, PowerShell'den mesaj göndermek için kullanabileceğiniz popüler genel e-posta sağlayıcıları için SMTP sunucusu ayarlarını listeler (hesap arayüzünde e-postanın SMTP yoluyla gönderilmesine izin vermeniz gerektiğini unutmayın.):
| Name | SMTP Server Address | Port | Encryption Type |
| 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 mail | smtp.mail.me.com | 587 | TLS |
| AOL | smtp.aol.com | 465 | SSL |
SMTP sunucusu anonim e-postaya izin vermiyorsa (geçiş reddedildi), şu hatayı görürsünüz:
5.7.1 Client was not authenticated.veya :
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.Ardından, -Credential seçeneğini kullanarak SMTP sunucusunda kimlik doğrulaması yapabilirsiniz.
Kimlik doğrulama için kullanıcının kimlik bilgilerini etkileşimli olarak sorabilirsiniz:
Send-MailMessage …… -Credential (Get-Credential)Kimlik doğrulama için kullanılacak hesap kimlik bilgilerini de değişkende belirleyebilirsiniz:
$cred = Get-Credential
Send-MailMessage ... -Credential $credPowerShell ile Gmail SMTP Üzerinden E-posta Nasıl Gönderilir?
Genel posta hizmetlerinden birindeki posta kutunuzdan e-posta göndermek için, hesabınıza/posta kutunuza erişmek üzere parola yerine Uygulama Parolası kullanmanız önerilir. Örneğin Gmail'de, Google Hesabınız için iki faktörlü kimlik doğrulamayı etkinleştirdikten sonra bir uygulama şifresi oluşturabilirsiniz. Google'da uygulama şifrenizi oluşturun ve kopyalayın (bu, 16 karakterlik bir şifredir).
Aşağıdaki örnek, PowerShell kullanarak Google posta kutunuzdan nasıl e-posta göndereceğinizi gösterir. Google hesabınızın şifresi yerine Uygulama Şifresini kullanmalısınız. Bu örnekte, doğrudan PowerShell betik kodunda Gmail SMTP sunucusuna bağlanmak için uygulama şifresini belirteceğiz.
$From = "sender@gmail.com"
$To = "recipient@gmail.com"
$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 $CredentialPowerShell'in komutu düz metin parolasıyla PowerShell komut geçmişi dosyasına kaydettiğini unutmayın. PowerShell betiklerinde parolaların nasıl kullanılacağı ve korunacağı hakkındaki makaleyi okuyun.
PowerShell Core 7.x'in yeni sürümlerinde Send-MailMessage komutunu kullandığınızda bir uyarı görüntülenir:
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'i, Microsoft Modern Kimlik Doğrulama da dahil olmak üzere modern kimlik doğrulama yöntemlerini desteklemeyen .NET SmtpClient sınıfını kullanır. Microsoft 365/Exchange Online aracılığıyla PowerShell'den e-posta göndermek için Grafik API'sini kullanmanız önerilir (kullanarak
Send-MgUserMailcmdlet veya
Invoke-RestMethodREST API aracılığıyla sendMail yöntemini çağırmak için).




