Программно зашифровать электронную почту Outlook с помощью инспектора
Я использую C# с объектной моделью Outlook (погашение не подходит для меня из-за лицензирования), и у меня возникают трудности с программным шифрованием сообщения электронной почты перед его отправкой.
Я могу успешно получить ссылку на CommandBarButton, который предположительно представляет кнопку "Шифровать" (Id 718 согласно онлайн-примерам), но я не могу программно нажать ее. Я попытался использовать метод CommandBarButton Execute() и SendKeys (не уверен, что sendkeys даже допустим в этом контексте). Все операторы debug.writeline показывают, что кнопка находится в состоянии msoButtonUp.
Я играл с этим в течение нескольких дней и не могу заставить его работать. Любые советы будут высоко ценится!
Outlook.MailItem emailToSend;
...
Microsoft.Office.Core.CommandBarButton cbb = null;
cbb =(CommandBarButton)emailToSend.GetInspector.CommandBars["Standard"].FindControl(Type.Missing, 718, Type.Missing, true, false);
if (cbb != null) {
//it is not null in debugger
if (cbb.Enabled) {
//make sure digital signature is on
cbb.Visible = true;
Debug.WriteLine("State was: " + cbb.State.ToString()); //all debug calls return msoButtonUp
cbb.SetFocus();
SendKeys.SendWait("{ENTER}");
Debug.WriteLine("State was: " + cbb.State.ToString());
SendKeys.SendWait("~");
Debug.WriteLine("State was: " + cbb.State.ToString());
cbb.Execute();
Debug.WriteLine("State was: " + cbb.State.ToString());
}
}
2 ответа
Разобрался это методом проб и ошибок. Основная проблема, казалось, заключалась в том, что я использовал Инспектор до того, как отобразил MailItem. Добавление вызова в Дисплей в начале решило это. Для тех, кто заинтересован, вот код, который работал для меня:
private static void addOutlookEncryption(ref Outlook.MailItem mItem) {
CommandBarButton encryptBtn;
mItem.Display(false);
encryptBtn = mItem.GetInspector.CommandBars.FindControl(MsoControlType.msoControlButton, 718, Type.Missing, Type.Missing) as CommandBarButton;
if (encryptBtn == null) {
//if it's null, then add the encryption button
encryptBtn = (CommandBarButton)mItem.GetInspector.CommandBars["Standard"].Controls.Add(Type.Missing, 718, Type.Missing, Type.Missing, true);
}
if (encryptBtn.Enabled) {
if (encryptBtn.State == MsoButtonState.msoButtonUp) {
encryptBtn.Execute();
}
}
mItem.Close(Outlook.OlInspectorClose.olDiscard);
}
На самом деле есть лучший способ программно зашифровать, подписать, зашифровать + подписать или гарантировать, что ни то, ни другое. И вы можете сделать это без необходимости отображать почтовый элемент. В следующей статье показано, как, используя свойство почтового элемента:
http://support.microsoft.com/kb/2636465?wa=wsignin1.0
Например, в C#, если mItem - это ваш почтовый элемент, следующий код отключит подпись и шифрование:
mItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 0);