Как изменить «От» созданной встречи в надстройке Outlook COM?

Я пишу надстройку COM для Outlook на C#/.NET, используя Microsoft.Office.Interop.Outlook. Я могу создать новый элемент встречи следующим образом:

using Outlook = Microsoft.Office.Interop.Outlook;

[...]

var appointment = (Outlook.AppointmentItem)Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olAppointmentItem);
appointment.Display(true);

Однако у меня есть две разные учетные записи, настроенные в моем Outlook. Если я затем перехожу к встрече «Пригласить участников», «От» всегда показывает первую из двух моих учетных записей Outlook.

Я попытался установить свойство .SendUsingAccount для другой учетной записи в моем профиле Outlook, который я получил из текущего сеанса:

var accounts = Globals.ThisAddIn.Application.Session.Accounts;
foreach (Outlook.Account acct in accounts) {
    if (acct.DisplayName == "[desired account display name]") {
        appointment.SendUsingAccount = acct;
        break;
    }
}

Однако это просто делает поле «От» пустым в разделе «Пригласить участников», а не показывает учетную запись, для которой я его установил. Что я здесь делаю неправильно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте вызвать метод Save, чтобы применить изменения, сделанные через OOM.

Свойство AppointmentItem.SendUsingAccount позволяет указать объект Account, который представляет учетную запись, под которой должен быть отправлен элемент AppointmentItem.

What is the property of AppointmentItem Object, that changes the meeting host?

Самый простой способ — создать элемент встречи в папке календаря, которая принадлежит определенной учетной записи. Какой код вы используете для создания пунктов назначения?

В статье Как: создать новый элемент встречи в Outlook объясняются все возможные способы создания элементов встречи в Outlook. Попробуйте получить нужную папку и используйте метод Добавлять класса Items. Например:

 items.Add(Outlook.OlItemType.olAppointmentItem)

Метод GetDefaultFolder класса Store возвращает объект Folder, который представляет папку по умолчанию в магазине и имеет тип, указанный в аргументе FolderType. Этот метод аналогичен методу GetDefaultFolder объекта NameSpace. Разница в том, что этот метод получает папку по умолчанию в магазине доставки, связанную с учетной записью, тогда как NameSpace.GetDefaultFolder возвращает папку по умолчанию в магазине по умолчанию для текущего профиля.

К сожалению, звонок .Save() ничего не меняет. Когда я создаю встречу с помощью метода ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalenda‌​r), он снова получает папку неправильной учетной записи. «Папка календаря по умолчанию» — это календарь по умолчанию для учетной записи, которую я не установил по умолчанию. Странный.

Jez 25.07.2019 18:02

Когда вы создаете встречу через ленту в Outlook, «От» при приглашении участников зависит от учетной записи, связанной с папкой, в которой вы находились, когда нажимали кнопку, поэтому, если вы находитесь в папке «Входящие» учетной записи А, тогда «От» это учетная запись A, то же самое для учетной записи B. Я предполагаю, что сам Outlook получает «учетную запись, связанную с текущей выбранной папкой», а затем каким-то образом использует ее в качестве учетной записи «От».

Jez 25.07.2019 18:10

Вам нужно использовать метод Store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCale‌​ndar), который принадлежит другому аккаунту. В своем комментарии вы используете Namespace, а не Store.

Eugene Astafiev 25.07.2019 18:57

И как мне получить доступ к Store? Это просто интерфейс.

Jez 26.07.2019 10:01

Вы можете использовать свойство магазины класса Namespace

Eugene Astafiev 26.07.2019 11:29

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

Jez 01.08.2019 11:58

Класс Account предоставляет свойство DeliveryStore, которое возвращает объект Store, представляющий хранилище доставки по умолчанию для учетной записи. Таким образом, вы можете сравнить магазины и выяснить, какому аккаунту он принадлежит (если есть).

Eugene Astafiev 01.08.2019 16:19
Ответ принят как подходящий

В конце концов, мне удалось заставить это работать, узнав текущую выбранную папку через Application.ActiveExplorer().CurrentFolder, а затем получив папку календаря по умолчанию через .Store.GetDefaultFolder(). Это позволило мне создать новый элемент календаря через правильный календарь, автоматически установив соответствующий адрес «От» для текущей выбранной папки. Вот используемый код:

using Outlook = Microsoft.Office.Interop.Outlook;

[...]

Outlook.Explorer activeExplorer = null;
Outlook.Store currentStore = null;
Outlook.MAPIFolder calendarFolder = null;
Outlook.Items items = null;
Outlook.AppointmentItem appointment = null;
try {
    // Get default calendar for currently-selected folder
    activeExplorer = Globals.ThisAddIn.Application.ActiveExplorer();
    if (activeExplorer == null) {
        throw new Exception("No active explorer.");
    }
    currentStore = activeExplorer?.CurrentFolder?.Store;
    if (currentStore == null) {
        throw new Exception("No current store.");
    }
    calendarFolder = currentStore?.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
    if (calendarFolder == null) {
        throw new Exception("No default calendar folder.");
    }
    items = calendarFolder?.Items;
    if (items == null) {
        throw new Exception("No calendar folder items.");
    }

    // Populate a new outlook appointment object with the appointment info
    appointment = items.Add(Outlook.OlItemType.olAppointmentItem) as Outlook.AppointmentItem;

    // Setup appointment
    [...]

    // Display the appointment window to the user
    appointment.Display(true);
}
catch (Exception ex) {
    MessageBox.Show(Resources.AppointmentError + ": " + ex.Message);
}
finally {
    if (activeExplorer != null) { Marshal.ReleaseComObject(activeExplorer); }
    if (currentStore != null) { Marshal.ReleaseComObject(currentStore); }
    if (calendarFolder != null) { Marshal.ReleaseComObject(calendarFolder); }
    if (items != null) { Marshal.ReleaseComObject(items); }
    if (appointment != null) { Marshal.ReleaseComObject(appointment); }
}

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