Передача данных электронной почты в базу данных с помощью ews

В настоящее время я работаю над службой Windows, которая собирает электронные письма из почтового ящика с помощью API веб-службы Exchange и передает данные из писем в хранимую процедуру. Затем хранимая процедура добавляет эти данные в таблицу в SSMS. Я протестировал хранимую процедуру вручную, и она работает нормально. У меня также есть метод записи в текстовый файл, и все аспекты электронных писем (получатели, дата, тема и т. д.) Собираются.

Моя проблема в том, что в базу данных передается только последнее электронное письмо из почтового ящика. Ниже мой код:

            int offset = 0;
            int pageSize = 50;
            bool moreEmails = true;
            ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning);

            view.PropertySet = PropertySet.IdOnly;
            FindItemsResults<Item> findResults;
            List<EmailMessage> emails = new List<EmailMessage>();
            findResults = service.FindItems(WellKnownFolderName.Inbox, view);

            while (moreEmails)
            {
                foreach (var item in findResults.Items)
                {
                    emails.Add((EmailMessage)item);
                }

                moreEmails = findResults.MoreAvailable;

                if (moreEmails)
                {
                    view.Offset += pageSize;
                }
            }

            PropertySet properties = (BasePropertySet.FirstClassProperties);
            service.LoadPropertiesForItems(emails, properties);

            foreach (var EmailParam in emails)
            {
                FromEmail = EmailParam.From.ToString();
                EmailDate = EmailParam.DateTimeReceived.ToString("yyyy-MM-dd hh:mm:ss");
                EmailSubject = EmailParam.Subject;
                EmailBody = EmailParam.Body;
                int SourceID = 1;

                foreach (var recipient in EmailParam.ToRecipients)
                {
                    ToEmail += recipient.Address.ToString();
                }

                foreach (var cc in EmailParam.CcRecipients)
                {
                    Emailcc += cc.Address.ToString();
                }

                using (SqlConnection con = new SqlConnection(conStr))
                {
                    con.Open();
                    SqlDataAdapter da = new SqlDataAdapter("mtsp_CreateTicket", con);
                    da.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure;

                    da.SelectCommand.Parameters.AddWithValue("@Date", EmailDate);
                    da.SelectCommand.Parameters.AddWithValue("@FromEmail", FromEmail);
                    da.SelectCommand.Parameters.AddWithValue("@ToEmail", ToEmail);
                    da.SelectCommand.Parameters.AddWithValue("@EmailSubject", EmailSubject);
                    da.SelectCommand.Parameters.AddWithValue("@EmailBody", EmailBody);
                    da.SelectCommand.Parameters.AddWithValue("@Emailcc", Emailcc);
                    da.SelectCommand.Parameters.AddWithValue("@SourceID", SourceID);
                    da.SelectCommand.ExecuteNonQuery();
                }
            }

Я впервые использую службу Windows, и я как бы новичок в этом, поэтому любая помощь очень ценится. Спасибо!

Если в коллекции писем есть несколько записей, возможно, вы получаете исключение и код прерывает цикл? Кстати, вам нужно сбросить переменные ToEmail и Emailcc после закрытия SqlConnection.

stevie_c 10.08.2018 16:12

можешь поставить еще кусок кода? я просто вижу часть, когда вы читаете параметры 1 письма, где сервис? где можно или пока читать все электронные письма?

polzka90 10.08.2018 16:48

@stevie_c Похоже, не возникает никаких исключений. Текстовый файл, в который я пишу, показывает, что все данные собираются. Этот код также находится в try-catch, и здесь нет никаких исключений. Более того, я предполагал, что установка ToEmail и Emailcc в цикле foreach будет сбрасываться для каждой итерации?

SeptimVII 10.08.2018 16:50

@ polzka90 Я добавил код, показывающий, как я собираю входящие электронные письма.

SeptimVII 10.08.2018 16:52

вы пытаетесь поместить журнал перед этой строкой PropertySet properties = (BasePropertySet.FirstClassProperties); чтобы увидеть, заполнен ли список всеми электронными письмами?

polzka90 10.08.2018 17:22

Я бы попробовал пару вещей, чтобы отладить это. Во-первых, я бы запустил Sql Server Profiler, чтобы точно понимать, что отправляется в базу данных. Во-вторых, я бы удалил блок try / catch на случай, если он поглотит ваше исключение.

stevie_c 10.08.2018 17:43

Поскольку вы используете оператор + = в ToEmail и Emailcc, эти переменные будут продолжать расти на каждой итерации вокруг переменной «email».

stevie_c 10.08.2018 17:46

@stevie_c Замена оператора "+ =" на оператор "=" сработала! Спасибо!

SeptimVII 10.08.2018 17:58

Большой. Просто убедитесь, что вы по-прежнему храните все адреса электронной почты для каждого электронного письма. В качестве улучшения вашего кода вы можете разделить обязанности метода на отдельные классы, а затем вы можете использовать некоторые модульные тесты, чтобы проверить, что поведение такое, как вы ожидаете. Взгляните на примеры принципов SOLID и TDD в Интернете.

stevie_c 13.08.2018 13:57
0
9
44
0

Другие вопросы по теме