�d�q���[���𑗐M����ɂ́H�ioutlook.com�ҁj�m.NET 4.5�AC#�^VB�n�F.NET TIPS

Microsoft Graph�ɓ�������Ă���Outlook���[��REST API���g�p���āA�d�q���[���𑗐M������@���������B

» 2018�N11��28�� 05��00�� ���J
[�R�{�N�F�CBluewaterSoft�^Microsoft MVP for Windows Development]
�u.NET TIPS�v�̃C���f�b�N�X

�A�ځu.NET TIPS�v

�@Microsoft�A�J�E���g������΁Aoutlook.com�Ń��[���̑���M���ł���B����ɂ�Outlook�A�v����Outlook��Web�T�C�g�𗘗p���鑼�ɁARESTful Web API�iREST API�j�ł���uMicrosoft Graph�v���g�����@������BREST API�́A�Ǝ��̃A�v����Web�T�C�g���痘�p�ł���B�G���h���[�U�[��Microsoft�A�J�E���g�������Ă��邱�Ƃ��O��̃f�X�N�g�b�v�A�v����A�g�D��Microsoft�A�J�E���g���g���ă��[���𑗎�M����V�X�e���ȂǂŁA����REST�T�[�r�X�͖��ɗ��‚��낤�B�{�e�ł́AMicrosoft Graph API���g���ă��[���𑗐M������@���������B

�@�Ȃ��AOutlook��Web�T�C�g��outlook.live.com�ł���AMicrosoft Graph API���񋟂���Ă���T�C�g��graph.microsoft.com�ł���B���ۂɃ��[�����M�Ɏg����T�[�o�̃h���C����outlook.com�ł���̂ŁA�{�e�ł́uoutlook.com�Ń��[���̑���M�v�ƕ\�����Ă���B

POINT�@outlook.com���烁�[���𑗐M������@

outlook.com���烁�[���𑗐M������@�܂Ƃ� outlook.com���烁�[���𑗐M������@�܂Ƃ�


�@����̃g�s�b�N�������ɒm�肽���Ƃ������͈ȉ��̃����N�����p���Ăق����BGraph API�̊�b�m�����������̕��́A�O�����΂��āu�e�L�X�g���[����g�ݗ��Ă�ɂ́H�v�ɐi��ł������������B

�@�Ȃ��A�{�e�Ɍf�ڂ����T���v���R�[�h�����̂܂܎����ɂ�Visual Studio 2017�ȍ~���K�v�ł���B�T���v���R�[�h�̓R���\�[���A�v���̈ꕔ�ł���A�R�[�h�̖`���Ɉȉ��̐錾���K�v�ƂȂ�B�܂��AC#�̃T���v���R�[�h�ɂ́AC# 7.1�ȍ~���K�v�ł���B

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using static System.Console;

Imports System.Console
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports Microsoft.Graph
Imports Microsoft.Identity.Client

�{�e�̃T���v���R�[�h�ɕK�v�Ȑ錾�i��FC#�A���FVB�j

Microsoft Graph�Ƃ��̃��C�u����

�@Microsoft Graph API�Ƃ́AMicrosoft�̃N���E�h�T�[�r�X�𗘗p���邽�߂̋���API���ƍl����ƕ�����₷���B��‚��̃T�[�r�X�𗘗p���邽�߂�API���p�ӂ���Ă���B���̊T���́A�uMicrosoft Graph �̊T�v�v�������������������i���̉摜�j�B���Ȃ݂ɁABuild 2015�Ŕ��\���ꂽ�Ƃ��ɂ́A�uOffice Graph API�v�^�uOffice 365 Unified API�v�ȂǂƌĂ΂�Ă����i�u���W�FBuild 2015�F�S�Ă̊J���҂��������Ă����ׂ��}�C�N���\�t�g�̍ŐV�Z�p���� �i2/5�j�v�̃y�[�W�̉����ŏЉ�Ă���j�B

Microsoft Graph API�̎�� Microsoft Graph API�̎��
�uMicrosoft Graph �̊T�v�v���B

�@Microsoft Graph�Œ񋟂���Ă��邳�܂��܂ȃT�[�r�X�̒�����AOutlook�̋@�\�́A����ɂ��̈ꕔ�ł��郁�[�����M��{�e�ł͗��p���Ă݂悤�Ƃ����킯���B

�@Microsoft Graph��REST API�ł��邩��A�A�v���Œ���HTTP���N�G�X�g��g�ݗ��Ă�API�𗘗p���邱�Ƃ��ł���B�Ⴆ�΃��[�����M�Ȃ�u���[���𑗐M���� - �h�L�������g - Microsoft Graph�v�������������������i���̉摜�j�B

���[�����M��HTTP���N�G�X�g�̗� ���[�����M��HTTP���N�G�X�g�̗�
�u���[���𑗐M���� - �h�L�������g - Microsoft Graph�v���B
���ۂɂ́A���̑���Authorization���N�G�X�g�w�b�_���K�v�ł���B�uMicrosoft Graph ���Ăяo�����߂̃g�[�N���̎擾�v���Q�Ƃ̂��ƁB

�@���̂悤��HTTP���N�G�X�g��g�ݗ��āA���M���A�󂯎�������ʂ���͂���R�[�h�������͖̂ʓ|�Ȃ��̂��B�N���C�A���g�A�v������g�����߂̃��C�u�����uMicrosoft Graph .NET Client Library�v�i�ȍ~�A�uGraph Client Library�v�j��Microsoft���烊���[�X����Ă���̂ŁA������g�����B.NET Standard 1.1�ɑΉ����Ă���̂ŁA.NET Framework�����łȂ��AUWP�A�v����Xamarin�Ȃǂ�������p�ł���B

���C�u�����𓱓�����ɂ́H

�@NuGet����Visual Studio�̃v���W�F�N�g�ɓ�������BGraph Client Library�̑��ɁA���[�U�[�F�؂̂��߂̃��C�u�������K�v���B

�@�܂�Graph Client Library�ł��邪�ANuGet�ŁuMicrosoft.Graph�v����������Ό��‚���i���̉摜�j�B

NuGet��Graph Client Library����������iVisual Studio 2017�j NuGet��Graph Client Library����������iVisual Studio 2017�j
Graph Client Library���v���W�F�N�g�ɓ�������ƁA�K�v�ȃp�b�P�[�W����‚������I�ɃC���X�g�[�������i�摜�Ɍ����Ă���m�ˑ��֌W�n���Q�Ɓj�B

�@Graph API�𗘗p���邽�߂̃��[�U�[�F�؂ɂ͊�‚��̕��@������i��q�j�B�����ł́AMicrosoft Authentication Library�iMSAL�j���g�����B�܂��v���r���[�̂܂܂ɂȂ��Ă��邪�A���łɏ\���Ɉ��肵�Ă���BVisual Studio��NuGet�p�b�P�[�W�Ǘ���ʂŁm�v�������[�X���܂߂�n�Ƀ`�F�b�N�����Ă���uMicrosoft.Identity.Client�v����������i���̉摜�j�B

NuGet��MSAL�p�b�P�[�W����������iVisual Studio 2017�j NuGet��MSAL�p�b�P�[�W����������iVisual Studio 2017�j
�m�v�������[�X���܂߂�n�i�Ԋہj�Ƀ`�F�b�N�����Č�������B

�A�v����o�^����ɂ́H

�@�]���̃f�X�N�g�b�v�A�v���Ȃǂ̏ꍇ�́A���炩����Graph API�𗘗p����A�v�����A�v���P�[�V�����o�^�|�[�^���iApplication Registration Portal�j�ɓo�^���A�A�v���P�[�V����ID�i�N���C�A���gID�j���擾����iUWP�A�v���̏ꍇ�́A�X�g�A�ɓo�^���邱�ƂŎ����I�ɓo�^�����j�B�o�^�ɂ́AMicrosoft�A�J�E���g���K�v���B

�@�A�v���P�[�V�����o�^�|�[�^���ɃT�C���C��������A�u�W���^�A�v���P�[�V�����v�iconverged applications���u�����A�v���v�j��lj����āA�A�v���̖��O�Ȃǂ�o�^����B�o�^�菇�̊T�v�����̉摜�Ɏ����̂ŁA�Q�l�ɂ��Ă��炢�����i����UI�͕p�ɂɕύX�����̂ŁA�قȂ��Ă���”\��������j�B����̏ꍇ�A�o�^���e�ŏd�v�Ȃ̂́A�A�v���̖��O�ƃA�N�Z�X���‚��B�A�v���̖��O�́A���̂܂܃��[�U�[�F�؂�UI�ɕ\�������B�A�N�Z�X���‚��������Ȃ��ƁA�A�v�������API�Ăяo�������₳���B�܂��A�A�v���P�[�V����ID�́A��قǃR�[�f�B���O����Ƃ��̃N���C�A���gID�Ƃ��Ďg���̂ŁA�������߂Ă����B

�u�W���^�A�v���P�[�V�����v�́m�A�v���̒lj��n�i�Ԋۓ��j���N���b�N
�u�W���^�A�v���P�[�V�����v�́m�A�v���̒lj��n�i�Ԋۓ��j���N���b�N
��
�A�v�����i�G���h���[�U�[�ɒ񎦂����j����͂��āmCreate�n�i�쐬�j�{�^�����N���b�N
�A�v�����i�G���h���[�U�[�ɒ񎦂����j����͂��āmCreate�n�i�쐬�j�{�^�����N���b�N
��
�o�^����ʂɐ؂�ւ�����i�ȍ~�̉摜�́A������ʂ̒��̕ʂ̉ӏ��ł���j�B�A�v���P�[�V����ID�i�Ԙg���j���R�s�y���Ă����B�m�v���b�g�t�H�[���̒lj��n�i�Ԋۓ��j���N���b�N
�o�^����ʂɐ؂�ւ�����i�ȍ~�̉摜�́A������ʂ̒��̕ʂ̉ӏ��ł���j�B
�A�v���P�[�V����ID�i�Ԙg���j���R�s�y���Ă����B
�m�v���b�g�t�H�[���̒lj��n�i�Ԋۓ��j���N���b�N
��
�R���\�[���A�v������g���ꍇ�́A�m�v���b�g�t�H�[���̒lj��n�_�C�A���O�Łm�l�C�e�B�u �A�v���P�[�V�����n��I��
�R���\�[���A�v������g���ꍇ�́A
�m�v���b�g�t�H�[���̒lj��n�_�C�A���O�Łm�l�C�e�B�u �A�v���P�[�V�����n��I��
��
�u�ϔC���ꂽ�A�N�Z�X���v�ɂ͊���ŁmUser.Read�n���\������Ă���B���[�����M������ɂ́A�m�lj��n�{�^���i�Ԋۓ��j���g���āmMail.Send�n��lj�����B�lj���́A�mMail.Send�n�ƁmUser.Read�n�ɂȂ�i�Ԙg���j�B�Ō�ɁA��ʍʼn����ɂ���m�ۑ��n�{�^���œo�^������������B
�u�ϔC���ꂽ�A�N�Z�X���v�ɂ͊���ŁmUser.Read�n���\������Ă���B
���[�����M������ɂ́A�m�lj��n�{�^���i�Ԋۓ��j���g���āmMail.Send�n��lj�����B
�lj���́A�mMail.Send�n�ƁmUser.Read�n�ɂȂ�i�Ԙg���j�B
�Ō�ɁA��ʍʼn����ɂ���m�ۑ��n�{�^���œo�^������������B

�A�v����o�^����菇�̊T�v
�A�N�Z�X���‚�2��ނ��邪�A�G���h���[�U�[��Microsoft�A�J�E���g�ŃT�C���C�����Ă�����āi���G���h���[�U�[�Ɍ������ϔC���Ă�����āj�A�v�����A�N�Z�X����ꍇ�́u�ϔC���ꂽ�A�N�Z�X���v��I�ԁB


���[�U�[�F�؂�����ɂ́H

�@�قƂ�ǂ�Graph API�́A�Ăяo���Ƃ��ɃA�N�Z�X�g�[�N�����K�v�ł���BAzure AD�ŔF�؂��󂯂�ƁA�A�N�Z�X�g�[�N���𓾂���B�ȉ��Ɏ����悤�ɁA���̔F�؂ɂ�2�ʂ�̕��@������B

  • �G���h���[�U�[�Ȃ��ŔF�؂���F�G���h���[�U�[�Ƃ͊֌W�Ȃ��A�J�E���g��Graph API���g���ꍇ�B�Ⴆ�΁A���[���Ɏ�����������V�X�e���Ȃǂŗ��p������@�B�ڂ����́u���[�U�[�Ȃ��ŃA�N�Z�X���擾�v���Q��
  • �G���h���[�U�[���F�؂��s���F�G���h���[�U�[�̃A�J�E���g��Graph API���g���ꍇ�B�A�v���P�[�V�����o�^�|�[�^���ł́u�ϔC���ꂽ�A�N�Z�X���v�ƕ\������Ă���B�قƂ�ǂ̃N���C�A���g�A�v���͂�����ɂȂ�B�F�؃_�C�A���O�iWeb�y�[�W�܂��̓A�v���g�ݍ��݁j���|�b�v�A�b�v����

�@�G���h���[�U�[���F�؂��s���ꍇ�A���̃A�J�E���g����ʓI��Microsoft�A�J�E���g���A����Ƃ��A�E��܂��͊w�Z�A�J�E���g�iAzure AD�̃A�J�E���g�j�Ȃ̂��ɂ���āA�ȉ��̂悤�ɗ��p�ł���F�ؕ��@���قȂ�B

  • Azure AD (v1)�F�E��܂��͊w�Z�A�J�E���g�̂�
  • Azure AD v2.0�FMicrosoft�A�J�E���g�^�E��܂��͊w�Z�A�J�E���g

�@�����Microsoft�A�J�E���g���g�������̂ŁAAzure AD v2.0��I�ԁB����REST API�����b�v�������C�u�������A�u���C�u�����𓱓�����ɂ́H�v�ŃC���X�g�[������Microsoft Authentication Library�iMSAL�j�ł���B

�@�b�������Ȃ������A�����܂ł�Graph API�̊�b�m���ł���B�悤�₭�R�[�f�B���O�Ɏ��|���鏀�����ł����B

�@���āAMSAL���g���ă��[�U�[�F�؂��󂯂�R���\�[���A�v���͎��̃R�[�h�̂悤�ɂȂ�B�ꕔ�A�u*�v�����ŕ������ɂ��Ă��邪�A���ۂɂ͓K�؂ȕ������ݒ肵�Ăق����i�ȉ������j�B

class Program
{
  // ClientID�ɂ́A�A�v����o�^�����Ƃ��̃A�v���P�[�V����ID��ݒ肷��
  const string ClientID = "********-****-****-****-************";
  private static readonly string RedirectUri = $"msal{ClientID}://auth";

  // ���[�U�[�F�؊֌W�̃v���p�e�B�i��قǁA�ʂ̃N���X������A�N�Z�X����j
  public static PublicClientApplication PCA { get; }
    = new PublicClientApplication(ClientID) { RedirectUri = RedirectUri, };
  public static IReadOnlyList<string> Scopes { get; } 
    = new List<string> { "User.Read", "Mail.Send", }.AsReadOnly();

  // �uasync Task Main�v�Ə�����̂�C# 7.1�ȍ~
  static async Task Main(string[] args)
  {
    AuthenticationResult ar = null; // �F�،��ʁi�A�N�Z�X�g�[�N���Ȃǂ�����j
    try
    {
      // �܂��T�C�����g�T�C���C��������
      try
      {
        IAccount signedInUser
          = (await Program.PCA.GetAccountsAsync()).FirstOrDefault();
        if(signedInUser != null)
          ar = await PCA.AcquireTokenSilentAsync(Scopes, signedInUser);
          // �T�C�����g�T�C���C���Ɏ��s�����MsalUiRequiredException���o��
      }
      catch { }

      // �T�C�����g�T�C���C�����ł��Ȃ�������A�T�C���C����UI���o��
      if (ar == null)
        ar = await PCA.AcquireTokenAsync(Scopes);

      WriteLine("�T�C���C�����܂����B");
      WriteLine($"AccessToken={ar.AccessToken}");
      WriteLine($"Username={ar.Account.Username}");
      WriteLine($"ExpiresOn={ar.ExpiresOn.LocalDateTime.ToString("HH:mm:ss")}");
      WriteLine($"Scopes={string.Join(", ", ar.Scopes)}");
      // �o�͗�F
      // �T�C���C�����܂����B
      // AccessToken=EwBwA8l6BAAURSN�c�c�����c�cRd2Ag==
      // Username=biac@***.com
      // ExpiresOn=23:02:13
      // Scopes=mail.send, openid, profile, user.read
    }
    catch(MsalException ex)
    {
      // �F�؂����Ƀ_�C�A���O��‚���Ɨ�O���o��
      WriteLine($"{ex.GetType().Name}:{ex.ErrorCode}");
    }
    if (ar == null)
    {
      // �T�C���C���ł��Ȃ������̂ŃA�v���I��
#if DEBUG
      ReadKey();
#endif
      return;
    }

    // ������Graph API���g�����������s��

    // �T�C���A�E�g����
    await PCA.RemoveAsync(ar.Account);
    WriteLine("�T�C���A�E�g���܂���");

#if DEBUG
    ReadKey();
#endif
  }
}

Module Module1
  ' ClientID�ɂ́A�A�v����o�^�����Ƃ��̃A�v���P�[�V����ID��ݒ肷��
  Const ClientID As String = "********-****-****-****-************"
  Private ReadOnly RedirectUri As String = $"msal{ClientID}://auth"

  ' ���[�U�[�F�؊֌W�̃v���p�e�B
  Public ReadOnly Property PCA As PublicClientApplication _
    = New PublicClientApplication(ClientID) With {.RedirectUri = RedirectUri}
  Public ReadOnly Property Scopes As IReadOnlyList(Of String) _
    = New List(Of String) From {"User.Read", "Mail.Send"}.AsReadOnly()

  Sub Main()
    Task.Run(Async Function() As Task
               Await SendMailAsync()
             End Function).Wait()
#If DEBUG Then
    ReadKey()
#End If
  End Sub
  Async Function SendMailAsync() As Task
    Dim ar As AuthenticationResult = Nothing ' �F�،��ʁi�A�N�Z�X�g�[�N���Ȃǂ�����j
    Try
      ' �܂��T�C�����g�T�C���C��������
      Try
        Dim signedInUser As IAccount _
          = (Await PCA.GetAccountsAsync()).FirstOrDefault()
        If (signedInUser IsNot Nothing) Then
          ar = Await PCA.AcquireTokenSilentAsync(Scopes, signedInUser)
          ' �T�C�����g�T�C���C���Ɏ��s�����MsalUiRequiredException���o��
        End If
      Catch
      End Try

      ' �T�C�����g�T�C���C�����ł��Ȃ�������A�T�C���C����UI���o��
      If (ar Is Nothing) Then
        ar = Await PCA.AcquireTokenAsync(Scopes)
      End If

      WriteLine("�T�C���C�����܂����B")
      WriteLine($"AccessToken={ar.AccessToken}")
      WriteLine($"Username={ar.Account.Username}")
      WriteLine($"ExpiresOn={ar.ExpiresOn.LocalDateTime.ToString("HH:mm:ss")}")
      WriteLine($"Scopes={String.Join(", ", ar.Scopes)}")
      ' �o�͗�F
      ' �T�C���C�����܂����B
      ' AccessToken=EwBwA8l6BAAURSN�c�c�����c�cRd2Ag==
      ' Username=biac@***.com
      ' ExpiresOn=23:02:13
      ' Scopes=mail.send, openid, profile, user.read
    Catch ex As MsalException
      ' �F�؂����Ƀ_�C�A���O��‚���Ɨ�O���o��
      WriteLine($"{ex.GetType().Name}:{ex.ErrorCode}")
    Catch ex As Exception
      WriteLine(ex.ToString())
    End Try
    If (ar Is Nothing) Then
      ' �T�C���C���ł��Ȃ������̂ŃA�v���I��
      Return
    End If

    ' ������Graph API���g�����������s��

    ' �T�C���A�E�g����
    Await PCA.RemoveAsync(ar.Account)
    WriteLine("�T�C���A�E�g���܂���")
  End Function
End Module

MSAL���g���ăT�C���C���^�T�C���A�E�g����R���\�[���A�v���̗�i��FC#�A���FVB�j
����C#�̃R�[�h�́AC# 7.1�ȍ~�łȂ��ƃr���h�ł��Ȃ��̂Œ��ӂ��Ăق����BVisual Studio 2017��C#7.1��L���ɂ�����@�́A�uDev Basics�^Keyword�FC# 7.1�v�������������������B
�T�C���C������ɂ́APublicClientApplication�N���X�iMicrosoft.Identity.Client���O��ԁj�̃C���X�^���X������āAAcquireTokenAsync���\�b�h���Ăяo�������ł���B����ŔF�؃_�C�A���O���o��̂ŁA�G���h���[�U�[�ɃT�C���C�����Ă��炤�B
�Ȃ��A���̃T���v���ł͂܂��T�C�����g�T�C���C���������Ă��邪�A���̓R���\�[���A�v���̖`���ł͖��Ӗ��ł���B�����Ԏg��GUI�A�v���̏ꍇ�AGraph API���g�����тɔF�؃_�C�A���O���|�b�v�A�b�v���Ă͂����Ƃ������B�F�؂��󂯂�Ɓi�T�C���A�E�g���Ȃ���΁j1���ԂقǗL���Ȃ̂ŁAGraph API�����̊ԂɎg���”\��������Ƃ��̓T�C�����g�T�C���C���������Ă݂�̂��悢�B�F�؃_�C�A���O���o�����ƂȂ��ĔF�؂���A�F�؂̗L�����Ԃ����������B

�@��̃R�[�h�����s����ƁA���̉摜�̂悤�ȔF�؃_�C�A���O���\�������B

�F�؃_�C�A���O�̏�����ʁB�w���ɏ]���Đi�߂�
�F�؃_�C�A���O�̏�����ʁB
�w���ɏ]���Đi�߂�
��
���͂������[���A�h���X��Microsoft�A�J�E���g�ƐE��܂��͊w�Z�A�J�E���g�̗��������ѕt���Ă���Ƃ��́A���̂悤�ȑI����ʂ��\�������
���͂������[���A�h���X��Microsoft�A�J�E���g�ƐE��܂��͊w�Z�A�J�E���g�̗��������ѕt���Ă���Ƃ��́A���̂悤�ȑI����ʂ��\�������
��
�Ō�ɁA�A�v�����ƃA�v���ɗ^����A�N�Z�X���‚̊m�F���\�������B�����Łm�͂��n���N���b�N����ƔF�؊����ƂȂ�
�Ō�ɁA�A�v�����ƃA�v���ɗ^����A�N�Z�X���‚̊m�F���\�������B
�����Łm�͂��n���N���b�N����ƔF�؊����ƂȂ�

MSAL�̔F�؃_�C�A���O
���̃_�C�A���O��MSAL�̃��C�u�������o���Ă���B�����œ��͂����p�X���[�h�́A�A�v���ɂ͓n����Ȃ��B���C�u�������g�킸��Azure AD�̔F�؂��󂯂�ꍇ�ł��A���l��Web�y�[�W���\������A��͂�p�X���[�h���A�v���ɓn����邱�Ƃ͂Ȃ��B


�e�L�X�g���[����g�ݗ��Ă�ɂ́H

�@���[���̃��b�Z�[�W�́AMessage�N���X�iMicrosoft.Graph���O��ԁj�ŕ\�����B���Ȃ݂ɁAMessage�N���X��OutlookItem�N���X�iMicrosoft.Graph���O��ԁj���p�����Ă���B

�@�e�L�X�g���[���̃��b�Z�[�W��g�ݗ��Ă�ɂ́AMessage�N���X�̃C���X�^���X�����A���̃v���p�e�B��ݒ肷��΂悢�i���̃R�[�h�j�B�����R�[�h���w�肷����@�͂Ȃ����AJIS�R�[�h�ŃG���R�[�f�B���O����đ��M�����i���炭�AWindows�̌���ݒ������Graph API���Ăяo���Ƃ���Accept-Language�𑗐M���A����ɂ���Ĕ��肵�Ă�����̂Ǝv����j�B

// ���[���쐬
var email = new Message
{
  ToRecipients = new Recipient[] {
    new Recipient {
      EmailAddress = new EmailAddress {
        Name = "outlook.com���烁�[����M",
        Address = "***@***.jp"
      }
    },
    // Recipient�I�u�W�F�N�g�͕����w��”\�iCC�^BCC���j
  },
  // CcRecipients = �c�c�ȗ��c�c
  // BccRecipients = �c�c�ȗ��c�c
  Subject = "Graph API�Ń��[���𑗐M����e�X�g",
  Body = new ItemBody
  {
    ContentType = BodyType.Text,
    Content = "Microsoft GRAPH���g�������[�����M�̃e�X�g�B",
  },
};

' ���[���쐬
Dim email = New Message With
{
  .ToRecipients = {
    New Recipient With {
      .EmailAddress = New EmailAddress With {
        .Name = "outlook.com���烁�[����M",
        .Address = "***@***.jp"
      }
    }
  },
  .Subject = "Graph API�Ń��[���𑗐M����e�X�g",
  .Body = New ItemBody With
  {
    .ContentType = BodyType.Text,
    .Content = "Microsoft GRAPH ���g�������[�����M�̃e�X�g�B"
  }
}
' CC�iCcRecipients�v���p�e�B�j�^BCC�iBccRecipients�v���p�e�B�j���w���
' Recipient�I�u�W�F�N�g�͕����w��”\�iTO�^CC�^BCC�j

�e�L�X�g���[���̃��b�Z�[�W��g�ݗ��Ă��i��FC#�A���FVB�j
���̃R�[�h�́A�O�q�̃T���v���R�[�h�Łu������Graph API���g�����������s���v�ƃR�����g���������ɋL�q����B
�����ł�ContentType�v���p�e�B�ɁuBodyType.Text�v�Ǝw�肵�Ă���̂ŁA�v���[���e�L�X�g�̃��[���ɂȂ�B�uBodyType.Html�v���w�肵�AContent�v���p�e�B��HTML�̕������ݒ肷���HTML���[���ɂȂ�B

�@�Ȃ��AMessage�N���X�ɂ�From�v���p�e�B�����邪�A�ʏ�͐ݒ肵�Ȃ��B�T�C���C�������A�J�E���g�̃��[���A�h���X���g����B�T�C���C�������A�J�E���g�ɕ����̃��[���A�h���X���o�^����Ă���ꍇ�ɂ́A�T�C���C���Ɏg�������̂Ƃ͈قȂ郁�[���A�h���X��From�v���p�e�B�ɐݒ肷�邱�Ƃ͉”\���B�������A���̏ꍇ��Name�v���p�e�B�͖�������āA�o�^����Ă��閼�O���g����B

�@�������A�T�C���C�������A�J�E���g�Ɍ��ѕt�����Ă��Ȃ����[���A�h���X��From�v���p�e�B�ɐݒ肵�Ă��܂����ꍇ�́A���[�����M���G���[�ɂȂ�΂��肩�A���̃A�J�E���g����������Ă��܂����Ƃ�����̂Œ��ӂ��K�v���i���̉摜�j�B�v����ɁAFROM�̍��̂͋����Ȃ��Ƃ����킯�ł���B

�s����FROM���w�肵�ăA�J�E���g���������ꂽ�i������ʒm���郁�[���j �s����FROM���w�肵�ăA�J�E���g���������ꂽ�i������ʒm���郁�[���j
�uverify your account�v�̃����N����J���Ďw���ɏ]���đ��삷��΁A�����ɉ��������B
FROM���̂������Ȃ��悤�ɂ��āAoutlook.com����̃��[���̐M���������߂Ă���̂ł���B

���[���𑗐M����ɂ́H

�@MSAL���C�u������Graph API���g���ɂ́AGraphServiceClient�N���X�iMicrosoft.Graph���O��ԁj�𗘗p����B

�@Graph API�Ƀ��N�G�X�g�𑗐M����Ƃ��ɃA�N�Z�X�g�[�N����Y�t����K�v������̂����AMSAL�ł͂��̏�����IAuthenticationProvider�C���^�t�F�[�X�iMicrosoft.Graph���O��ԁj�ōs���悤�ɐ݌v����Ă���B���̎������ɍ���Ă������i���̃R�[�h�j�B

public class MsalAuthenticationProvider : IAuthenticationProvider
{
  public async Task AuthenticateRequestAsync(HttpRequestMessage request)
  {
    // �m���ɗL���ȃA�N�Z�X�g�[�N���𓾂邽�߂ɁA�T�C�����g�T�C���C�����s��
    IAccount signedInUser 
      = (await Program.PCA.GetAccountsAsync()).FirstOrDefault();
    AuthenticationResult ar
      = await Program.PCA.AcquireTokenSilentAsync(Program.Scopes, signedInUser);

    // �A�N�Z�X�g�[�N����request�ɃZ�b�g����
    request.Headers.Authorization
      = new AuthenticationHeaderValue("Bearer", ar.AccessToken);
  }
}

Public Class MsalAuthenticationProvider
  Implements IAuthenticationProvider

  Public Async Function AuthenticateRequestAsync(request As HttpRequestMessage) As Task _
    Implements IAuthenticationProvider.AuthenticateRequestAsync

    ' �m���ɗL���ȃA�N�Z�X�g�[�N���𓾂邽�߂ɁA�T�C�����g�T�C���C�����s��
    Dim signedInUser As IAccount = (Await PCA.GetAccountsAsync()).FirstOrDefault()
    Dim ar As AuthenticationResult _
      = Await PCA.AcquireTokenSilentAsync(Scopes, signedInUser)

    ' �A�N�Z�X�g�[�N����request�ɃZ�b�g����
    request.Headers.Authorization _
      = New AuthenticationHeaderValue("Bearer", ar.AccessToken)
  End Function
End Class

IAuthenticationProvider�C���^�t�F�[�X�̎�����i��FC#�A���FVB�j
�F�؂Ɏg����PublicClientApplication�I�u�W�F�N�g�iPCA�v���p�e�B�j�ƃX�R�[�v�̔z��iScopes�v���p�e�B�j���A�����ł��K�v�ɂȂ邱�Ƃɒ��ӁB���̂��߂ɁA���[�U�[�F�؂�����T���v���R�[�h�̂Ƃ���ŁA�����2�‚�public�ȃv���p�e�B�ɂ��Ă������̂ł���B
�Ȃ��A�uBearer�v�Ƃ����̂́AOAuth 2.0��bearer token�̂��Ƃł���B

�@���ۂɃ��[���𑗐M����R�[�h�́A���̂悤�ɃV���v���Ȃ��̂��B

// ���[�����M
try
{
  GraphServiceClient gsc
    = new GraphServiceClient(new MsalAuthenticationProvider());
  await gsc.Me.SendMail(email).Request().PostAsync();
  WriteLine("���[�����M����");
}
catch (Exception ex)
{
  WriteLine("���[�����M���s");
  WriteLine(ex.ToString());
}

' ���[�����M
Try
  Dim gsc As GraphServiceClient _
    = New GraphServiceClient(New MsalAuthenticationProvider())
  Await gsc.Me.SendMail(email).Request().PostAsync()
  WriteLine("���[�����M����")

Catch ex As Exception
  WriteLine("���[�����M���s")
  WriteLine(ex.ToString())
End Try

outlook.com�Ń��[���𑗐M�����i��FC#�A���FVB�j
���̃R�[�h�́A�O�q�̃T���v���R�[�h�u�e�L�X�g���[���̃��b�Z�[�W��g�ݗ��Ă��v�̌��ɑ����ċL�q����B

�t�@�C����Y�t����ɂ́H

�@���M���郁�[���Ƀt�@�C����Y�t����ɂ́AMessage�I�u�W�F�N�g��Attachments�v���p�e�B��ݒ肷��΂悢�i���̃R�[�h�j�B�}���`�p�[�g���[���̎d�g�݂��ӎ����邱�ƂȂ��A�ȒP�ɃR�[�f�B���O�ł���B

email.Attachments = new MessageAttachmentsCollectionPage();
string path = @"C:\Windows\Web\Wallpaper\Theme2\img10.jpg"; // �Y�t�������t�@�C��
email.Attachments.Add(new FileAttachment
{
  ODataType = "#microsoft.graph.fileAttachment",
  ContentBytes = System.IO.File.ReadAllBytes(path),
  ContentType = "image/jpeg",
  Name = System.IO.Path.GetFileName(path),
});

email.Attachments = New MessageAttachmentsCollectionPage()
Dim path As String = "C:\Windows\Web\Wallpaper\Theme2\img10.jpg" ' �Y�t�������t�@�C��
email.Attachments.Add(New FileAttachment With
{
  .ODataType = "#microsoft.graph.fileAttachment",
  .ContentBytes = System.IO.File.ReadAllBytes(path),
  .ContentType = "image/jpeg",
  .Name = System.IO.Path.GetFileName(path)
})

���[���Ƀt�@�C����Y�t�����i��FC#�A���FVB�j
���̃R�[�h�́A���[���𑗐M����R�[�h�̎�O�ɋL�q����B�Y�t�t�@�C���̃p�X�́A�K�؂Ȃ��̂ɏC�����Ăق����B
ODataType�v���p�e�B�́A�t�@�C����Y�t����ꍇ�͂��̂悤�Ɏw�肷��B�t�@�C���̑���ItemAttachment�i�A����^�C�x���g�^���b�Z�[�W�j��ReferenceAttachment�i�N���E�h��̃t�@�C���ւ̃����N�j���w��ł���B�ڂ����́u�Y�t�t�@�C����lj������v���Q�Ƃ��Ă������������i��������AODataType�v���p�e�B�ɐݒ肷��Ƃ��͐擪�Ɂu#�v��t����j�B

�܂Ƃ�

�@�G���h���[�U�[��Microsoft�A�J�E���g���g���āAoutlook.com���烁�[���𑗐M�ł���BMicrosoft Graph API���g����悤�ɂ���܂ł̏�����������Ɩ��ł��邪�A���[��������đ��M����R�[�h�͊ȒP�ł���B

���p�”\�o�[�W�����F.NET Framework 4.5�ȍ~
�J�e�S���F�I�[�v���\�[�X���C�u�����@�����ΏہFWindows�t�H�[��
�J�e�S���F�I�[�v���\�[�X���C�u�����@�����ΏہFWPF
�J�e�S���F�I�[�v���\�[�X���C�u�����@�����ΏہFXamarin.Forms
�J�e�S���F�N���X���C�u�����@�����ΏہF�d�q���[��
�g�p���C�u�����FMessage�N���X�iMicrosoft.Graph���O��ԁj
�g�p���C�u�����FGraphServiceClient�N���X�iMicrosoft.Graph���O��ԁj
�֘ATIPS�F�d�q���[���𑗐M����ɂ́H�iMailKit�ҁj�m.NET 4.5�AC#�^VB�n
�֘ATIPS�F�\���F�C���X�^���X���Ɠ����Ƀv���p�e�B��ݒ肷��ɂ́H�mC#�^VB�n
�֘ATIPS�F�\���F�R���N�V�����̃C���X�^���X���Ɠ����ɗv�f��lj�����ɂ́H�mC#�^VB�n
�֘ATIPS�F�\���F�N���X�����������ɐÓI���\�b�h���Ăяo���ɂ́H�mC# 6.0�n
�֘ATIPS�FVB.NET�ŃN���X�����ȗ����ă��\�b�h��萔�𗘗p����ɂ́H
�֘ATIPS�F���l���E�l�߂�0���߂ŕ����񉻂���ɂ́H�mC#�AVB�n
�֘ATIPS�FVisual Studio�ŃR���\�[���E�A�v���P�[�V�����̃f�o�b�O���s���ɃR�}���h�E�v�����v�g��‚��Ȃ��悤�ɂ���ɂ́H


�u.NET TIPS�v�̃C���f�b�N�X

�u.NET TIPS�v

Copyright© Digital Advantage Corp. All Rights Reserved.

�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

Microsoft �� Windows�őO��2025
AI for �G���W�j�A�����O
���[�R�[�h�^�m�[�R�[�h �Z���g���� by ��IT - IT�G���W�j�A���r�W�l�X�̒��S�Ŋ��􂷂�g�D��
Cloud Native Central by ��IT - �X�P�[���u���Ȕ\�͂�g�D��
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B