שליחת הודעות דואר אלקטרוני באמצעות Microsoft Graph API ו- PowerShell


כדי לשלוח דואר אלקטרוני דרך שרת SMTP מקבצי script של PowerShell, באפשרותך להשתמש ב- cmdlet המוכלל של Send-MailMessage. החיסרון העיקרי שלו הוא שהוא יכול להשתמש רק באימות SMTP בסיסי ואינו תומך בשיטות אימות מודרניות, כולל OAuth ואימות מודרני של Microsoft. בעת הפעלת

Send-MailMessage

בגירסאות חדשות של PowerShell Core 7.x, תקבל את האזהרה הבאה:

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.

כברירת מחדל, Microsoft הופכת אימות בסיסי ללא זמין עבור כל דיירי Azure החדשים. ברשומה זו, נבחן כיצד לשלוח דואר אלקטרוני מדייר Exchange Online/Microsoft 365 שלך באמצעות ה- API של Microsoft Graph ו- PowerShell.

קביעת תצורה של הרשאות לשליחת דואר אלקטרוני באמצעות Microsoft Graph API

לפני שתוכל לקבל אסימון Azure ולבצע אימות מקובץ ה- Script של PowerShell, עליך ליצור יישום חדש בדייר Entra ID (Azure Active Directory -> רישום App -> רישום חדש). אז מענק

Mail.Send

הרשאה ליישום (הרשאות API -> הוסף הרשאה -> Microsoft Graph -> הרשאות יישום -> Mail.Send).

למד כיצד לרשום אפליקציית Azure עבור Microsoft Graph ברשומה 'התחברות ל- API של Microsoft Graph באמצעות PowerShell'.

כברירת מחדל, היישום שלך יכול לשלוח דואר אלקטרוני בשם כל תיבת דואר בדייר Exchange Online. באפשרותך להשתמש במדיניות הגישה ליישומים כדי להגביל את רשימת כתובות הדואר האלקטרוני שהיישום שלך יכול לשלוח הודעות דואר אלקטרוני בשם.

התחברות ל- Exchange Online באמצעות PowerShell (

Connect-ExchangeOnline

), צור קבוצת תפוצה של Exchange והוסף את החשבונות שמהם ברצונך לשלוח דואר אלקטרוני:

New-DistributionGroup -Name "azappSendasAllowed" -Type "Security" -Members @("[email ")

באפשרותך גם להסתיר את הקבוצה מרשימת הכתובות הכללית של Exchange (GAL) אם תרצה:

Set-DistributionGroup -Identity azappSendasAllowed -HiddenFromAddressListsEnabled $true

כעת צור מדיניות ואגד אותה ל- Azure AppID שלך:

New-ApplicationAccessPolicy -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -PolicyScopeGroupId azappSendasAllowed -AccessRight RestrictAccess -Description "Resrtict SendAs Policy"

כעת תוכל לבדוק אילו כתובות האפליקציה שלך רשאית לשלוח דוא"ל בשם:

Test-ApplicationAccessPolicy -Identity [email  -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Test-ApplicationAccessPolicy -Identity [email  -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

בהתאם למצב הגישה, הפקודה לעיל תחזיר נדחה או הוענק.

שליחת דואר אלקטרוני באמצעות Exchange Online באמצעות Invoke-RestMethod

באפשרותך להשתמש בפעולת השירות sendMail REST API כדי לשלוח דואר אלקטרוני באמצעות Exchange Online/Microsoft 365. כדי לקרוא לשיטה, השתמש ב- cmdlet המוכלל Invoke-RestMethod PowerShell.

כדי לשלוח דואר אלקטרוני באמצעות Microsoft Graph API, עליך לבצע אימות באמצעות מזהה Entra (Azure) ולקבל אסימון.

$AccessSecret= "3333333333333333333333333333333333333333333"
$AzureAppID = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$tenantID="1234567-1234-1234-1234-123456789012"

כעת התחברו ל-Graph API ובצעו אימות:

$tokenBody = @{
   Grant_Type    = "client_credentials"
   Scope         = "https://graph.microsoft.com/.default"
   Client_Id     = $AzureAppID
   Client_Secret = $AccessSecret
}
$tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token" -Method POST -Body $tokenBody
$headers = @{
   "Authorization" = "Bearer $($tokenResponse.access_token)"
   "Content-type" = "application/json"
}

כעת אתה מוכן לשלוח דוא"ל:

$MailFrom = "[email "
$MailTo = "[email "
$URLsend = "https://graph.microsoft.com/v1.0/users/$MailFrom/sendMail"
$BodyJsonsend = @"
{
   "message": {
   "subject": "Test email from Microsoft Graph API",
   "body": {
      "contentType": "HTML",
      "content": "This email is sent via <br>
      Microsoft GRAPH API<br>"
   },
   "toRecipients": [
      {
      "emailAddress": {
      "address": "$mailto"
          }
      }
   ]
   },
   "saveToSentItems": "true"
}
"@
Invoke-RestMethod -Method POST -Uri $URLsend -Headers $headers -Body $BodyJsonsend

ודא שהדואר האלקטרוני הועבר בהצלחה לתיבת הדואר של Exchange של המשתמש.

שימוש ב- cmdlet Send-MgUserMail ממודול Microsoft.Graph

שימוש ב- cmdlet Invoke-RestMethod כדי לשלוח דואר אלקטרוני פירושו שעליך ליצור את אובייקט הדואר האלקטרוני כולו בתבנית JSON. כדי להקל על התהליך, באפשרותך לנסות להשתמש ב- cmdlet Send-MgUserMail ממודול Microsoft.Graph במקום זאת.

התקן את מודול Microsoft.Graph וייבא אותו להפעלת PowerShell:

Install-Module Microsoft.Graph
Import-Module Microsoft.Graph

אנו נשתמש באישור כדי לבצע אימות בדייר Microsoft 365 (Exchange Online):

$certThumbprint = "9CF05589A4B29BECEE6456F08A76EBC3DC2BC581"
$AzureAppID = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$tenant="a-d.onmicrosoft.com"
Connect-MgGraph -TenantId $Tenant -ClientId $AzureAppID -CertificateThumbprint $certThumbprint

לאחר מכן, אנו יוצרים דוא"ל פשוט עם גוף HTML וקובץ מצורף:

$MailFrom = "[email "
$MailTo = "[email "
$msgBody = “This is <br> test <br> Graph API mailer <br>”
$Attachment = "C:\logs\mytestapp.log"
$AttachmentContentBytes = [System.IO.File]::ReadAllBytes($Attachment)
$AttachmentBase64 = [System.Convert]::ToBase64String($AttachmentContentBytes)
$Message = @{
   Subject = "Hello World from GraphAPI"
   Body = @{
      ContentType = "HTML"
      Content = $msgBody
      }
   ToRecipients = @(
      @{
         EmailAddress = @{
         Address = $MailTo
         }
       }
    )
    Attachments = @(
   @{
      "@odata.type" = "#microsoft.graph.fileAttachment"
      Name = (Split-Path $Attachment -Leaf)
      ContentType = "application/octet-stream"
      ContentBytes = $AttachmentBase64
     }
  )
}

באפשרותך להשתמש בפקודה זו כדי לשלוח הודעת דואר אלקטרוני:

Send-MgUserMail -UserId $MailFrom -Message $Message

ניתן להשתמש ב- cmdlet Send-MgUserMail רק כדי לשלוח הודעות דואר אלקטרוני באמצעות Exchange Online. משמעות הדבר היא שהוא לא יפעל עם Exchange Server מקומי או ספקי דואר אלקטרוני/SMTP אחרים.