この記事では、Microsoft Graph メール API を使用して Microsoft Graph を使用して Python アプリをビルド するで作成したアプリケーションを拡張します。 Microsoft Graph を使用して、ユーザーの受信トレイを一覧表示し、メールを送信します。
ユーザーの受信トレイを一覧表示する
まず、ユーザーのメール 受信トレイにメッセージを一覧表示します。
次の関数を graph.py に追加します。
async def get_inbox(self): query_params = MessagesRequestBuilder.MessagesRequestBuilderGetQueryParameters( # Only request specific properties select=['from', 'isRead', 'receivedDateTime', 'subject'], # Get at most 25 results top=25, # Sort by received time, newest first orderby=['receivedDateTime DESC'] ) request_config = MessagesRequestBuilder.MessagesRequestBuilderGetRequestConfiguration( query_parameters= query_params ) messages = await self.user_client.me.mail_folders.by_mail_folder_id('inbox').messages.get( request_configuration=request_config) return messages
メイン.pyの空の
list_inbox
関数を次のように置き換えます。async def list_inbox(graph: Graph): message_page = await graph.get_inbox() if message_page and message_page.value: # Output each message's details for message in message_page.value: print('Message:', message.subject) if ( message.from_ and message.from_.email_address ): print(' From:', message.from_.email_address.name or 'NONE') else: print(' From: NONE') print(' Status:', 'Read' if message.is_read else 'Unread') print(' Received:', message.received_date_time) # If @odata.nextLink is present more_available = message_page.odata_next_link is not None print('\nMore messages available?', more_available, '\n')
アプリを実行し、サインインし、オプション 2 を選択して受信トレイを一覧表示します。
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 2 Message: Updates from Ask HR and other communities From: Contoso Demo on Yammer Status: Read Received: 2022-04-26T19:19:05Z Message: Employee Initiative Thoughts From: Patti Fernandez Status: Read Received: 2022-04-25T19:43:57Z Message: Voice Mail (11 seconds) From: Alex Wilber Status: Unread Received: 2022-04-22T19:43:23Z Message: Our Spring Blog Update From: Alex Wilber Status: Unread Received: 2022-04-19T22:19:02Z Message: Atlanta Flight Reservation From: Alex Wilber Status: Unread Received: 2022-04-19T15:15:56Z Message: Atlanta Trip Itinerary - down time From: Alex Wilber Status: Unread Received: 2022-04-18T14:24:16Z ... More messages available? True
get_inbox説明
get_inbox
関数のコードについて考えてみましょう。
既知のメール フォルダーへのアクセス
関数は、 List messages API への要求を作成します。
mail_folders.by_mail_folder_id('inbox')
要求ビルダーが含まれているため、API は要求されたメール フォルダー内のメッセージのみを返します。 この場合、受信トレイはユーザーのメールボックス内の既定の既知のフォルダーであるため、既知の名前を使用してアクセスできます。 既定以外のフォルダーには、既知の名前をメール フォルダーの ID プロパティに置き換えることで、同じ方法でアクセスされます。 使用可能な既知のフォルダー名の詳細については、「 mailFolder リソースの種類」を参照してください。
コレクションへのアクセス
1 つのオブジェクトを返す前のセクションの get_user
関数とは異なり、このメソッドはメッセージのコレクションを返します。 コレクションを返す Microsoft Graph のほとんどの API では、使用可能なすべての結果が 1 つの応答で返されるわけではありません。 代わりに、 ページングを 使用して結果の一部を返しながら、クライアントが次のページを要求するメソッドを提供します。
既定のページ サイズ
ページングを使用する API では、既定のページ サイズが実装されます。 メッセージの場合、既定値は 10 です。 クライアントは、 $top クエリ パラメーターを使用して、より多く (またはそれ以下) を要求できます。
get_inbox
では、MessagesRequestBuilderGetQueryParameters
オブジェクトの top
パラメーターを使用して$top
を追加します。
注:
$top
で渡される値は、明示的な数値ではなく、上限です。 API は、指定した値までのメッセージ数 を 返します。
後続のページを取得する
サーバーで使用可能な結果が増える場合、コレクション応答には、次のページにアクセスするための API URL を含む @odata.nextLink
プロパティが含まれます。 Python SDK は、コレクション ページ オブジェクトに odata_next_link
プロパティを提供します。 このプロパティが存在する場合は、使用可能な結果が増えます。
コレクションを並べ替える
関数は 、$orderby クエリ パラメーター を使用して、メッセージの受信時刻 (receivedDateTime
プロパティ) で並べ替えられた結果を要求します。 最近受信したメッセージが最初に一覧表示されるように、DESC
キーワード (keyword)が含まれます。
get_inbox
では、MessagesRequestBuilderGetQueryParameters
オブジェクトの orderby
パラメーターを使用して$orderby
を追加します。
メールを送信する
次に、認証されたユーザーとして電子メール メッセージを送信する機能を追加します。
次の関数を graph.py に追加します。
async def send_mail(self, subject: str, body: str, recipient: str): message = Message() message.subject = subject message.body = ItemBody() message.body.content_type = BodyType.Text message.body.content = body to_recipient = Recipient() to_recipient.email_address = EmailAddress() to_recipient.email_address.address = recipient message.to_recipients = [] message.to_recipients.append(to_recipient) request_body = SendMailPostRequestBody() request_body.message = message await self.user_client.me.send_mail.post(body=request_body)
メイン.pyの空の
send_mail
関数を次のように置き換えます。async def send_mail(graph: Graph): # Send mail to the signed-in user # Get the user for their email address user = await graph.get_user() if user: user_email = user.mail or user.user_principal_name await graph.send_mail('Testing Microsoft Graph', 'Hello world!', user_email or '') print('Mail sent.\n')
アプリを実行し、サインインし、オプション 3 を選択して自分にメールを送信します。
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 3 Mail sent.
注:
Microsoft 365 開発者プログラムの開発者テナントでテストしている場合は、送信したメールが配信されず、配信不能レポートが届く場合があります。 テナントからのメール送信のブロックを解除する場合は、Microsoft 365 管理センターからサポートにお問い合わせください。
メッセージが受信されたことを確認するには、オプション 2 を選択して受信トレイを一覧表示します。
send_mail説明
send_mail
関数のコードについて考えてみましょう。
メールの送信
関数は、メール送信 API への要求をビルドするuser_client.me.send_mail
要求ビルダーを使用します。
オブジェクトの作成
データのみを読み取る Microsoft Graph の以前の呼び出しとは異なり、この呼び出しではデータが作成されます。 クライアント ライブラリを使用して項目を作成するには、要求ペイロードを表すディクショナリを作成し、目的のプロパティを設定してから、API 呼び出しで送信します。 呼び出しはデータを送信しているため、get
の代わりに post
メソッドが使用されます。