E-posta Göndermenin Dört Yolu PowerShell ve Microsoft Graph
Microsoft, Ham API'ler ve İki SDK Yöntemi Sunuyor
SMTP AUTH, temel kimlik doğrulamayı destekleyen bir Exchange Online bağlantı protokolü olarak kalır. Microsoft, emekliliğin son aşamalarında olduğu için onu protokol kümesinden çıkarmak zorunda kaldı. Çok fazla kuruluşta, Microsoft'un SMTP AUTH'un fişini çekmesi için Exchange Online aracılığıyla e-posta gönderen çok fazla cihaz ve uygulama var. Ancak bunun gerçekleşeceğine şüphe yok. Tek soru ne zaman olacağıdır.
Bunun yerine e-posta oluşturmak ve göndermek için Microsoft Graph API'lerini kullanmak gerekir. Geçtiğimiz yıl boyunca mevcut yöntemleri araştırıyordum. Microsoft aşağıdaki Grafik tabanlı seçenekleri sunar:
- Grafik sendMail API'si.
- Microsoft Graph PowerShell SDK'sındaki Send-MgUserMessage cmdlet'i.
- Microsoft Graph PowerShell SDK'sındaki Send-MgUserMail cmdlet'i.
Microsoft Graph PowerShell SDK'sı neden aynı işi yapmak için iki yöntem içeriyor? Bunun bir yanıtı, Microsoft'un AutoRest işlemini kullanarak otomatik olarak SDK cmdlet'leri oluşturma biçiminde yatmaktadır. Bir API mevcutsa SDK bir cmdlet alır. Grafik, message: send API ve user: sendMail API'sini içerdiğinden, SDK, her ikisi de Exchange Online aracılığıyla e-posta gönderen iki cmdlet'te yer alır. Ancak daha da önemlisi her cmdlet farklı bir amaca hizmet eder. Yakında buna ulaşacağız.
Bağımsız Send-EmailMessage cmdlet'i
Microsoft'un cmdlet'lerinden hoşlanmıyorsanız, saygın PSWriteHTML PowerShell modülünün geliştiricisi Przemyslaw Klys, Send-EmailMessage cmdlet'inde konuyla ilgili kendi görüşünü sunuyor. Bu cmdlet muhteşem bir isme sahip Mailozaurr modülündedir.
Microsoft Graph PowerShell SDK cmdlet'lerinden farklı olarak Przemyslaw'ın çalışması, mesaj oluşturmayı ve göndermeyi mümkün olduğunca kolaylaştırmak için bazı iyi düşünülmüş programlamanın ayırt edici özelliklerini sergiliyor. Örneğin, Microsoft'un cmdlet'leri büyük ekler (3 MB'ın üzerindeki herhangi bir şey) için özel işlem gerektirir ve bu da gerçek bir engel olabilir (MVP Glen Scales tarafından yazılan bu makaleye bakın). Send-EmailMessage cmdlet'i büyük ekleri otomatik olarak yönetir; bu da tam olarak Microsoft'un cmdlet'lerinin yapması gereken yoldur.
İnsanların Microsoft'un API'lerini kullanmasının nedeni, bunların Microsoft'un API'leri olmasıdır. Daha iyi bağımsız bir alternatif mevcut olsa da kuruluşlar, resmi olarak desteklenmeyen bir modüle dayalı kod yazmaktan hoşlanmayabilir. Elbette şirket içi geliştiriciler Przemyslaw'ın yaptığının aynısını yapabilir ve Graph API'leri etrafında daha iyi bir sarmalayıcı oluşturabilir, ancak bunu yapmak için acele eden pek fazla kişi göremiyorum. Her durumda Mailozaurr modülüne bir göz atın ve kendi kararınızı verin.
İki SDK Cmdlet'i Arasında Karar Verme
İki SDK cmdlet'i arasındaki seçim göz önüne alındığında hangisini kullanmalısınız? Daha önce Send-MgUserMessage cmdlet'ini kullanarak e-postaların nasıl gönderileceğini anlatmıştım. Send-MgUserMail cmdlet'inin kullanımı daha kolaydır çünkü önce bir taslak mesaj oluşturmak (New-MgUserMessage ile) ve ardından tek bir komutla mesaj oluşturup gönderebilirsiniz. gönderiyorum.
Tek hareketle oluşturma ve gönderme, muhtemelen uygulamaların e-posta göndermesi gereken çoğu senaryo için Send-MgUserMail'i iyi bir seçim haline getirir. Genellikle bu mesajlar, bir işin bitirilmesi veya kontrol edilmesi gereken bir şey (yüksek izinli Azure AD uygulamaları gibi) gibi bazı bilgiler hakkında birinin bilgilendirilmesine yönelik bir bildirime benzer.
Send-MgUserMessage'in bazı püf noktaları var. Önceden oluşturulmuş bir mesaj gönderdiği için yanıtlar ve mesaj iletme gibi senaryoları işleyebilir. Ancak taslak mesajları işlemek veya gelen postalara yanıt vermek için nispeten az sayıda uygulamanın gerekli olduğunu düşünüyorum; bu özellik göründüğü kadar kullanışlı olmayabilir.
Send-MgUserMail'i test etme
Send-MgUserMail cmdlet'ini kullanmanın ne kadar kolay olduğunu test etmek için Send-MgUserMessage ile kullandığım örnek komut dosyasını dönüştürdüm. Bu komut dosyası yeni çalışanlara bir hoş geldiniz mesajı gönderir. Geçen hafta oluşturulan posta kutularını bulmak için Get-ExoMailbox cmdlet'ini kullanır. Bu mantıklı çünkü bir hoş geldiniz mesajı göndereceksek bunun bir posta kutusuna gitmesi gerekiyor. Exchange Online yönetim modülünü yüklemek istemiyorsanız aşağıdakilere benzer bir şey yapılabilir:
$CheckDate = (Get-Date).AddDays(-7)
[array]$Users = Get-MgUser -All -Filter "userType eq 'Member'"
$Users = $Users | Where-Object {$_.CreatedDateTime -gt $CheckDate}
Bu komut gayet iyi çalışıyor ancak performansı daha büyük kiracılarda parlak olmayacak. Get-MgUser cmdlet'i bir hesabın oluşturulma tarihine göre filtrelemeyi desteklemez; bu nedenle, yakın zamanda oluşturulan hesaplar kümesini bulmak için tüm hesapları getirmeli ve ardından istemci tarafında bir filtre uygulamalıyız. Karşılaştırıldığında, Get-ExoMailbox cmdlet'i sunucu tarafı filtresini memnuniyetle kullanabilir; bu, Exchange Online'ın yalnızca hedef posta kutuları kümesini döndürdüğü anlamına gelir.
[array]$Users = (Get-ExoMailbox -Filter "WhenMailboxCreated -gt '$CheckDate'" -RecipientTypeDetails UserMailbox -ResultSize Unlimited -Properties WhenMailboxCreated | Select WhenMailboxCreated, DisplayName, UserPrincipalName, PrimarySmtpAddress)Send-MgUserMessage hakkında yazdığımda, cmdlet'in mesajı alıcılara iletmek için diziler kullandığını fark ettim ve SDK geliştiricilerinin mesaj özelliklerini oluşturmanın bu kısmını kolaylaştırarak hepimize bir iyilik yapabileceklerini söyledim. . Bir PowerShell işlevi bu işi yapar ve Kime, Cc ve Bcc alıcılarını işleyebilir.
Function Populate-MessageRecipient { # Build a list of recipients for a message
[cmdletbinding()]
Param(
[array]$ListOfAddresses )
ForEach ($SMTPAddress in $ListOfAddresses) {
@{
emailAddress = @{address = $SMTPAddress}
}
}
}
Alıcıları eklemek için, her alıcının SMTP adresini tutan bir dizi oluştururuz ve bunu mesaj özelliklerine eklenecek diziyi oluşturmak için fonksiyona koyarız. Örneğin, bu kod iki alıcıyı (bir dağıtım grubu ve bir posta kutusu) Bilgi alıcıları olarak ekler.
$CcRecipientList = @(
'Tenant.Admins@office365itpros.com'
'Kim.Akers@Office365itpros.com' )
[array]$MsgCcRecipients = Populate-MessageRecipient -ListOfAddresses $CcRecipientList
Senaryonun geri kalanı:
- Base64'te kodlanmış bir ek hazırlar.
- Alıcı için mesaj içeriğini özelleştirir ve bir HTML mesaj gövdesi oluşturur.
- İleti özellikleri kümesini (konu, Alıcılara, Bilgi alıcıları, ek ve ileti gövdesi) doldurur.
- İki mesaj parametresini doldurur (mesajı gönderilen öğelere kaydedin ve teslimat makbuzunu isteyin).
- Mesajı Send-MgUserMail ile gönderir.
İşte kod (betiğin tamamı GitHub'da mevcuttur):
$MsgAttachment = @(
@{
"@odata.type" = "#microsoft.graph.fileAttachment"
Name = ($AttachmentFile -split '\\')[-1]
ContentType = "text/plain"
ContentBytes = $EncodedAttachmentFile
}
)
ForEach ($User in $Users) {
$ToRecipientList = @( $User.PrimarySmtpAddress )
[array]$MsgToRecipients = Populate-MessageRecipient -ListOfAddresses $ToRecipientList
Write-Host "Sending welcome email to" $User.DisplayName
# Customize the message
$htmlHeaderUser = "<h2>New User " + $User.DisplayName + "</h2>"
$HtmlMsg = "</body></html>" + $HtmlHead + $htmlheaderuser + $htmlbody + "<p>"
# Construct the message body
$MsgBody = @{
Content = "$($HtmlMsg)"
ContentType = 'html' }
$Message = @{subject = $MsgSubject}
$Message += @{toRecipients = $MsgToRecipients}
$Message += @{ccRecipients = $MsgCcRecipients}
$Message += @{attachments = $MsgAttachment}
$Message += @{body = $MsgBody}
$Params = @{'message' = $Message}
$Params += @{'saveToSentItems' = $True}
$Params += @{'isDeliveryReceiptRequested' = $True}
Send-MgUserMail -UserId $MsgFrom -BodyParameter $Params
}
Write-Host "All done. Messages sent!"
Her şey çalışıyor ve yeni çalışanlarımız hoş bir karşılama mesajı alıyor (Şekil 1).
İzinlerle Başa Çıkmak
Send-MgUserMessage ve Send-MgUserMail cmdlet'lerinin her ikisi de Mail.Send Grafiği iznini gerektirir. Göndermek üzere Send-MgUserMessage için taslak mesaj oluşturmak, Mail.ReadWrite iznini gerektirir. Bu izinler kiracıdaki her posta kutusu için geçerlidir. Başka bir deyişle, sertifika tabanlı kimlik doğrulamayı kullanan, bu izinlerle donatılmış bir arka plan uygulaması, her posta kutusuna yazabilir ve her posta kutusundan e-posta gönderebilir. Bu tür bir erişimle, uygulamalarla çalışan veya Azure Otomasyonu runbook'larını (yönetilen kimlikle veya yönetilen kimlik olmadan) kullanan betiklerin posta kutularına erişme yeteneğini kısıtlamaya dikkat edilmelidir.
Bunu yapmanın doğru yolu bir uygulama erişim politikasıdır. Bu politikalar, bir uygulamanın erişebileceği posta kutularını belirler; bu, uygulamaları bazı uygulamaya özel posta kutuları ile sınırlayabileceğiniz ve bunları kullanıcı posta kutularından yeterince uzak tutabileceğiniz anlamına gelir.
Karar Zamanı
Seçenek sahibi olmak güzel. SMTP AUTH bağımlılığını kaldırmak için komut dosyalarını güncelleyen geliştiricilerin en az dört Grafik tabanlı seçeneği vardır. Benim için mümkün olduğunca Send-MgUserMail'i kullanacağımı düşünüyorum, çünkü mesaj göndermenin en kolay yolu bu. En azından Microsoft tabanlı en kolay yöntem. Bağımsız Send-EmailMessage cmdlet'i de çekici bir seçenek gibi görünüyor!
