C# интеграция Dropbox и Exchange пример

C# интеграция Dropbox и Exchange пример

Sherif KenawyTechnical Leave a Comment

1. Введение

1.1 Введение

Мы решили написать небольшой блог для любых разработчиков C#, которые хотели бы разработать интеграционное решение между такими системами, как Dropbox, Exchange и многими другими. Мы создали пример короткого приложения, которое служит в качестве демонстрации того, как простая такая интеграция может быть осуществлена с использованием Connect Bridge платформа.

1.2 Предпосылки

Вы можете просканировать статью, чтобы понять концепцию платформы Connect Bridge. Более того, мы также предоставляем по запросу бесплатную пробную лицензию программы на тот случай, если вы захотите поиграть с ней самостоятельно.

2. Требования к сценарию

Сценарий интеграции, требуемый здесь, заключается в следующем создайте резервную копию вложений электронной почты обмена в папку Dropbox. Может быть полезно иметь резервную копию, или свести к минимуму использование обмена, или по каким-то другим причинам.

3. Базовый документооборот

Независимо от того, какое интеграционное решение вам необходимо внедрить, есть три основных простых шага, которые вам необходимо выполнить. Эти шаги описаны ниже.

3.1 Настройка анализатора запросов CB

Первый шаг - убедиться, что вы можете подключиться к целевой системе (Exchange и Dropbox в нашем сценарии); проще всего это сделать с помощью CB Query Analyzer. Здесь я уже настроил свой сервер ConnectBridge с помощью инструмента администрирования для подключения к MS Exchange 365 и к Dropbox, создав необходимые группы и пользователей. Я создал имя пользователя под названием "martin"с паролем1234”. Этот пользователь имеет права на подключение к Exchange365 и Dropbox. Теперь из Query Analyzer я создам 2 подключения к каждой целевой системе и гарантирую, что смогу успешно подключиться.

Пример Exchange

Рисунок 1: Администрирование аккаунтов

Dropbox и Exchange

Рисунок 2: Администрирование групп и пользователей

Dropbox и Exchange

Рисунок 3: Подключения анализатора запросов

3.2 Проверьте свои показания

Как показано выше, мы имеем успешную конфигурацию и подключение к обеим целевым системам. Теперь мы можем проверить наши утверждения.

3.2.1. Загрузка вложений с Exchange

На моем счету обмена у меня есть пара электронных писем, всего 3 письма, которые имеют вложения, как показано ниже.

Рисунок 4: Exchange Электронная почта

Dropbox и Exchange

Чтобы загрузить вложения из обмена, нам необходимо выполнить 3 шага:

1. Получить список идентификаторов электронной почты с вложениями:
Выполнение нижеприведенного утверждения должно дать нам 3 ID, так как у нас есть только 3 сообщения с вложениями, как показано на рисунке 4 выше. Для тестирования я возьму ID письма с 2 вложениями и получу список вложений в следующем шаге.

ВЫБЕРИТЕ идентификатор из сообщения, ГДЕ НАСТОЯЩИЙ = true;

На рисунке 5 ниже показан результат выполнения вышеуказанного утверждения.

2. Получить список вложений из каждого письма:

Выполнение нижеследующего утверждения должно дать нам 2 строки, одна для readme.txt и одна для logo.jpg, как показано на рисунке 4 выше. Каждое вложение будет иметь поле под названием адрес, которое будет использоваться в следующем шаге для загрузки вложения

EXEC SP_SELECT_ATTACHMENTS 'AAMKADljZGY4ZjYzLWY2MDUtN............';

На рисунке 6 ниже показан результат выполнения вышеуказанного утверждения.

3. Возьми насадки:
Теперь я скачаю вложение log.jpg, используя его адрес, который я получил с предыдущего шага.

EXEC SP_SAVE_ATTACHMENT 'AAMKADljZGY4ZjYzLWY2MDUtNDBjOC0.......';

На рисунке 7 ниже показан результат выполнения вышеуказанного утверждения.

Примечание: мы использовали таблицу и 2 хранимые процедуры, предлагаемые коннектором Exchange, для получения более подробной информации о таблицах и хранимых процедурах, предлагаемых коннектором, пожалуйста, обратитесь к ".Exchange Разъем Ссылка"Документ.

Image

Рисунок 5: Получить список почтовых ID с вложениями

Dropbox и Exchange

Рисунок 6: Получить список вложений из электронного письма

Dropbox и Exchange

Рисунок 7: Получить вложение

3.2.2 Загрузка файла в Dropbox

Это один прямой шаг. Чтобы загрузить файл в Dropbox, мы выполним хранимую процедуру "SP_UPLOADFILE", которая вызывает необходимые API на Dropbox для загрузки файла. Для простоты мы собираемся загрузить текстовый файл.

SP_UPLOADFILE:

EXEC SP_UPLOADFILE '@path', '@filename', '@content';

Вышеуказанная хранимая процедура ожидает содержимое файла в байтах.
Я хотел бы загрузить текстовый файл под названием "first.txt"в корневую директорию Dropbox. Содержимое файла будет "Hello World"; по согласованию мы должны преобразовать это сообщение "Hello World" в байты с помощью вашего собственного кода или любого он-лайн конвертера.

EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';

Примечание: Для получения дополнительной информации о таблицах и хранимых процедурах, предлагаемых разъемом Dropbox, пожалуйста, обратитесь к ".Ссылка на разъем Dropbox"Документ.

На рисунках 8 и 9 ниже показаны выполнение и вывод вышеописанной хранимой процедуры.

Dropbox и Exchange

Рисунок 8: Загрузка файла в Dropbox

Image

Рисунок 9: Загруженный файл

3.3 Копирование связи и заявлений

Теперь мы знаем, что можем загружать вложения с Exchange, а также знаем, что можем загружать документы в Dropbox. Мы также протестировали наши SQL заявления. Теперь нам нужно скопировать строку соединения из Query Analyzer и протестированные операторы в наше приложение C#.

Чтобы скопировать соединение из анализатора запросов, нам нужно просто щелкнуть правой кнопкой мыши на соединении, нажать Edit и перейти в закладку Advanced, а затем скопировать оттуда текст, как показано ниже на рисунке 10.

Рисунок 10: Копирование строки соединения из анализатора запросов

Dropbox и Exchange

Вот мои соединительные строки для обеих целевых систем.

1ТП23Т

Driver={Media Gateway ODBC Driver};импл='CORBA';host='localhost';port='8087'';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234''

Деппбокс

Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234''.

Теперь мы готовы открыть visual studio.net и приступить к реализации нашего интеграционного решения C#.

4. Прохождение решения

4.1 Создание нового приложения C#

Достаточно создать простое консольное приложение. Наше решение не требует никаких внешних ссылок или установки пакетов сторонних производителей. Решение основано на ODBC, поэтому нам просто нужно импортировать необходимые пространства имен в наш класс.

используя System.Data;
используя System.Data.Odbc;

4.2 Создание и открытие соединения с Exchange

1. Укажите строку соединения

string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234''";

2. Создайте и откройте соединение:

используя (OdbcConnection connection = новое OdbcConnection(connectionString))
{
    соединение. Open();
    …………………………
}

4.3 Загрузка вложений с Exchange

1. Скачайте IDs писем Exchange с прикрепленными к DataTable "messageIDs". Мы будем использовать DataAdapter "messagesAdapter" для подключения и скачивания IDs.

используя (OdbcDataAdapter messagesAdapter = новый OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", соединение))).
{
    messagesAdapter.Fill(messageIDs);
}

2. Для каждого почтового ID в таблице "Идентификаторы сообщений" мы получим список вложений "только информация" и сохраним их в другую DataTable "documentsListTable". Мы будем использовать другой DataAdapter "documentsListAdapter", чтобы получить этот список вложений.

передний край (DataRow messageIDRow в messageIDs.Rows).
{
     string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';",
                             messageIDRow["ID"]);
     используя (OdbcDataAdapter documentsListAdapter = новый OdbcDataAdapter
                                                  (sqlQueryString, соединение))
            documentsListAdapter.Fill(documentsListTable);
}

3. Для каждого вложения в "documentsListTable" мы получим адрес и используем его для получения действительного вложения, а затем добавим это вложение в третью таблицу "documentsTable". Для получения вложений/документов мы будем использовать другой DataAdapter "documentsAdapter".

foreach (DataRow документInfoRow в документахListTable.Rows)
{
    string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';",
                            документInfoRow["Адрес"]);
    using (documentsAdapter = новый OdbcDataAdapter(sqlQueryString, соединение))
          документыАдаптер.заполнение(документыТаблица);
}

4. Для каждого успешно загруженного прикрепленного файла при обмене отображается сообщение пользователю с именем файла прикрепленного файла.

foreach (DataRow documentRow в документахTable.Rows)
    Console.WriteLine(string.Format("{0} downloaded!"),
                                    документRow["OutFileName"]));

4.4 Закрыть соединение с 1ТП23Т.

если (connection.State == ConnectionState.Open)
        соединение. Закрыть();

4.5 Создание и открытие соединения с Dropbox

1. Укажите строку соединения

string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234''";

2. Создайте и откройте соединение:

используя (OdbcConnection connection = новое OdbcConnection(connectionString))
{
    соединение. Open();
    …………………………
}

4.6 Загрузка вложений в Dropbox

Для каждого файла вложения в "documentsTable"мы получим имя файла"Имя аутФайла"и содержимое файлаOutBuffer"и сохранить файл в корне папки "/".

Нам не нужен новый DataAdapter, нам просто нужна OdbcCommand, основанная на "SP_UPLOADFILE"хранимой процедуры, о которой мы говорили ранее, и нам нужно добавить к ней необходимые параметры, чтобы мы могли передать нужные значения хранимой процедуре.

foreach (DataRow documentRow in documentsTable.Rows)
{
     using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           connection))
     {
       command.CommandType = CommandType.StoredProcedure;
       command.Parameters.AddWithValue("@path", "/");
       command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
       command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
       fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" :
                          "Не загружен!";
       Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
                                      fileUploadStatus);
     }
}

4.7 Закрыть соединение с Dropbox.

если (connection.State == ConnectionState.Open)
        соединение. Закрыть();

5. Запуск решения

Dropbox и Exchange

Рисунок 11: Выполнение решения

Dropbox и Exchange

Рисунок 12: Содержимое папки Dropbox после запуска решения

6. Примечания к решению

Мы постарались максимально упростить логику приложения, однако логику можно было бы улучшить, сохранив вложения из каждого письма обмена в отдельную папку, где имя папки могло бы быть частью ID сообщения или любого другого уникального идентификатора.

Для простоты мы проигнорировали многие основные стандарты кодирования, включая, но не ограничиваясь ими:

1. Имея строки соединения в конфигурационном файле
2. Хэширование и шифрование паролей с помощью хэш-кода и соли
3. Реализация шаблонов дизайна, таких как принцип одиночной ответственности или даже лучше, принцип инверсии зависимости

7. Полный исходный код

using System;
using System.Data;
using System.Data.Odbc;

пространство имен MySolution
{
    class Program
    {
        static void Main(string[] args)
        {
            //обеспечить подключение
            string connectionString = string.Empty;
            string sqlQueryString = string.Empty;
            OdbcConnection connection;
            OdbcCommand command;
            DataTable documentsTable = new DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = new DataTable();
            DataTable documentsListTable = new DataTable();

            //создание соединения с Exchange
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
            using (connection = new OdbcConnection(connectionString))
            {
                //открываем соединение
                connection.Open();

                //загрузите идентификаторы сообщений для сообщений с вложениями
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
                {
                    //заполняем таблицу messageIDs сообщениями
                    messagesAdapter.Fill(messageIDs);
                }

                //для каждого сообщения, используя идентификатор сообщения, получить список вложений
                foreach (DataRow messageIDRow in messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
                    using (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentsListAdapter.Fill(documentsListTable);
                }

                //получаем каждый аттачмент и сохраняем его в documentsTable
                foreach (DataRow documentInfoRow in documentsListTable.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]);
                    using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentsAdapter.Fill(documentsTable);
                }

                //предоставить пользователю информацию о том, что эти файлы были загружены
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} скачано!", documentRow["OutFileName"]));

                //закрываем соединение с Exchange
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //создание соединения с DropBox
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
            using (connection = new OdbcConnection(connectionString))
            {
                //открываем соединение
                connection.Open();

                // заполнитель статуса загрузки документа
                string fileUploadStatus = string.Empty;

                //для каждого документа, который есть в нашей таблице documentsTable
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    //вызов хранимой процедуры для загрузки файла
                    using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@path", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);

                        // проверяем статус и отображаем на экране
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "Не загружен!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                //закрываем соединение с Dropbox
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //дать обратную связь пользователю
            Console.WriteLine("все сделано...");
            Console.ReadKey();
        }
    }
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.