Я пишу надстройку 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;
}
}
Однако это просто делает поле «От» пустым в разделе «Пригласить участников», а не показывает учетную запись, для которой я его установил. Что я здесь делаю неправильно?





Попробуйте вызвать метод 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 возвращает папку по умолчанию в магазине по умолчанию для текущего профиля.
Когда вы создаете встречу через ленту в Outlook, «От» при приглашении участников зависит от учетной записи, связанной с папкой, в которой вы находились, когда нажимали кнопку, поэтому, если вы находитесь в папке «Входящие» учетной записи А, тогда «От» это учетная запись A, то же самое для учетной записи B. Я предполагаю, что сам Outlook получает «учетную запись, связанную с текущей выбранной папкой», а затем каким-то образом использует ее в качестве учетной записи «От».
Вам нужно использовать метод Store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar), который принадлежит другому аккаунту. В своем комментарии вы используете Namespace, а не Store.
И как мне получить доступ к Store? Это просто интерфейс.
Вы можете использовать свойство магазины класса Namespace
Хорошо, но это все еще не говорит мне, к какой учетной записи принадлежит выбранная в данный момент папка?
Класс Account предоставляет свойство DeliveryStore, которое возвращает объект Store, представляющий хранилище доставки по умолчанию для учетной записи. Таким образом, вы можете сравнить магазины и выяснить, какому аккаунту он принадлежит (если есть).
В конце концов, мне удалось заставить это работать, узнав текущую выбранную папку через 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); }
}
К сожалению, звонок
.Save()ничего не меняет. Когда я создаю встречу с помощью методаns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar), он снова получает папку неправильной учетной записи. «Папка календаря по умолчанию» — это календарь по умолчанию для учетной записи, которую я не установил по умолчанию. Странный.