C # MS Exchange Mover Email Para Pasta

Adicionado: graças ao usuário @grapkulec, estou usando

using Microsoft.Exchange.WebServices.Data; 

Eu estou tentando mover um email para uma pasta que eu já criei no Outlook (usando o MS Exchange). Até agora, consegui mover o email para os rascunhos ou outro nome de pasta conhecido, mas não tive sucesso em movê-lo para uma pasta que criei chamada “Exemplo”.

 foreach (Item email in findResults.Items) email.Move(WellKnownFolderName.Drafts); 

O código acima funciona; mas eu não quero usar as pastas conhecidas. E, se eu tentar mudar o código para algo como:

 email.Move(Folder.(Example)); 

ou

 email.Move(Folder.["Example"]); 

Não se move (em ambos os casos, lança um erro). Eu encontrei toneladas de exemplos de como mover e-mails em pastas no MSDN, SO e C # geral – mas apenas de pastas que são “bem conhecidas” para o Outlook (rascunhos, lixo eletrônico, etc), que não funciona com um pasta que eu criei.

Resolvido!

O comando de movimentação falhou, independentemente de várias tentativas, porque o ID foi mal formado. Aparentemente, uma operação de movimentação não permite o uso de nomes. Eu tinha tentado DisplayName como um identificador e é isso que ficava me jogando fora. Finalmente, desisti do DisplayName, o que teria ajudado. Em vez disso, apontei para o ID (que parou o erro “ID malformado”) armazenando-o em uma variável e o movimento funcionou.

Código:

  Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot); rootfolder.Load(); foreach (Folder folder in rootfolder.FindFolders(new FolderView(100))) { // Finds the emails in a certain folder, in this case the Junk Email FindItemsResults findResults = service.FindItems(WellKnownFolderName.JunkEmail, new ItemView(10)); // This IF limits what folder the program will seek if (folder.DisplayName == "Example") { // Trust me, the ID is a pain if you want to manually copy and paste it. This stores it in a variable var fid = folder.Id; Console.WriteLine(fid); foreach (Item item in findResults.Items) { // Load the email, move the email into the id. Note that MOVE needs a valid ID, which is why storing the ID in a variable works easily. item.Load(); item.Move(fid); } } } 

Parece que você está usando o EWS Managed API, então aqui está minha resposta como eu faço essas coisas.

O método Mover nos itens pode aceitar WellKnownFolderName ou o ID da pasta. Se eu entendi corretamente, você deseja mover seu e-mail para a pasta chamada “Exemplo”. Então, primeiro você precisa obter o object de pasta para esta pasta:

 var filter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Example"); var view = new FolderView(1) { PropertySet = new PropertySet(BasePropertySet.FirstClassProperties) }; var findFoldersResults = exService.FindFolders(filter, view); folder = findFoldersResults.FirstOrDefault(f => f.DisplayName.Equals("Example", StringComparison.OrdinalIgnoreCase)); 

Agora você deve ter sua variável de pasta “Example” e pode passar seu id para o método Move de um email. Para mais detalhes, consulte as páginas do msdn sobre como trabalhar com o EWS Managed API, exemplos de uso simples e básicos.

BTW: WellKnownFolderNames enum é um tipo de conveniência para as pastas mais comuns do Exchange, como Caixa de Entrada, Itens Enviados, etc. Qualquer outra coisa que você precisa recuperar por conta própria pesquisando uma binding ou apenas no caso de quaisquer outros objects do Exchange.

Com base nessas respostas, criou um método de trabalho para mover para pastas, pode ser útil para alguém:

 ///  /// Moves the email to the specified folder. ///  /// Email message to move. /// Display name of the folder. public void MoveToFolder(EmailMessage mail, string folderName) { Folder rootfolder = Folder.Bind(_exchangeService, WellKnownFolderName.MsgFolderRoot); rootfolder.Load(); Folder foundFolder = rootfolder.FindFolders(new FolderView(100)).FirstOrDefault(x => x.DisplayName == folderName); if (foundFolder == default(Folder)) { throw new DirectoryNotFoundException(string.Format("Could not find folder {0}.", folderName)); } mail.Move(foundFolder.Id); }