1

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

これがシナリオです。この Excel ファイルは、私のチームにとって SQL データベースに含めることが重要であり、Excel ソースのプロバイダーは、この Excel ファイルを 1 週間に 1 回だけ電子メールで送信してくれます。次に、電子メールを確認し、ファイルを SSIS データフロー タスクが取得して SQL テーブルに挿入できる場所にコピーします。これを自動化したい。私の元のアプローチが実行できない場合、他にどのように自動化できますか? 共有ネットワークの場所を使用する以外に。Excel ファイルは電子メールからのみ取得できると仮定します。Outlook/Office 365、SSIS、SSMS を使用して、DBO アクセス権があり、c# を使用できます。

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

編集:ローカルマシンへの保存が不可能な場合があるため、ネットワークドライブにもアクセスできます。

4

1 に答える 1

2

簡単な答え はい、可能です。

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 にも他の課題をもたらします。

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

于 2016-09-21T17:04:26.900 に答える