2016-09-21 5 views
1

매주 Excel 파일로 이메일을 보내드립니다. 내 목표를 달성하는 데 더 좋은 방법이 있지만 SSIS에서 스크립트 작업을 사용하여 전자 메일을 열고 특정 파일 이름을 첨부 파일로 찾은 다음 해당 파일을 다른 위치로 복사 할 수 있습니까?C#을 사용하여 파일의 전자 메일을 확인하는 방법은 무엇입니까?

다음은 시나리오입니다. 이 엑셀 파일은 저의 팀이 SQL 데이터베이스에 가지고있는 데 중요합니다. 엑셀 소스 제공자는이 엑셀 파일을 일주일에 한 번 이메일로 보내려고합니다. 그런 다음 내 전자 메일을 확인하고 SSIS 데이터 흐름 작업을 가져 와서 SQL 테이블에 삽입 할 수있는 위치로 파일을 복사합니다. 나는 이것을 자동화하고 싶다. 따라서 원래의 방법으로는 불가능한 경우 어떻게 자동화 할 수 있습니까? 별도의 공유 네트워크 위치 사용. 엑셀 파일은 이메일에서만 올 수 있다고 가정합니다. Outlook/Office 365, SSIS, SSMS를 사용하면 DBO 액세스가 가능하며 C#을 사용할 수 있습니다.

나는 이메일에 대해 무지하다는 것을 인정할 것이다. 전자 메일 클라이언트가 실제로이 작업을 수행 할 수있는 절차가 있으면 모든 귀가들 것입니다.

편집 : 내 로컬 컴퓨터에 저장하는 것이 불가능할 수도 있음을 깨닫고 네트워크 드라이브에 액세스 할 수도 있습니다.

+0

SSIS가 전자 메일에서 첨부 파일을 열어서 다운로드 할 수 있다고 생각하지 않지만이 기능이 추가되었으므로 Task Factory를 체크 아웃 할 수 있습니다. http://pragmaticworks.com/Products/Task-Factory –

+1

규칙을 사용하여 달성하는 방법이 있는지 궁금합니다. 최악의 시나리오는 웹 서비스 교환을위한 작은 C# 서비스/앱을 만듭니다. – Charleh

+0

@Charleh 네이티브 규칙이 없지만 오래된이 링크를 기반으로합니다 http://www.pixelchef.net/ content/rule-autosave-attachment-outlook은 그것을 수행 할 규칙을 만드는 VBA 코드가 매우 쉽다는 것을 보여줍니다. 이 경로의 유일한 문제점은 서버 측 규칙이 아니라 데스크탑이기 때문에 이메일을 올바른 시간에 열어야한다는 것입니다. – Matt

답변

2

단순 답변 가능합니다.

필자는 Office365에서 전자 메일을 처리하기위한 콘솔 프로그램을 작성하여 SQL과도 상호 작용하고 있으므로 확실히 수행 할 수 있습니다. 그것은 반드시 세계에서 가장 쉬운 일은 아니지만 너무 어렵지 않습니다.

당신은 그것을 진술에 Exchange 웹 서비스 (EWS)가 API를

제를 관리 사용이 가능하며 당신이 API (이 링크를 참고를 찾을 수 있습니다

Github의 위치는 바로 API 문서 https://msdn.microsoft.com/en-us/library/office/dd877012(v=exchg.150).aspx

형성 마이크로 소프트의 사이트) 위의 두 번째 링크를 포함하는 어셈블리 참조하는 방법에 대한 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; 

당신의 기준을 충족하는 메시지 찾기 :

완료되면 첨부 파일을 저장하고 다른 폴더로 이동하여 동일한 파일을 계속 가져 오지 마십시오.

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