次の方法で共有


Microsoft Graph を使用して Python アプリに電子メール機能を追加する

この記事では、Microsoft Graph メール API を使用して Microsoft Graph を使用して Python アプリをビルド するで作成したアプリケーションを拡張します。 Microsoft Graph を使用して、ユーザーの受信トレイを一覧表示し、メールを送信します。

ユーザーの受信トレイを一覧表示する

まず、ユーザーのメール 受信トレイにメッセージを一覧表示します。

  1. 次の関数を 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
    
  2. メイン.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')
    
  3. アプリを実行し、サインインし、オプション 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を追加します。

メールを送信する

次に、認証されたユーザーとして電子メール メッセージを送信する機能を追加します。

  1. 次の関数を 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)
    
  2. メイン.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. アプリを実行し、サインインし、オプション 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 管理センターからサポートにお問い合わせください。

  4. メッセージが受信されたことを確認するには、オプション 2 を選択して受信トレイを一覧表示します。

send_mail説明

send_mail関数のコードについて考えてみましょう。

メールの送信

関数は、メール送信 API への要求をビルドするuser_client.me.send_mail要求ビルダーを使用します。

オブジェクトの作成

データのみを読み取る Microsoft Graph の以前の呼び出しとは異なり、この呼び出しではデータが作成されます。 クライアント ライブラリを使用して項目を作成するには、要求ペイロードを表すディクショナリを作成し、目的のプロパティを設定してから、API 呼び出しで送信します。 呼び出しはデータを送信しているため、getの代わりに post メソッドが使用されます。

次の手順