Простой ответ Да, это возможно.
Я написал консольную программу для обработки электронной почты в Office365, которую я также взаимодействовал с SQL, так что это определенно можно сделать. Это не обязательно самая легкая вещь в мире, но и не слишком сложная.
Вы можете использовать управляемый API веб-служб Exchange (EWS)
Статья об изложении возможно и документации API https://msdn.microsoft.com/en-us/library/office/dd877012(v=exchg.150).aspx
Местоположение Github, где вы можете найти API (обратите внимание, что эта ссылка находится непосредственно на сайте Microsoft) https://github.com/officedev/ews-managed-api
Ссылка на то, как ссылаться на сборку, содержащую вторую ссылку выше: https://msdn.microsoft.com/en-us/library/office/dn528373(v=exchg.150).aspx
Создать и подключиться к сервису
string emailAddress = '[email protected]';
ExchangeService exService = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
exService.Credentials = new WebCredentials(emailAddress,"password");
вы можете автоматически обнаружить или, если вы знаете URL-адрес, просто установите его таким образом, чтобы 1 из этих строк
exService.AutodiscoverUrl(_emailAddress, delegate { return true; });
exService.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
Найдите папку «Входящие» и папку, в которую нужно переместить файл после обработки:
FolderView folderView = new FolderView(1);
folderView.PropertySet = new PropertySet(BasePropertySet.IdOnly);
folderView.PropertySet.Add(FolderSchema.DisplayName);
folderView.Traversal = FolderTraversal.Deep;
SearchFilter searchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "ProcessedFolderName");
Folder Inbox = Folder.Bind(exService, WellKnownFolderName.Inbox);
FindFoldersResults folderResults = Inbox.FindFolders(searchFilter, folderView);
FolderId processedFolderId = folderResults.Folders[0].Id;
Найдите сообщения, соответствующие вашим критериям:
List<SearchFilter> searchFilterCollection = new List<SearchFilter();
searchFilterCollection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Subject,"Words in Subject"));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(ItemSchema.HasAttachments,true));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.From,new EmailAddress("[email protected]")));
SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And,searchFilterCollection);
ItemView view = new ItemView(50, 0, OffsetBasePoint.Beginning);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.DateTimeReceived, ItemSchema.Attachments);
view.Traversal = ItemTraversal.Shallow;
FindItemsResults<Item> findResults = exService.FindItems(WellKnownFolderName.Inbox,searchFilter,view);
Обработайте результаты и сохраните вложения, когда закончите, переместите сообщение в другую папку, чтобы не импортировать одно и то же.
foreach (Item i in findResults.Items)
{
foreach(FileAttachment attachment in i.Attachments)
{
attachment.Load(@"\\FilePathDirectory\" + attachment.FileName);
}
i.Move(processedFolderId);
}
вы можете расширить решение, протестировав, если вы не получаете результатов, отправляя себе сообщение об ошибке или выдавая ошибку для SSIS, чтобы подобрать и завершить задание. Вполне вероятно, что вы будете перезаписывать файл несколько раз, если у вас есть несколько сообщений для обработки, поэтому вы можете рассмотреть возможность добавления чего-то уникального в имя файла вместо того, чтобы просто использовать одно и то же, но это также создаст другие проблемы в службах SSIS.
во всяком случае, его начало надеюсь, что это поможет.
person
Matt
schedule
21.09.2016