2016-01-22 1 views
0

Мне очень интересно. Я новый найм, и я работаю над приложением, которое вызовет MS 365 api и сканирует нужный почтовый ящик. Моя цель - отфильтровать любые письма с вложениями, получить имя отправителя, тему отправителя и, наконец, вложение. Это консольное приложение, которое будет работать на сервере, поэтому из того, что я понимаю, для достижения наилучшей производительности структура C# - это путь. Вот где я застрял. Я построил свою структуру с соответствующими свойствами, которые мне нужны. Как ни странно, я устанавливаю свойство байтового массива (я этого никогда не делал). Затем в моей функции я вызываю api, а затем создаю список своей структуры, чтобы добавить каждое электронное письмо в качестве объекта, который, как я считаю, улучшит производительность. Теперь я могу получить отправителя электронной почты и не подвергаться никаким проблемам, потому что это строки. Но теперь, как я могу получить вложение, чтобы сделать это полный объект электронной почты в памяти. Это фрагмент моего кода.Получение вложения электронной почты в структуру C#

Struct:

struct Emailed_Expenses 
{ 
    private string sender; 
    private string subject; 
    private byte [] attachment;   

    public string Email_Sender 
    { 
     get 
     { 
      return sender; 
     } 
     set 
     { 
      sender = value; 
     } 
    } 
    public string Email_Subject 
    { 
     get 
     { 
      return subject; 
     } 
     set 
     { 
      subject = value; 
     } 
    } 
    public byte[] Email_Attachment 
    { 
     get 
     { 
      return attachment; 
     } 
     set 
     { 
      attachment = value; 
     } 
    } 
} 

электронной гусеничный

 public static List<Emailed_Expenses> Get_Star_Mailbox() 
    { 
     //var star_user = "*******@dell.com"; 
     OutlookServicesClient star_Mail_Box = Start_OutLook_Services(); 
     List<Emailed_Expenses> star_Inbox = new List<Emailed_Expenses>(); 

     try 
     { 

      var Email_Box = star_Mail_Box.Users["******@dell.com"].Messages.ExecuteAsync().Result; 

      var messages = Email_Box.CurrentPage; 
      //var messages = star_Mail_Box.Me.Folders["Inbox"].Messages.OrderByDescending(m => m.DateTimeReceived).Take(10).ExecuteAsync(); 

      foreach (var message in messages) 
      { 
       if (message.Attachments.CurrentPage.Count > 0) 
       { 
        Emailed_Expenses email = new Emailed_Expenses 
        { 
         Email_Sender = message.Sender.ToString(), 
         Email_Subject = message.Subject.ToString(), 
         >>>>>>>>Email_Attachment = byte [message.Attachments],<<<<< this is what I am talking about !!!!***** 
        }; 

        star_Inbox.Add(email); 
       } 

      } 
     } 

я теперь это может показаться немного наивным, но я работаю над этим в течение около 11 часов, и я не нашел ни одного примеры на линии, которые могут помочь мне приложить привязанность к моей структуре.

Основная цель: Я хотел бы прочитать вложение электронной почты в мою структуру.

+1

Я могу сказать вам, что ваша структура неверна, я никогда не работаю с этим API, но одно письмо может иметь несколько вложений. Таким образом, вы должны иметь в своем классе List свойство. Также вам нужно иметь отдельные вложения классов, в которых у вас есть идентификатор свойств (по крайней мере, я помню, что у них были идентификаторы), имя и контент, которые будут байтами []. В вашем коде сообщения. Приложения должны содержать все вложенные вложения. Вот что я думаю. – mybirthname

+0

Вы правы, когда указали, что несколько приложений, я был очень слеп к этому спасибо.Не могли бы вы немного объяснить класс приложения, пожалуйста. Извините, если я беспокоюсь, но это ново для меня тоже, но две головы лучше, чем одна. – EasyE

+0

Вы должны закодировать все сообщения. В message.Attachments [0] у вас должны быть свойства Name, ID (возможно) или что-то вроде контента. Ваш класс Attachment должен иметь структуру ID-> string (возможно, guid guid, как я уже сказал, я не знаю API), Name-> string, Content-> byte []. Закрепите вложения, сохраняя данные в своем классе вложения, после этого добавьте вложение в свой список в свой почтовый класс. – mybirthname

ответ

1

Во-первых, есть 2 типа вложений, которые могут быть в сообщении: ItemAttachments и FileAttachments. ItemAttachments - это другие объекты Outlook (сообщения, события и т. Д.), Которые прилагаются. Для них вы получаете объект типа вложения, поэтому у вас не будет бинарных данных для работы. Поэтому я предполагаю, что вы только заботитесь о FileAttachments.

Как сказано в комментарии mybirthname, вам нужно пройти через каждое из вложений. Если это FileAttachment, вы можете использовать свойство ContentBytes для получения байтового массива вложения. Вот что я думаю, что это будет выглядеть, если вы изменить Email_Attachment к List<>, который может содержать все вложения:

foreach (var message in messages) 
{ 
    Emailed_Expenses email = null; 

    foreach (var attachment in message.Attachments.CurrentPage) 
    { 
     FileAttachment file = attachment as FileAttachment; 
     if (file != null) 
     { 
      if (email == null) 
      { 
       email = new Emailed_Expenses 
       { 
        Email_Sender = message.Sender.ToString(), 
        Email_Subject = message.Subject, 
        Email_Attachment = new List<byte[]> 
       }; 
      } 

      email.Email_Attachment.Add(file.ContentBytes); 
     } 
    } 

    if (file != null) 
    { 
     star_Inbox.Add(email); 
    } 
} 

Это у верхней части моей головы и тестировался, так что он может иметь некоторые ошибки, но Я думаю, это должно дать вам общую идею. Также обратите внимание, что я удалил вызов .ToString() по адресу message.Subject, так как Subject уже является строкой. Я также не уверен, что вызов .ToString() на message.Sender будет выглядеть точно. Если вы уже знаете, что дает вам то, что вы хотите, то здорово! Но вам, возможно, потребуется перейти к message.Sender.EmailAddress.Name или message.Sender.EmailAddress.Address, если это необходимо.

Насколько это было бы лучше как структура или класс, это действительно зависит от того, как оно будет использоваться в остальной части приложения. Кажется, что каждый экземпляр будет достаточно большим, что обычно не требуется для структур. Однако это руководство, а не жесткое правило. То, как он используется, является гораздо лучшим фактором, определяющим, должен ли он быть классом или структурой.

 Смежные вопросы

  • Нет связанных вопросов^_^