I'm trying to use Redemption and Profman to add an Exchange Online mailbox to an existing Outlook profile. I want to simulate the same result as when you use File | Add Account in Outlook. (I don't want to add a delegate mailbox.)
I've written some code (it's below), but I can't get it to work. I am testing with an email account that I have no problem adding manually. When I use the File | Add Account in Outlook, a screen pops up that asks me for an email address. I enter the email address, and the account is successfully added to my profile. I don't even need to enter a password.
However, when I use the code below for the same email address, it doesn't work. The mailbox shows up in Outlook, but when I click on it, I get the message: "The set of folders cannot be opened. The attempt to log on to Microsoft Exchange has failed". And there is no prompt for me to enter a password.
I'm using Outlook 2021. The code below was adapted from: https://www.dimastr.com/redemption/profman_examples.htm#ROH_Profile_Outlook2016
private static void AddExoMailbox(string profileName, string email)
{
const int PR_DISPLAY_NAME_W = 0x3001001F;
const int PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W = 0x6641001F;
const int PR_EMSMDB_SECTION_UID = 0x3D150102;
const int PR_STORE_PROVIDERS = 0x3D000102;
var profile = new ProfMan.Profiles().Item[profileName];
var ExchService = profile.Services.Add("MSEMS", "Microsoft Exchange", false);
var vProfileGuid = ExchService.ProfSect.Item[PR_EMSMDB_SECTION_UID];
dynamic ProviderStoreUid = null;
for (int k = 1; k <= ExchService.Providers.Count; k++)
{
var ExProvider = ExchService.Providers.Item[k];
var ProviderUid = ExProvider.UID;
if (ProviderUid == vProfileGuid)
{
var ProviderProfSect = ExProvider.ProfSect;
ProviderProfSect.Item[PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W] = $"SMTP:{email}";
ProviderStoreUid = ExchService.ProfSect.Item[PR_STORE_PROVIDERS];
}
}
for (int k = 1; k <= ExchService.Providers.Count; k++)
{
var ExProvider = ExchService.Providers.Item[k];
var ProviderUid = ExProvider.UID;
if (ProviderUid == ProviderStoreUid)
{
var StoreProviderProfSect = ExProvider.ProfSect;
StoreProviderProfSect.Item[PR_DISPLAY_NAME_W] = email;
StoreProviderProfSect.Item[PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W] = $"SMTP:{email}";
}
}
}
Any pointers?