Microsoft Graph PowerShell SDK を使用して Exchange Online からメールを送信する

PowerShell でメールを送信する方法としては Send-MailMessage コマンドがあります。ただし現在このコマンドの利用は推奨されていません。内部で使用する SmtpClient クラスの利用が推奨されない状況となっているためです。1st party の代替コマンドは用意されていないため、SMTP サーバーにメールを送信したい場合は 3rd party のモジュールを利用するか、SMTP でメールを送信する機能を自作する必要があります。

SMTP によるメール送信ではなく、Exchange Online のメールボックスからメールを送信するのであれば Microsoft Graph を使用してメールを送信することができます。Microsoft Graph を PowerShell で使用できるようにするモジュール Microsoft Graph PowerShell SDK でもコマンドが用意されているため、利用方法を紹介します。

なお PowerShell を使用するとはいえ、実際には Microsoft Graph を使用しますので、込み入った実装には Microsoft Graph に関する知識も必要になります。今回は Send-MgUserMail コマンドを使用するので、Microsoft Graph の sendMail の基本的な利用方法や、message リソースの構造などを理解している必要があります。

まずは以下のページを参考にして Connect-MgGraph コマンドで Microsoft Graph に接続します。

Microsoft Graph PowerShell SDK の試し方

ユーザー自身の権限で接続する場合は [ユーザー権限で Microsoft Graph PowerShell SDK を試す] を参考にして、Scopes は Mail.Send を指定します。ユーザー自身の権限を使用するものの、権限を付与されている他人のメールボックスからメールを送信する (代理送信する) 場合は Scopes に Mail.Send.Shared を指定します。代理送信する場合は事前にメールボックス所有者として送信する権限 (SendAs) もしくは代理人として送信する権限 (GrantSendOnBehalfTo) が設定されている必要があります。アプリケーションの権限で接続する場合は [アプリケーション権限で Microsoft Graph PowerShell SDK を試す] を参考にして、Azure ポータルで Microsoft Graph のアプリケーションの許可の Mail.Send のアクセス許可を構成しておきます。

接続ができたら、以下のようにコマンドを実行して送信するメールのオブジェクト (message リソースのオブジェクトと SaveToSentItems プロパティが含まれるもの) を作成します。

$params = @{
	Message = @{
		Subject = "Meet for lunch?"
		Body = @{
			ContentType = "Text"
			Content = "The new cafeteria is open."
		}
		ToRecipients = @(
			@{
				EmailAddress = @{
					Address = "fannyd@contoso.onmicrosoft.com"
				}
			}
		)
		CcRecipients = @(
			@{
				EmailAddress = @{
					Address = "danas@contoso.onmicrosoft.com"
				}
			}
		)
	}
	SaveToSentItems = "true"
}

なお代理送信を行う場合は、以下のように From に差出人を明示的に指定します。

$params = @{
	Message = @{
		From = @{
			EmailAddress = @{
				Address = "user02@contoso.onmicrosoft.com"
			}
		}
		Subject = "Meet for lunch?"
		Body = @{
			ContentType = "Text"
			Content = "The new cafeteria is open."
		}
		ToRecipients = @(
			@{
				EmailAddress = @{
					Address = "fannyd@contoso.onmicrosoft.com"
				}
			}
		)
		CcRecipients = @(
			@{
				EmailAddress = @{
					Address = "danas@contoso.onmicrosoft.com"
				}
			}
		)
	}
	SaveToSentItems = "true"
}

送信するメールのオブジェクトを作成したら以下のようにコマンドを実行することでメールが送信されます。UserId は、Microsoft Graph への接続で認証に使用したユーザーの UPN を指定します。アプリケーションの権限で接続している場合はメールの差出人の UPN を指定します。

Send-MgUserMail -UserId "user01@contoso.onmicrosoft.com" -BodyParameter $params

以上でメールの送信は完了です。

Microsoft Graph で代理送信をする方法については以下の技術情報も公開されています。

Send Outlook messages from another user