Есть ли способ импортировать файлы PST в Outlook с помощью C #?

Использование: Visual Studio 2017 (Язык: C #)

У меня есть аналогичная функция, написанная ниже в сценарии PowerShell, но мне нужна ее версия C # для выполнения одним нажатием кнопки в Visual Studio:

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
$outlook = new-object -comobject outlook.application

$namespace = $outlook.GetNameSpace("MAPI")

dir “$env:userprofile\Documents\Outlook Files\*.pst” | % { $namespace.AddStore($_.FullName) }

Мы будем очень благодарны за любую информацию или примеры кода.


person Josh Pulda    schedule 29.03.2018    source источник


Ответы (2)


Сделать это можно следующим образом:

В своем проекте щелкните правой кнопкой мыши «Ссылки» и добавьте ссылку на сборку «Microsoft.Office.Interop.Outlook».

Затем вы можете использовать следующий код:

/// <summary>
/// Get a reference to an already running or a newly started Outlook instance
/// </summary>
Microsoft.Office.Interop.Outlook.Application GetOutlookApp()
{
    Microsoft.Office.Interop.Outlook.Application app = null;

    // Try to get running instance
    try
    {
        app = Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
    }
    catch(Exception)
    {
        // Ignore exception when Outlook is not running
    }

    // When outlook was not running, try to start it
    if(app == null)
    {
        app = new Microsoft.Office.Interop.Outlook.Application();
    }

    return app;
}

private void button1_Click(object sender, EventArgs e)
{
    const string fileName = @"D:\MyDings.pst";

    var app = GetOutlookApp();
    var nameSpace = app.GetNamespace("MAPI");

    nameSpace.AddStore(fileName);

    MessageBox.Show("Done");
}
person NineBerry    schedule 29.03.2018
comment
Могу ли я указать способ получения всех PST-файлов из «$ env: userprofile \ Documents \ Outlook Files * .pst», где вы устанавливаете const string fileName = @D: \ MyDings.pst; ? - person Josh Pulda; 29.03.2018
comment
Перечислите файлы с расширением из этого каталога и вызовите AddStore для каждого файла (это то же самое, что и код Powershell). Это выходит за рамки этого вопроса, но посмотрите stackoverflow .com / questions / 13301053 / - person NineBerry; 29.03.2018
comment
О том, как получить путь к папке к профилю пользователя, см., Например, stackoverflow.com/questions/9993561/ - person NineBerry; 29.03.2018
comment
Ваш ответ отлично подходит для указания одного файла .pst! Есть ли способ добавить в хранилище все мои файлы PST без указания имен каждого из их файлов? Как foreach, который добавляет каждый файл .pst в AddStore в папку или каталог ..? - person Josh Pulda; 29.03.2018
comment
@JoshPulda См. Мои предыдущие комментарии. Вам нужно найти файлы, а затем вызвать AddStore для каждого файла. Но код PowerShell больше ничего не делает. - person NineBerry; 29.03.2018
comment
Спасибо! Ваш исходный код работал нормально, но теперь я продолжаю получать эту ошибку: System.Runtime.InteropServices.COMException: 'Получение фабрики классов COM для компонента с CLSID {0006F03A-0000-0000-C000-000000000046} не удалось из-за следующей ошибки : 80080005 Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). - person Josh Pulda; 29.03.2018
comment
CO_E_SERVER_EXEC_FAILURE означает, что ваше приложение и Outlook работают в разных контекстах. Работает ли какое-либо приложение с повышенными привилегиями (Запуск от имени администратора)? Как вызывается ваше приложение? - person Dmitry Streblechenko; 30.03.2018

Я не уверен на 100%, что это возможно без дополнительных пакетов. Поэтому я бы просто выполнил команду оболочки, выполняющую сценарий PowerShell, поскольку он у вас уже есть. Немного хакерский, но кажется самым простым вариантом.

using System.Diagnostics;
Process.Start("powershell.exe " + scriptLocation);
person Tom Dee    schedule 29.03.2018