簡単な答え はい、可能です。
Office365 でメールを処理するためのコンソール プログラムを作成し、SQL ともインターフェイスしていたので、間違いなく実行できます。必ずしも世界で最も簡単なことではありませんが、難しすぎることもありません。
Exchange Web サービス (EWS) マネージ API を使用できます
それが可能であると述べている記事と API ドキュメント
https://msdn.microsoft.com/en-us/library/office/dd877012(v=exchg.150).aspx
API を見つけることができる Github の場所 (このリンクは Microsoft のサイトから直接作成されていることに注意してください)
https://github.com/officedev/ews-managed-api
上記の 2 番目のリンクを含むアセンブリを参照する方法に関するリンク:
https://msdn.microsoft.com/en-us/library/office/dn528373(v=exchg.150).aspx
サービスの作成と接続
string emailAddress = 'YourEmail@Domain.com';
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("From@SendersDomain.com")));
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 にも他の課題をもたらします。
とにかく、それが役立つことを願っています。