Программно зашифровать электронную почту 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);
Другие вопросы по тегам