次の方法で共有


パブリック フォルダー コンテンツ要求のルーティング

パブリック フォルダーのコンテンツを含むパブリック フォルダーの情報の要求はすべて、ターゲット フォルダーのコンテンツを保持するパブリック フォルダー メールボックスにルーティングされる必要があります。 そのメールボックスへの要求をルーティングするには、X-AnchorMailbox ヘッダーと X-PublicFolderMailbox ヘッダーを特定の値に設定する必要があります。

次の表では、このプロセスの概要を説明します。

パブリック フォルダーの概要

ヘッダー 必要なもの 取得する方法
X-AnchorMailbox
1. パブリック フォルダー階層メールボックス の X-AnchorMailbox と X-PublicFolderInformation の値

2. メールボックスのコンテンツを含むパブリック フォルダー メールボックスの GUID。これは自動検出サービスに送信されます。

自動検出の応答の AutoDiscoverSMTPAddressX-AnchorMailbox ヘッダーの値になります。
Todo
1. この記事にある、EWS マネージ API を実装するコード例を使用します。 または、EWS を使用し、結果を変換して GUID を取得します。

2. GUID とドメイン名を使用して、自動検出を要求します。

3. 自動検出の応答で返された AutoDiscoverSMTPAddress 要素の値を使用して、ヘッダーの値を設定します。
X-PublicFolderMailbox
作業は完了しています。X-PublicFolderMailbox の値は X-AnchorMailbox の値と同じです。
既に取得済みです。

ヘッダーの値が決定したら、それらをパブリック フォルダーのコンテンツ要求を行うときに含めます。

この記事の手順は、パブリック フォルダー コンテンツの要求に固有のものです。 要求がパブリック フォルダー階層かコンテンツ要求かを特定するには、「パブリック フォルダー要求のルーティング」を参照してください。

EWS マネージ API を使用してパブリック フォルダー メールボックスの GUID を特定する

パブリック フォルダーのコンテンツ メールボックスの GUID を特定するには、次の動作を実行する以下のコード例を使用します。

PR_REPLICA_LIST の値は、フォルダーのコンテンツを含むパブリック フォルダー メールボックスのメールボックス GUID を識別します。 PR_REPLICA_LIST プロパティはバイト配列ですが、このシナリオでは GUID としてキャストされます。 GUID とドメイン名が連結されて、自動検出を呼び出すためのアドレスが形成されます。

この例では、 がメールボックス ユーザーの ExchangeService オブジェクトでありPFHMailboxHeaderPFHAnchorHeaderX-AnchorMailbox ヘッダーと X-PublicFolderMailbox ヘッダーの値であり、domain はテナントで使用されるドメイン名であると想定serviceしています。

public static string GetMailboxGuidAddress(ExchangeService service, String PFHAnchorHeader, String PFHMailboxHeader, String domain)
{
    // Create a new folder view, and pass in the maximum number of folders to return.
    FolderView view = new FolderView(10);
    // Create an extended property definition for the PR_REPLICA_LIST property.
    ExtendedPropertyDefinition PR_REPLICA_LIST = new ExtendedPropertyDefinition(0x6698, MapiPropertyType.Binary);
    // As a best practice, limit the properties returned to only those required.
    // In this case, return the folder ID, the folder display name, and 
    // the value of the PR_REPLICA_LIST extended property definition.
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.DisplayName, PR_REPLICA_LIST);
    service.HttpHeaders.Add("X-AnchorMailbox", PFHAnchorHeader);
    service.HttpHeaders.Add("X-PublicFolderMailbox", PFHMailboxHeader);
    // Add a call to the CertificateValidationCallback method here if needed.
    // ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
    // Call FindFolders to retrieve the folder hierarchy, starting with the PublicFolderRoot folder.
    // This method call results in a FindFolder call to EWS.
    FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, view);
    string GuidAsString = null;
    List<string> Guids = new List<string>();
    // For each folder under the root, display the name, and copy the value of the 
    // PR_REPLICA_LIST byte array to a string value. 
    foreach (Folder folder in findResults.Folders)
    {
        Console.WriteLine("Public folder display name: {0}", folder.DisplayName);
        byte[] ByteArr = (byte[])folder.ExtendedProperties[0].Value;
        GuidAsString = System.Text.Encoding.ASCII.GetString(ByteArr, 0, 36);
        Guids.Add(GuidAsString);
        Console.WriteLine("Address for Autodiscover: {0}.{1}\r\n", GuidAsString, domain);
    }
    // Concatenate the GUID value of the PR_REPLICA_LIST with the domain name to generate the 
    // SMTP address to use for the AutoDiscover request for the public folder content mailbox.
    string AutoDSMTPAddress = GuidAsString + "@" + domain;
    // Check that all folders have the same GUID value. If they do not, use the GUID value of the
    // folder that you're requesting content for.
    string commonGuid = CompareGuidsForEquality(Guids);
    if (commonGuid == "Not Equal")
    {
        Console.WriteLine("The GUIDs for all the folders in the hierarchy are not the same. Run the Autodiscover sample using the address returned above that is associated with the folder in your hierarchy request.", AutoDSMTPAddress);
        return null;
    }
    else
    {
        Console.WriteLine("The GUIDs for all public folders in the hierarchy are the same. Run the Autodiscover sample using the {0} address.", AutoDSMTPAddress);
        return AutoDSMTPAddress;
    }
}
// Method to compare the GUID for each folder under the public folder root.
// If each GUID is the same, return the GUID.
// If the GUIDs are not the same, return "Not equal".
public static string CompareGuidsForEquality(List<string> list)
{
    string NotEqual = "Not equal";
    string first = list.First();
    return list.All(x => x == first) ? first : NotEqual;
}

"要求が失敗しました。 基になる接続が閉じられました: SSL/TLS セキュリティで保護されたチャネルの信頼関係を確立できませんでした"、 検証コールバック メソッドへの呼び出しを追加する必要があります。 コード例には、そのメソッドのプレースホルダーとコメントが含まれています。

メールボックスの GUID がパブリック フォルダー ルートにあるすべてのパブリック フォルダーで統一されている場合、この例は、コンソール出力で自動検出を呼び出すときに使用するアドレスを戻り値として示します。 メールボックスの GUID がパブリック フォルダー ルートにあるすべてのパブリック フォルダーで統一されていない場合、コンテンツ要求のフォルダーに関連付けられているアドレスで自動検出を要求する必要があります。

EWS を使用してパブリック フォルダー メールボックスの GUID を特定する

次のコード例では、EWS FindFolder 操作を使用して PR_REPLICA_LIST (0x66980102) プロパティの値を取得する方法を示します。 ExtendedFieldURI 要素の、PropertyTag 属性は PR_REPLICA_LIST プロパティの 10 進数 (26264) に、PropertyType 属性は Binary に設定します。

これは、EWS マネージ API を使用してパブリック フォルダー メールボックスの GUID を特定するために FindFolders メソッドを使用するときに、EWS マネージ API が送信する XML 要求です。

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/15.00.0913.015
Accept-Encoding: gzip,deflate
Authorization: Basic c29ueWFmQGNvbnRvc28xMDAwLm9ubWljcm9zb2Z0LmNvbTpFWENIIzIwMTQ=
Host: outlook.office365.com
Cookie: ClientId=KZPBLKA9ZMPXAQDW
Content-Length: 1005
Expect: 100-continue
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
  </soap:Header>
  <soap:Body>
    <m:FindFolder Traversal="Shallow">
      <m:FolderShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="folder:DisplayName" />
          <t:ExtendedFieldURI PropertyTag="26264" PropertyType="Binary" />
        </t:AdditionalProperties>
      </m:FolderShape>
      <m:IndexedPageFolderView MaxEntriesReturned="10" Offset="0" BasePoint="Beginning" />
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="publicfoldersroot" />
      </m:ParentFolderIds>
    </m:FindFolder>
  </soap:Body>
</soap:Envelope>

サーバーは、FindFolder 要求に対して PR_REPLICA_LIST の拡張プロパティの値を含む FindFolderResponse メッセージで応答します。 プロパティの値は、Base-64 のエンコードされたバイト配列の文字列形式として EWS 応答に表れることに注意してください。 応答内のいくつかのヘッダー値は読みやすいように短縮されています。

<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="1019" MinorBuildNumber="15" Version="V2_17" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
  </s:Header>
  <s:Body>
    <m:FindFolderResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindFolderResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="2" TotalItemsInView="2" IncludesLastItemInRange="true">
            <t:Folders>
              <t:ContactsFolder>
                <t:FolderId Id="AAEuAAAAAADL8shaNEKnQYVvRbpoY9vDAQBGDloItRzyTrAt+XVzRr/YAABdofPkAAA=" ChangeKey="AwAAABYAAABGDloItRzyTrAt+XVzRr/YAABdo/2h"/>
                <t:DisplayName>My Public Contacts</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x6698" PropertyType="Binary"/>
                  <t:Value>MWVjMmEyMzYtZWQ5My00Zjg4LWI5YzYtMzNlNjNmYTRhYTQ0AA==</t:Value>
                </t:ExtendedProperty>
              </t:ContactsFolder>
              <t:Folder>
                <t:FolderId Id="AQEuAAADy/LIWjRCp0GFb0W6aGPbwwEARg5aCLUc8k6wLfl1c0a/2AAAAxEAAAA=" ChangeKey="AQAAABYAAABGDloItRzyTrAt+XVzRr/YAABdo/W/"/>
                <t:DisplayName>SampleFolder</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x6698" PropertyType="Binary"/>
                  <t:Value>MWVjMmEyMzYtZWQ5My00Zjg4LWI5YzYtMzNlNjNmYTRhYTQ0AA==</t:Value>
                </t:ExtendedProperty>
              </t:Folder>
            </t:Folders>
          </m:RootFolder>
        </m:FindFolderResponseMessage>
      </m:ResponseMessages>
    </m:FindFolderResponse>
  </s:Body>
</s:Envelope>

XML で返される PR_REPLICA_LIST の値を使用するには、MWVjMmEyMzYtZWQ5My00Zjg4LWI5YzYtMzNlNmYTRhYTQ0AA==、メールボックス GUID を決定するために、 値を EWS マネージ API コードの例で変換する方法に似た形式で GUID に変換する必要があります。 その後、GUID がドメイン名と連結され、 自動検出要求に含まれる SMTP アドレスが作成されます。

自動検出を要求する

メソッドから返されるアドレスを GetMailboxGuidAddress 使用して自動検出を呼び出します。 「Exchange 2013: 自動検出によるユーザー設定の取得」のコード例を使用して、自動検出サービスを呼び出すことをお勧めします。これは、このコード例が自動検出プロセスを効率化するためです。 このコード例では、次の表に記載されているコマンドライン引数を使用して POX 自動検出サービスを呼び出し、メールボックスの GUID に関連付けられている AutoDiscoverSMTPAddress の値を取得します。

引数 説明
emailAddress
パブリック フォルダー メールボックスGetMailboxGuidAddress GUID の決定に関するページの メソッドによって返されるアドレス。
-skipSOAP
POX 自動検出要求が必要であることを示します。
-auth authEmailAddress
認証に使用されるメールボックス ユーザーの電子メール アドレスです。 サンプルを実行すると、メールボックス ユーザーのパスワードの入力を求められます。

たとえば、コマンドライン引数は次のようになります。

1ec2a236-ed93-4f88-b9c6-33e63fa4aa44@contoso.com -skipSOAP -auth sonyaf@contoso.com

ここで、1ec2a236-ed93-4f88-b9c6-33e63fa4aa44@contoso.comGetMailboxGuidAddress メソッドによって返されたアドレスで、sonyaf@contoso.com はメールボックス ユーザーです。

Exchange 2013: Get user settings with Autodiscover」のサンプルを実行すると、最後の自動検出応答は成功し、メールボックス GUID に関連付けられているすべてのユーザー設定が含まれます。 次の手順で使用するので、ローカルに AutoDiscoverSMTPAddress ユーザー設定を保存します。

または、Exchange 2013: Get user settings with Autodiscover のサンプルを使用しない場合は、自動検出エンドポイントの一覧を生成することによって AutoDiscoverSMTPAddress ユーザー設定を取得してから、正常な応答を受信するまで次の POX 自動検出要求をそれぞれの URL に送信します。

<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
  <Request>
    <EMailAddress>1ec2a236-ed93-4f88-b9c6-33e63fa4aa44@contoso.com</EMailAddress>
    <AcceptableResponseSchema>https://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>
  </Request>
</Autodiscover>

自動検出プロセスの詳細については、「Exchange の自動検出」、「自動検出エンドポイントの一覧を生成する」、および「自動検出を使用して Exchange からユーザー設定を取得する」を参照してください。

X-AnchorMailbox ヘッダーと X-PublicFolderMailbox ヘッダーの値を設定する

自動検出要求を作成するで取得した AutoDiscoverSMTPAddress の値を使用して、パブリック フォルダー コンテンツ要求に X-AnchorMailbox ヘッダーと X-PublicFolderMailbox ヘッダーの値を設定します。

たとえば、 の AutoDiscoverSMTPAddress を指定すると、次の NewPublicFolder@contoso.comメソッドまたは操作を呼び出すときに、次のヘッダーが含まれます。

X-AnchorMailbox: NewPublicFolder@contoso.com
X-PublicFolderMailbox: NewPublicFolder@contoso.com

X-AncorMailbox ヘッダーと X-PublicFolder ヘッダーが必要なパブリック フォルダー呼び出し

EWS マネージ API メソッド EWS 操作
Item.Bind
Item.Update
Item.Copy
Item.Move
Item.Delete
Folder.Bind
Folder.FindItems
CreateItem
GetItem
UpdateItem
CopyItem
MoveItem
DeleteItem
GetFolder
FindItem

EWS マネージ API を使用してこれらのヘッダーを追加するには、HttpHeaders.Add メソッドを使用します。

service.HttpHeaders.Add("X-AnchorMailbox", "NewPublicFolder@contoso.com");
service.HttpHeaders.Add("X-PublicFolderMailbox", "NewPublicFolder@contoso.com");

次のコードは、X-AnchorMailbox ヘッダーと X-PublicFolderMailbox ヘッダーがこの記事の例で取得した値に設定されている GetFolder 要求を示します。

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
User-Agent: SoapSender1.0
X-AnchorMailbox: NewPublicFolder@contoso.com
X-PublicFolderMailbox: NewPublicFolder@contoso.com
Authorization: Basic c29ueWFmQGNvbnRvc28xMDAwLm9ubWljcm9zb2Z0LmNvbTpFWENIIzIwMTQ=
Host: outlook.office365.com
Content-Length: 688
Expect: 100-continue
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
  </soap:Header>
  <soap:Body>
    <m:GetFolder>
      <m:FolderShape>
        <t:BaseShape>AllProperties</t:BaseShape>
      </m:FolderShape>
      <m:FolderIds>
        <t:DistinguishedFolderId Id="publicfoldersroot" />
      </m:FolderIds>
    </m:GetFolder>
  </soap:Body>
</soap:Envelope>

関連項目