2016-09-21 10 views
1

毎週Excelファイルを添付したメールが届きます。私はおそらく私の目標を達成するためのよりよい方法があると知っていますが、電子メールを開き、特定のファイル名を添付ファイルとして探し出し、そのファイルを別の場所にコピーできるSSISのスクリプトタスクを持つことは可能でしょうか?C#を使用してファイルの電子メールをチェックする方法は?

ここにシナリオがあります。このExcelファイルは、私のチームがSQLデータベースに置くために重要です.Excelソースのプロバイダは、このExcelファイルを1週間に1回メールでお送りします。私は電子メールをチェックし、SSISデータフロータスクがそれを取り出してSQLテーブルに挿入できる場所にファイルをコピーします。私はこれを自動化したいと思います。だから私の元のアプローチが実行不可能な場合、どうすればこれを自動化できますか?共有されたネットワークの場所を使用することを除いて。エクセルファイルは電子メールからのみ得られると仮定します。 Outlook/Office 365、SSIS、SSMSを使用して、私はDBOアクセス権を持ち、C#を使用できます。

私はメールに無知だと認めます。電子メールクライアントがこれを達成するために実際に実行できる手続きがあれば、私はすべての耳になるでしょう!

編集:私は自分のローカルマシンに保存することが不可能かもしれないことに気付いたので、ネットワークドライブにアクセスしています。

+0

SSISが電子メールから添付ファイルを開いたりダウンロードしたりすることはできませんが、この機能が追加されているため、タスクファクトリをチェックアウトすることができます。http://pragmaticworks.com/Products/Task-Factory –

+1

これを達成するためにルールを使用する方法があるかどうかを知る。最悪のシナリオでは、Webサービスを交換するための小さなC#サービス/アプリケーションを作成します。 – Charleh

+0

@Charlehこれを行うネイティブルールはありませんが、期限切れの可能性があるこのリンクに基づいています。http://www.pixelchef.net/ content/rule-autosave-attachment-outlookは、それを行うルールを作成するためのVBAコードがかなり簡単であることを示しています。このルートの唯一の問題は、サーバー側のルールではなくデスクトップであるため、メールを正しい時刻に開く必要があることです。 – Matt

答えて

2

簡易回答はい可能です。

Office365で電子メールを処理するためのコンソールプログラムを作成していましたが、これはSQLとのインターフェイスでもあったため、間違いなく実行できます。必ずしも世界で最も簡単なものではありませんが、それほど難しいことでもありません。

あなたは、Exchange Webサービスを使用することができます(EWS)を明記のAPIを管理

条が可能であり、APIドキュメント https://msdn.microsoft.com/en-us/library/office/dd877012(v=exchg.150).aspx

あなたがAPIを見つけることができますGitHubの場所は、(このリンクを注意し、直接でありますMicrosoftのサイトを形成)上記第2のリンクが含まれているアセンブリを参照する方法について https://github.com/officedev/ews-managed-api

リンク: https://msdn.microsoft.com/en-us/library/office/dn528373(v=exchg.150).aspx

あなたが自動検出したり、URLを知っている場合だけにファイルを移動するために、あなたの受信トレイ&フォルダを探すので、これらのラインの1

exService.AutodiscoverUrl(_emailAddress, delegate { return true; }); 
exService.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx"); 

それを設定することができます

string emailAddress = '[email protected]'; 
ExchangeService exService = new ExchangeService(ExchangeVersion.Exchange2013_SP1); 
exService.Credentials = new WebCredentials(emailAddress,"password"); 

の保守の作成と接続処理された後:

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; 

ことはあなたの基準を満たしたメッセージを探す:

完了時に結果を処理し、添付ファイルを保存して、メッセージを別のフォルダに移動して、同じものをインポートしないようにします。

foreach (Item i in findResults.Items) 
{ 
    foreach(FileAttachment attachment in i.Attachments) 
    { 
     attachment.Load(@"\\FilePathDirectory\" + attachment.FileName); 
    } 

    i.Move(processedFolderId); 
} 

あなたは何の結果が自分自身にエラーメッセージを送信したり、ピックアップにSSISのエラーを投げて、ジョブを失敗し得れば、あなたがテストしてソリューションを展開することができます。処理するメッセージが複数ある場合は、ファイルを複数回上書きする可能性があります。そのため、同じものを使用するのではなくファイル名に固有のものを追加することを検討することもできますが、SSISでも同様の問題が発生します。

とにかく、それが役立つことを願っています。

+0

これは単なるスタート以上のものです!方向性に感謝します。 – user3486773

+0

あなたの歓迎私は古いソリューションについて興味があるので、それを掘り起こして読んだ。 – Matt

+0

興味深いことに、私はバックアップアラートのために電子メールボックスをスキャンするのと同じ種類のものを使用しています(複数のクライアントのバックアップアラートを管理するため)。私がオン・プレミア交換からO365に切り替えた時でさえ、 – Charleh

関連する問題