2016-10-27 10 views
0

Я создаю приложение Outlook 2010, чтобы интегрировать его с некоторым программным обеспечением для бизнеса и внедрил пользовательское событие ItemSend и применил мои собственные веб-службы от поддержки с помощью jason. Я могу сохранить почтовый элемент как .msg-файл (в папке временных файлов пользователей). но когда я пытаюсь открыть его Проблема заключается в том, что Outlook открывает ее как сообщение, которое все еще составлено, и пользователь может очень легко нажать кнопку «Отправить» еще раз.Есть ли способ отметить, что Outlook.MailItem был отправлен до его сохранения?

Есть ли способ отметить, что элемент был отправлен до его сохранения, поэтому при открытии после того, как он открывается, как прочитанный адрес электронной почты, а не как составной адрес электронной почты?

я делюсь мой код ниже, пожалуйста, руководство меня через этот

void Application_ItemSend(object Item, ref bool Cancel) 
    { 
     this.passwordpopUpObj = new Forms.PasswordInputPopUp(); 
     passwordpopUpObj.ShowDialog(); 
     passwordpopUpObj.StartPosition = FormStartPosition.CenterParent; 

     Outlook.MailItem mail = Item as Outlook.MailItem; 

     if (passwordpopUpObj.textBox1.Text != "") 
     { 
      Cancel = true; 
      BussinessClass cs = new BussinessClass(); 
      string msg = cs.ServerCallSendMail(mail.Subject, mail.To, mail.CC, attachcount, passwordpopUpObj.textBox1.Text); 

      if (msg == "Success") 
      { 
       mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "file3" + @".msg"); 

       MessageBox.Show("Mail Send SuccessFully through Plugin"); 
       mailItem = Item as Outlook.MailItem; 
       Cancel = true;     

       foreach (Outlook.Store store in OutlookObject.Session.Stores) 
       { 
        if (store.DisplayName == "Email Cipher") 
        { 
         Outlook.MAPIFolder pstRootFolder = store.GetRootFolder(); 

         foreach (Folder folder in pstRootFolder.Folders) 
         { 
          MessageBox.Show(store.FilePath + folder.FolderPath); 
          if (folder.Name == "Email cipher Sent") 
          { 
           MessageBox.Show(Directory.Exists(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails").ToString()); 

           mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "file3" + @".msg", Outlook.OlSaveAsType.olMSG); 


          } 
         } 
        } 
       } 
      } 

      // 

      else 
      { 
       Cancel = true; 
       MessageBox.Show("Mail Cannot be sent through plugin"); 

      } 
     } 

     else 
     { 
      MessageBox.Show("mail Send Normally"); 
      Cancel = false; 

      mail.Categories = "Sent"; 

      mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "outlookfile" + @".msg", Outlook.OlSaveAsType.olMSG); 
     } 

} 
+0

Если вы можете скопировать почти точный вопрос, который был задан здесь http://stackoverflow.com/questions/8799622/set-a-mailitem-as-sent-before-calling-saveas-in-outlook -addin-with-c-sharp? rq = 1, почему вы не можете использовать ответ? – AsheraH

ответ

0

на расширенном уровне MAPI, MSGFLAG_UNSENT бит может быть удален из PR_MESSAGE_FLAGS собственности только до того, как сообщение будет сохранено в первый раз. Это ограничение распространяется только на сообщения в папках Outlook, а не на отдельные файлы MSG.

В вашем конкретном случае, вы можете либо

  1. ждать, пока сообщение будет перемещено в папке Отправленные и сохранить форму файла MSG там

  2. Если вы хотите изменить файл MSG после его сохранения вы можете использовать Extended MAPI (только C++ или Delphi - OpenIMsgOnIStg/и т. д.), или вы можете использовать Redemption (любой язык) - используйте RDOSession. GetMessageFromMsgFile, установить RDOMail. Sent Недвижимость до истины, звоните RDOMail. Save.