2016-01-14 1 views
2

Я разработал метод, который успешно загружает вложения электронной почты на локальный компьютер.
И я должен загрузить их из электронной почты прямо на ftp-сервер.
Я попытался реализовать функциональность, о которой я думал, должен работать.
Как я успешно получил объект FileAttachment, я попытался использовать его свойство ContentLocation, чтобы получить URL-адрес вложения
И затем передаю этот URL-адрес методу webClient.DownloadString().
Но, к сожалению, свойство ContentLocation всегда равно нулю.
Итак, у меня есть исключение в этой строке кода.
Вот полный список моего метода с комментариями:Загрузить приложение из электронной почты прямо на ftp-сервер

var service = new ExchangeService(ExchangeVersion.Exchange2013); 
    service.Credentials = new NetworkCredential(serviceUserName, servicePassword); 

    service.Url = new Uri(serviceUrl); 
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
    var path = System.IO.Directory.CreateDirectory(Path.Combine(applicationPath, name)); 

    //Filters 
    List<SearchFilter> searchANDFilterCollection = new List<SearchFilter>(); 
    searchANDFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
    searchANDFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.From, new EmailAddress(email))); 
    SearchFilter sf = 
     new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchANDFilterCollection.ToArray()); 
    FindItemsResults<Item> findResults; 
    ItemView view = new ItemView(10); 
    do 
    { 
     findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view); 
     if (findResults != null && findResults.Items != null && findResults.Items.Count > 0) 
      foreach (EmailMessage item in findResults) 
      { 
       var message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments)); 
       foreach (Attachment attachment in message.Attachments) 
       { 
        if (attachment is FileAttachment) 
        { 
         if (attachment.Name.Contains(".xlsx") || attachment.Name.Contains(".xlsb") || attachment.Name.Contains(".xls") || attachment.Name.Contains(".csv")) 
         { 
          var fileAttachment = attachment as FileAttachment; 

          //Download to ftp 
          if (isSaveToFTP) 
          { 
           var webClient = new WebClient(); 
           string readHtml = webClient.DownloadString(fileAttachment.ContentLocation); 
           byte[] buffer = Encoding.Default.GetBytes(readHtml); 

           WebRequest makeDirectory = WebRequest.Create(Path.Combine(ftpAddress, name)); 
           makeDirectory.Method = WebRequestMethods.Ftp.MakeDirectory; 
           makeDirectory.Credentials = new NetworkCredential(username, password); 
           WebRequest uploadFile = WebRequest.Create(ftpAddress + name + "/" + fileAttachment.Name); 
           uploadFile.Method = WebRequestMethods.Ftp.UploadFile; 
           uploadFile.Credentials = new NetworkCredential(username, password); 
           Stream reqStream = uploadFile.GetRequestStream(); 
           reqStream.Write(buffer, 0, buffer.Length); 
           reqStream.Close(); 
          } 
          //Download to pc 
          else fileAttachment.Load(String.Format(@"{0}\{1}", path, fileAttachment.Name)); 
         } 
        } 
        //fileAttachment.Load(path.Name); 
       } 
      } 


     // mark email as read 
     item.IsRead = true; 
     item.Update(ConflictResolutionMode.AlwaysOverwrite); 
     } 
    } 
    while (findResults.MoreAvailable); 

Что я должен изменить, чтобы получить эту работу?
Или есть ли другое решение?

ответ

2

Я думаю, что ContentLocation зависит от создателя сообщения. Я думаю, что вы хотите вместо этого использовать Load(Stream), чтобы вытащить содержимое в поток, а затем выберите, где писать этот поток, основанный на флаге isSaveToFTP.

+0

Спасибо, это работает –

1

Вот решение, основанное на ответ richrdsonmarkj в:

if (isSaveToFTP) 
     { 
      using (WebClient webClient = new WebClient()) 
      { 
       Stream stream = new MemoryStream(); 
       fileAttachment.Load(stream); 
       using (var reader = new StreamReader(stream)) 
       { 
        byte[] buffer = Encoding.Default.GetBytes(reader.ReadToEnd()); 
        WebRequest uploadFile = WebRequest.Create(ftpAddress + name + "/" + fileAttachment.Name); 
        uploadFile.Method = WebRequestMethods.Ftp.UploadFile; 
        uploadFile.Credentials = new NetworkCredential(username, password); 
        Stream reqStream = uploadFile.GetRequestStream(); 
        reqStream.Write(buffer, 0, buffer.Length); 
        reqStream.Close(); 
       } 
      } 

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

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