2016-10-24 4 views
0

外部プロセスがExchangeメールボックスにメッセージを電子メールで送信します。その後、後続の処理のために電子メールメッセージを取得するExchange Web Services(EWS)2.0アプリケーションがあります。 EWSアプリケーションは、現在の日付に受信されたメッセージ、たとえば"received:today"をAQS用語で取得するように設計されています。メッセージは、しかし、取得されることはありません - どれもFindItems方法のItemViewに返されません:「受信:昨日の」この日付を変更し、EWS QueryStringが「受信」日付を1日遅らせます。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); 
// sharedMailbox is a FolderId type set to a valid well-known location not reproduced here 

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:today)", new ItemView(20)); 

ヒバリには最終的に所望のメッセージをキャッチしますが、検査メッセージのそれぞれについて、各メッセージの明示的な受信日はない昨日でしたが、今日

Console.WriteLine(item.DateTimeReceived.ToLocalTime()); 
    Console.WriteLine(item.DateTimeReceived.ToUniversalTime()); 

10/24/2016 1:05:38 AM 
10/24/2016 6:05:38 AM 

私は定数の翻訳に奇妙な疑いがあり、明示的な日付を提供することを選択しました。日付が昨日フェッチメッセージがを取得しました。このコードではあるが

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/23/2016)", new ItemView(20)); 

:しかし、明示的に(むしろ「今日」や「昨日よりも)"received:MM/DD/YYYY"形で受領日を定義するには、同じ結果を示しました今日(2011年10月24日)(ではなく、 10/23/2016)です。コードの指定希望のメッセージを取得する必要があり今日、実際にフェッチメッセージ:受信:「昨日受け取っ」と」:実際に

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/24/2016)", new ItemView(20)); 

は、明示的な日付はとまったく動作していません今日'querystringの値は、これらの定数が単にハードコーディングされた値にマップされていることを意味します。

私は、タイムゾーンの違い、またはUTCの変換の違いを疑ったが、私たちのローカルタイムゾーン「を受信:今日」を指定することを意味し、UTC背後であるべきで、現実には、メッセージをフェッチでの作業は、今日....受け取りました。

私は、取り出されたメッセージでこの1日の不一致がなぜ発生しているのかを知ることはできません。メッセージの日付解釈のどの部分が正しく処理されていませんか?

EDIT:コメント欄での提案あたり、私はNowDateTime値マイナス1日DateTime.Nowから24時間(実際には、値を使用して、SearchFilterオブジェクトを使用するFindItems呼び出しを修正。これは、作成しました。 2016年10月23日に渡って今日ののメッセージを取得しました。

SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime.Now.AddDays(-1)); 

が合図を取る:だから私は、彼らが10月24日に受けたため、フィルタが実際にメッセージを発見した、または検索日付範囲が含まれているため(他の検索が動作するように引き起こされる)昨日のことを確認することができませんこのことから、私は明示的な時間要素なしDateTimeを使用するようにフィルタを変更:

SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime(2016,10,24)); 

この検索フィルタは今日受け取った両方のメッセージを返し、を働きました。これは、「今日」と「昨日」のキーワードで意味の乱れや不確実性を示唆する傾向があります。

可能であれば、AQSベースのソリューションを探したり、クエリ文字列の値が期待どおりに機能しない理由を理解している方がよいでしょう。

+1

興味深いのは、 'FindItems'を' SearchFilter'で使うとどうなりますか? 'SearchFilter filter = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived、DateTime.Now-1);' –

+0

良い質問です。私はあなたの提案を適用し、助言する。 –

+0

@MarekFeketeあなたの提案の結果を反映した注釈をご覧ください。 「昨日」と「今日の」AQSキーワードの微妙なバグや特質があるようです。 –

答えて

1

ExchangeでAQSを使用している場合は、日付と相対日付のキーワードを含む検索クエリの関係演算子を使用できます。

>昨日「HOW TOより抜粋

:EWSを使用して、AQS検索を実行

は奇数が、次の式では、あなたが動作するように相対的な日付のキーワード「今日」を予想する方法を働きましたExchangeで「

」日付値タイプもより大きい又はより小さい、または範囲演算子で範囲として指定されたような関係演算子と比較することが...例えば、受信することができる:> 2013年11月30日を送信:> =昨日、受信:12/1/2013 ..今日すべての有効なクエリ文字列です。 "

+0

ありがとう、@ジャスティン。私は、 'SearchFilterCollection'で元のメッセージに記載されているように、パッケージをデプロイする必要がありました。あなたが提供した提案は、「今日の」キーワードの解釈が何らかの形で壊れているという事実を強調しているだけです。 –

関連する問題