web-dev-qa-db-ja.com

Exchange WebサービスのマネージAPIから受信トレイ内のすべてのメールを取得し、.emlファイルとして保存する

EWSマネージAPIを使用して受信トレイフォルダー内のすべてのメールをフェッチし、.emlとして保存したい。問題は(1)all(2)all headers like(from、to、subject)を含むメールをフェッチすることです==(fromtoおよびその他のプロパティがどこかにあるため、それらも必要です)および(3)byte[] EmailMessage.MimeContent.Content。実際には私は理解が不足しています

  • Microsoft.Exchange.WebServices.Data.ItemView
  • Microsoft.Exchange.WebServices.Data.BasePropertySetおよび
  • Microsoft.Exchange.WebServices.Data.ItemSchema

それが私が難しいと思う理由です。

私の主なコードは:

次のようにPropertySetを作成すると、

PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent);

次の例外が発生します。

The property MimeContent can't be used in FindItem requests.

わかりません

(1)これらのItemSchemaおよびBasePropertySetとは

(2)そして、それらをどのように使用することになっているのか

だから私はItemSchema.MimeContentを削除しました:

PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties);

受信トレイ内のすべてのメールを取得する簡単な次のコードを記述しました。

ItemView view = new ItemView(50);
view.PropertySet = properties;
FindItemsResults<Item> findResults; 
List<EmailMessage> emails = new List<EmailMessage>();

do
{    
    findResults = service.FindItems(WellKnownFolderName.Inbox, view);
    foreach (var item in findResults.Items)
    {
        emails.Add((EmailMessage)item);
    }
    Console.WriteLine("Loop");
    view.Offset = 50;
}
while (findResults.MoreAvailable);

上記では、ItemViewのページサイズを50に維持して、一度に50通以下のメールを取得し、50だけオフセットして、もしあれば次の50通のメールを取得しました。ただし、無限ループに入り、コンソールにLoopを継続的に出力します。だから私はpagesizeoffsetが間違っていることを理解している必要があります。理解したい

(3)pagesizeコンストラクターのoffsetoffsetbasepointおよびItemViewの意味

(4)それらがどのように動作し、

(5)それらを使用して受信トレイ内のすべてのメールを取得する方法

オンラインでこれらをうまく説明している記事は見つかりませんでしたが、コードのサンプルを提供しています。長くなるかもしれませんが、質問ごとの説明に感謝します。

16
Mahesha999

EWSは、さまざまな操作から返されるプロパティと少し矛盾しています。 Item.Bindは、FindItemとまったく同じプロパティを返しません。サーバーから必要なものを定義するまでは、PropertySetを適切に使用していますが、適切な場所で使用する必要があります。あなたがする必要があるのは、アイテムを見つけて、それらにプロパティをロードすることです。理想的ではありませんが、それがEWSの動作方法です。ループでは、オフセットを50ずつ増やす必要があるときに、オフセットに常に50を割り当てています。

int offset = 0;
int pageSize = 50;
bool more = true;
ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning);

view.PropertySet = PropertySet.IdOnly;
FindItemsResults<Item> findResults;
List<EmailMessage> emails = new List<EmailMessage>();

while(more){
    findResults = service.FindItems(WellKnownFolderName.Inbox, view);
    foreach (var item in findResults.Items){
        emails.Add((EmailMessage)item);
    }
    more = findResults.MoreAvailable;
    if (more){
        view.Offset += pageSize;
    }
}
PropertySet properties = (BasePropertySet.FirstClassProperties); //A PropertySet with the explicit properties you want goes here
service.LoadPropertiesForItems(emails, properties);

これで、リクエストしたすべてのプロパティを持つすべてのアイテムが揃いました。 FindItemsは、要求してもすべての必要なプロパティを返さないことがよくあります。そのため、最初はIDのみをロードしてから、必要なプロパティをロードするのが一般的な方法です。また、取得する電子メールの数に応じて、何らかの方法でプロパティのロードをバッチ処理することもできます。おそらく、それらをEmailMessagesのリストに追加する前のループで行います。 service.SyncFolderアクションなど、アイテムを取得する他の方法を検討することもできます。

26
user1017413