2013-12-18 12 views
11

Tôi muốn tìm nạp tất cả thư trong thư mục Hộp thư đến bằng API được quản lý EWS và lưu trữ chúng dưới dạng .eml. Vấn đề là tìm nạp (1) tất cả thư với (2) tất cả các tiêu đề (như từ, đến, chủ đề) (Tôi đang giữ thông tin về các giá trị from, to và các thuộc tính khác ở nơi khác, vì vậy tôi cần chúng quá) và (3)byte[] EmailMessage.MimeContent.Content. Thật sự tôi đang thiếu hiểu biết vềTìm nạp tất cả thư trong Inbox từ API được quản lý của Exchange Web Services và lưu trữ chúng dưới dạng tệp .eml

  • Microsoft.Exchange.WebServices.Data.ItemView,
  • Microsoft.Exchange.WebServices.Data.BasePropertySet
  • Microsoft.Exchange.WebServices.Data.ItemSchema

thats tại sao tôi đang gặp khó khăn.

đang chính của tôi là:

Khi tôi tạo PropertySet như sau:

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

tôi nhận được sau ngoại lệ:

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

Tôi không hiểu

(1) Những gì các ItemSchemaBasePropertySet

(2) Và làm thế nào chúng ta có nghĩa vụ phải sử dụng chúng

Vì vậy, tôi lấy ra ItemSchema.MimeContent:

PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties); 

tôi đã viết mã sau đơn giản để có được tất cả các thư trong hộp thư đến:

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); 

Tôi đã giữ kích thước trang ItemView đến 50, để truy lại ieve không quá 50 thư tại một thời điểm, và sau đó bù trừ nó bằng 50 để nhận 50 thư tiếp theo nếu có. Tuy nhiên nó đi vào vòng lặp vô hạn và liên tục in Loop trên bảng điều khiển. Vì vậy, tôi phải hiểu được pagesizeoffset sai. Tôi muốn hiểu

(3)pagesize, offsetoffsetbasepoint trong ItemView constructor nghĩa

(4) cách họ cư xử và

(5) làm thế nào để sử dụng chúng để truy xuất tất cả thư trong hộp thư đến

Tôi không tìm thấy bất kỳ bài viết nào trực tuyến giải thích rõ ràng những điều này nhưng chỉ cung cấp mã amples. Sẽ đánh giá cao giải thích câu hỏi khôn ngoan mặc dù nó có thể biến dài.

+0

Làm việc trên nó dài trở lại. Nếu tôi nhớ nó đúng, chúng ta có thể lưu nó chỉ là eml. Tôi đoán bạn muốn biết nếu chúng ta có thể lưu nó dưới dạng msg. Tôi có đúng không? Nếu có, chúng tôi có thể nhận được thông điệp chỉ khi làm việc từ triển vọng bên trong. Tôi không tìm thấy công việc xung quanh để lấy lại msg với EWS. Nhưng không có gì sai với eml, tiêu chuẩn của nó. – Mahesha999

+0

'Làm thế nào để bạn tiết kiệm nó chỉ như eml?' Mã nguồn mảnh về nó ?. Phải, dù sao, bạn nói rằng tôi có thể nhận được *** msg *** CHỈ bên trong * Outlook * (sử dụng Outlook.Application tự động hóa). – Kiquenet

+0

không giúp bạn hoàn toàn. Các trích dẫn để lưu dưới dạng eml có thể tìm thấy ở đây: [1] (https://social.msdn.microsoft.com/Forums/en-US/ba30ebb2-f1c9-4963-9451-932f2710db73/how-to-save-email- to-disk-as-eml-hoặc-msg-trong khi-sử dụng-trao đổi-web-dịch vụ-to-đọc-hộp thư-thư-trong # ae7564c8-ee17-40c9-bfe7-7071bdb411ed), [2] (https://stackoverflow.com/a/6610727/1317018) – Mahesha999

Trả lời

19

EWS hơi không phù hợp với các thuộc tính được trả lại từ các hoạt động khác nhau. Một Item.Bind sẽ không trả lại các thuộc tính giống hệt như một FindItem. Bạn đang sử dụng PropertySets đúng cách như xa như xác định những gì bạn muốn từ máy chủ, nhưng bạn phải sử dụng chúng ở đúng nơi. Những gì bạn cần làm là tìm các mục, sau đó tải các thuộc tính vào chúng. Nó không lý tưởng, nhưng đó là cách EWS hoạt động. Với vòng lặp của bạn, bạn đang không ngừng gán từ 50 đến của bạn bù đắp khi bạn cần phải tăng nó bằng 50. Off đỉnh đầu của tôi, một cái gì đó như thế này sẽ làm:

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); 

Bây giờ bạn có tất cả các mục có tất cả các thuộc tính mà bạn yêu cầu. FindItems thường không trả lại tất cả các thuộc tính mà bạn muốn ngay cả khi bạn yêu cầu chúng, vì vậy chỉ tải Id ban đầu và sau đó tải lên các thuộc tính bạn muốn nói chung là con đường để đi. Bạn cũng có thể muốn tải hàng loạt các thuộc tính theo một cách nào đó tùy thuộc vào số lượng email bạn đang truy xuất, có lẽ trong vòng lặp trước khi thêm chúng vào Danh sách EmailMessages. Bạn cũng có thể xem xét các phương thức khác để nhận các mục, chẳng hạn như một hành động service.SyncFolder.

+0

Liệu nó 'service.LoadPropertiesForItems (findResults, properties);'? – kamaci

+0

'EmailMessage' *** được lưu dưới dạng EML ***? – Kiquenet

Các vấn đề liên quan