Downloading Attachment from Exchange Server using SSIS package deployed on another Server

浪尽此生 提交于 2019-12-24 19:19:17

问题


I have built an SSIS package which reads CSV from certain folder. But now I need to download same csv from exchange server.Also Outlook is not installed on my machine. Will I be able to download CSV from exchange server and how ? Thanks!


回答1:


I have used some of the code from the link http://sqlandbilearning.blogspot.com.au/2014/07/download-email-attachment-using-ssis.html but i have added some new code for removing TCP binding error using ServicePointManager as well as added search filter for retrieving specific emails and this code also takes care of multiple attachment from different emails to be saved on file system.

public void Main()
        {
            string filePath = "";
            string fileName = "";
            List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
            DateTime now = DateTime.Now;
            DateTime beginRecievedTime = new DateTime(now.Year, now.Month, now.Day, 7, 55, 0);
            DateTime finishRecievedTime = new DateTime(now.Year, now.Month, now.Day, 8, 15, 0);
            EmailMessage latestEmail = null;

            try
            {
                ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;

                ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
                service.UseDefaultCredentials = true;
                //service.Credentials = new WebCredentials("username", "password");

                service.Url = new Uri("");


                //  10 mails per page in DESC order
                ItemView view = new ItemView(10);
                view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
                searchFilterCollection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Subject, "Scheduled search"));
                SearchFilter greaterthanfilter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, beginRecievedTime);
                searchFilterCollection.Add(greaterthanfilter);
                SearchFilter lessthanfilter = new SearchFilter.IsLessThan(ItemSchema.DateTimeReceived, finishRecievedTime);
                searchFilterCollection.Add(lessthanfilter);
                SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection);
                //Find mails
                FindItemsResults<Item> fir = service.FindItems(WellKnownFolderName.Inbox, filter, view);
                Dictionary<EmailMessage, string> emailsMap = new Dictionary<EmailMessage, string>();
                foreach (Item item in fir.Items)
                {
                    item.Load(); //Load the entire message with attachment
                    EmailMessage email = item as EmailMessage;
                    if (email != null)
                    {
                        if (email.HasAttachments == true && email.Attachments.Count == 1)
                        {
                            if (email.Subject.StartsWith("Scheduled search") == true)
                            {
                                filePath = Path.Combine(Dts.Variables["User::SourceFolderPath"].Value.ToString()
                                                        , email.DateTimeReceived.Date.ToString("MM.dd.yyyy") + "_" +
                                                        email.Attachments[0].Name);
                                // fileName = email.DateTimeReceived.Date.ToString("MM.dd.yyyy") + "_" +
                                //   email.Attachments[0].Name.ToString();
                                emailsMap.Add(email, filePath);
                            }
                        }
                    }
                }

                if (emailsMap.Count > 0) {
                    foreach (var item in emailsMap) {
                        //Save attachment
                        EmailMessage email = item.Key;
                        filePath = item.Value;
                            FileAttachment fileAttachment = email.Attachments[0] as FileAttachment;
                            fileAttachment.Load(filePath);
                        string extractPath = Dts.Variables["User::SourceFolderPath"].Value.ToString() + "\\" + email.Attachments[0].Name;
                        System.IO.Compression.ZipFile.ExtractToDirectory(filePath, extractPath);
                        fileName = Dts.Variables["User::SourceFolderPath"].Value.ToString() + "\\" + email.DateTimeReceived.Date.ToString("MM.dd.yyyy") + "_" +
                          email.Attachments[0].Name.ToString();
                        if (File.Exists(fileName))
                        {
                            File.Delete(fileName);
                        }
                    }
            }

               // Dts.Variables["User::SourceFileName"].Value = fileName;

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch(System.Runtime.InteropServices.COMException ex)
            {
                if (Dts.Variables.Locked == true)
                {
                    Dts.Variables.Unlock();
                }
                //An error occurred.
                Dts.Events.FireError(0, "Error occured", ex.Message, String.Empty, 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }


来源:https://stackoverflow.com/questions/44935578/downloading-attachment-from-exchange-server-using-ssis-package-deployed-on-anoth

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!