如何使用c#检查邮件文件

本文关键字:文件 检查 何使用 | 更新日期: 2023-09-27 18:08:03

我每周都会收到一封带有excel文件的电子邮件。我知道可能有更好的方法来实现我的目标,但是是否有可能在SSIS中有一个脚本任务,可以打开电子邮件,查找特定的文件名作为附件,然后将该文件复制到另一个位置?

场景如下。这个excel文件对我的团队来说在SQL数据库中是很重要的,并且excel源代码的提供者每周只愿意将这个excel文件通过电子邮件发送给我们一次。然后,我检查我的电子邮件,将文件复制到一个位置,在那里,SSIS数据流任务可以提取它并将其插入到SQL表中。我想把它自动化。所以,如果我最初的方法是不可行的,这怎么可能是自动化的?除了使用共享的网络位置。假设excel文件只能来自电子邮件。使用outlook/office 365, SSIS, SSMS,我有DBO访问权限,并且可以使用c#。

我承认我对这封邮件一无所知。如果有一个程序,电子邮件客户端可以实际执行完成这一点,那么我将洗耳恭听!

编辑:我也可以访问网络驱动器,因为我意识到保存到我的本地机器可能是不可能的。

如何使用c#检查邮件文件

简单回答是有可能的

我已经在Office365上写了一个控制台程序来处理电子邮件,我还与SQL进行了接口,所以它绝对可以完成。它不一定是世界上最容易的事情,但也不太难。

您可以使用Exchange Web Services (EWS) Managed API

关于说明这是可能的文章和API文档https://msdn.microsoft.com/en-us/library/office/dd877012 (v = exchg.150) . aspx

Github的位置,你可以找到API(注意这个链接是直接从微软的网站)https://github.com/officedev/ews-managed-api

关于如何引用包含上面第二个链接的程序集的链接: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就把它设置成下面的一行

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中提出其他挑战。

无论如何,这是一个开始,希望它能有所帮助。