none
Проблема с определением ответа встречи в EWS

    Вопрос

  • Доброго времени суток! 

    Столкнулся с такой проблемой:

    Писал скрипт для отслеживания ответов по приглашениям на встречу, который просматривает почту каждый час.

    Тестировал на почте того же домена один из ящиков которого и отправляет встречу и почтовый агент - outlook.Скрипт правильно отпределяет смену статуса, но если например мобильное устройство (для теста был выбран iphone) , при отправке например согласия статус не меняется.Вот сам код:

    namespace TrackForMeeting
    {
    class TrackForMeeting
    {
        //string ResponseType;
        //string IdItem;
        //string meetingInsert;
        static ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
    
    
    
    //        static string Tracking()
        {
            try
            {
    
                service.Credentials = new WebCredentials("info@somemail.ru", "somepass");
    
                service.AutodiscoverUrl("info@somemail.ru", RedirectionUrlValidationCallback);
    
                var timeZoneInfo = TimeZoneInfo.CreateCustomTimeZone("UTC+3",
                    TimeZoneInfo.Local.BaseUtcOffset, "UTC+3", "UTC+3");
    
                string sql = "SELECT IdItem,StartDate,ResponseType,UpdStatus FROM dbo.RespForMeetings WHERE IsExpir = 0";
    
                string connectionString = @"Data Source=someserv;Initial Catalog=somedb;Integrated Security=True";
    
                string ResponseType;
    
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
    
                    connection.Open();
                    // Создаем объект DataAdapter
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
                    // Создаем объект DataTable
                    DataTable dt = new DataTable();
                    // Заполняем Datatable
                    adapter.Fill(dt);
    
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
    
                        Appointment meeting = Appointment.Bind(service, new ItemId(dt.Rows[i][0].ToString()));
    
                            ResponseType = meeting.RequiredAttendees[0].ResponseType.Value.ToString();
    
                            if (ResponseType != dt.Rows[i][2].ToString())
                            {
                                ExecCommand($"Update dbo.RespForMeetings SET ResponseType = '{ResponseType}',UpdStatus = 1 WHERE IdItem = '{dt.Rows[i][0].ToString()}'", connectionString);
                            }
    
    
                            if (DateTime.Now > DateTime.Parse(dt.Rows[i][1].ToString()))
                            {
                                ExecCommand($"Update dbo.RespForMeetings SET IsExpir = 1 WHERE IdItem ='{dt.Rows[i][0].ToString()}'", connectionString);
    
                                meeting.Delete(DeleteMode.MoveToDeletedItems, SendCancellationsMode.SendToNone);
                            }
    
                    }
                }
    
            }
    
            catch (Exception e) { return e.Message; }
    
            return "";
        }
    
        public static bool RedirectionUrlValidationCallback(string redirectionUrl)
        {
            // The default for the validation callback is to reject the URL.
            bool result = false;
    
            Uri redirectionUri = new Uri(redirectionUrl);
    
            // Validate the contents of the redirection URL. In this simple validation
            // callback, the redirection URL is considered valid if it is using HTTPS
            // to encrypt the authentication credentials. 
            if (redirectionUri.Scheme == "https")
            {
                result = true;
            }
            return result;
        }
    
    
        static string ExecCommand(string queryString, string conn)
        {
    
            using (SqlConnection connection = new SqlConnection(conn))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                command.Connection.Open();
                try
                {
                    command.ExecuteNonQuery();
                    return "";
                }
    
                catch (Exception ex)
                { return ex.ToString(); }
    
            }
        }
    
        static void Main(string[] args)
        {
            Tracking();
    
        }

    буду рад услышать советы, спасибо!

    11 сентября 2017 г. 17:34

Все ответы