2017-01-16 30 views
0

Эта проблема возникает для одного из наших клиентов, и я не смог воспроизвести ее на своей стороне, используя ту же версию Outlook. Мой клиент и я используем Office 365 с установленным Outlook 2016. Когда он отправляет электронное письмо в нашу программу через Outlook Redemption (сторонняя программа, используемая для интеграции с Outlook), почта застревает в папке «Исходящие».Письма, отправленные с помощью Outlook Redemption Застряли в Oulook Outbox

Если он дважды щелкает сообщение (поэтому он появляется в Outlook), он может нажать кнопку отправки, и он будет успешно отправлен. Если они используют старую версию Outlook (2010), это не проблема. Я обновил их до последней версии Outlook Redmeption в то время (выпущен 07 мая 2016 года), хотя похоже, что они только что вышли с новой версией несколько дней назад. Я попробую это скоро, но в журнале изменений не упоминается, что почта застряла в Outbox.

Я также заметил, что письма в его исходной папке имеют то, что кажется им символом «черновик», в то время как в моей папке «Исходящие» у них есть символ «отправки». Это кажется важным, но я не уверен, что я могу с этим поделать.

Кроме того, поражение отправки/получения всех папок не помогает.

Мой код ниже. Спасибо за любую помощь.

 public static bool SendMessage(Recipients recipients, string[] addressListReplyTo, string subject, string body, string[] attachments, bool requestReadReceipt, Log log, bool isHtmlBody = false) 
    { 
     RDOSession session = null; 
     RDOMail mail; 
     RDOFolder folder; 
     bool result = true; 

     session = GetSessionAndLogon(log); 
     if (session == null) 
      return false; 

     folder = session.GetDefaultFolder(rdoDefaultFolders.olFolderOutbox); 
     mail = folder.Items.Add(); 
     if (isHtmlBody) 
      mail.HTMLBody = body; 
     else 
      mail.Body = body; 
     mail.Subject = subject; 
     mail.ReadReceiptRequested = requestReadReceipt; 
     foreach (string attachment in attachments) 
     { 
      if (attachment != "") 
       mail.Attachments.Add(attachment); 
     } 
     foreach (string address in addressListReplyTo) 
     { 
      if (address != "") 
       mail.ReplyRecipients.Add(address); 
     } 
     foreach (string address in recipients.To) 
     { 
      if (address != "") 
       mail.Recipients.Add(address).Type = 1; 
     } 
     foreach (string address in recipients.Cc) 
     { 
      if (address != "") 
       mail.Recipients.Add(address).Type = 2; 
     } 
     foreach (string address in recipients.Bcc) 
     { 
      if (address != "") 
       mail.Recipients.Add(address).Type = 3; 
     } 

     foreach (RDORecipient recipient in mail.Recipients) 
     { 
      if (!OutlookMailEngine64.existsName(recipient.Name, session, log == null ? null : log)) 
       result = false; 
     } 
     if (result) 
     { 
      try 
      { 
       mail.Send(); 
       result = true; 
      } 
      catch (System.Runtime.InteropServices.COMException ex) 
      { 
       string message = "Error while sending email: " + ex.Message; 
       if (log != null) 
        log.Message(message); 
       if (OutlookMailEngine64.DiagnosticMode) 
        MessageBox.Show(message); 
       throw new EmailLibraryException(EmailLibraryException.ErrorType.InvalidRecipient, "One or more recipients are invalid (use OutlookMailEngine64.ValidateAddresses first)", ex); 
      } 
     } 
     if (session.LoggedOn) 
      session.Logoff(); 

     return result; 
    } 

ответ

1

Dmitry работал со мной по электронной почте. Решение для меня заключалось в замене RDO на объект SafeMailItem. Ниже приведена обновленная версия моего метода, чтобы вы могли видеть изменения:

private static bool SendSafeMessage(Recipients recipients, string[] addressListReplyTo, string subject, string body, string[] attachments, bool requestReadReceipt, Log log, bool isHtmlBody = false) 
    { 
     //This method was added because sometimes messages were getting stuck in the Outlook Outbox and this seems to solve that 
     bool result = true; 

     Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application(); 
     Microsoft.Office.Interop.Outlook.NameSpace namespaceMAPI = application.GetNamespace("MAPI"); 
     namespaceMAPI.Logon(); 
     RDOSession session = null; 
     session = GetSessionAndLogon(log); //TODO: I'm creating a 2nd session here which is wasteful 

     SafeMailItem safeMail = Redemption.RedemptionLoader.new_SafeMailItem(); 
     Microsoft.Office.Interop.Outlook.MailItem outlookMailItem = (Microsoft.Office.Interop.Outlook.MailItem)application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); 
     safeMail.Item = outlookMailItem; 

     if (isHtmlBody) 
      outlookMailItem.HTMLBody = body; 
     else 
      safeMail.Body = body; 
     outlookMailItem.Subject = subject; 
     outlookMailItem.ReadReceiptRequested = requestReadReceipt; 
     foreach (string attachment in attachments) 
     { 
      if (attachment != "") 
       safeMail.Attachments.Add(attachment); 
     } 
     foreach (string address in addressListReplyTo) 
     { 
      if (address != "") 
       safeMail.ReplyRecipients.Add(address); 
     } 
     foreach (string address in recipients.To) 
     { 
      if (address != "") 
       safeMail.Recipients.Add(address).Type = 1; 
     } 
     foreach (string address in recipients.Cc) 
     { 
      if (address != "") 
       safeMail.Recipients.Add(address).Type = 2; 
     } 
     foreach (string address in recipients.Bcc) 
     { 
      if (address != "") 
       safeMail.Recipients.Add(address).Type = 3; 
     } 

     foreach (Microsoft.Office.Interop.Outlook.Recipient recipient in outlookMailItem.Recipients) 
     { 
      if (!OutlookMailEngine64.existsName(recipient.Name, session, log == null ? null : log)) 
       result = false; 
     } 
     if (result) 
     { 
      try 
      { 
       safeMail.Send(); 
       result = true; 
      } 
      catch (System.Runtime.InteropServices.COMException ex) 
      { 
       string message = "Error while sending email: " + ex.Message; 
       if (log != null) 
        log.Message(message); 
       if (OutlookMailEngine64.DiagnosticMode) 
        MessageBox.Show(message); 
       throw new EmailLibraryException(EmailLibraryException.ErrorType.InvalidRecipient, "One or more recipients are invalid (use OutlookMailEngine64.ValidateAddresses first)", ex); 
      } 
     } 

     if (session.LoggedOn) 
      session.Logoff(); 

     namespaceMAPI.Logoff(); 

     return result; 
    } 
1

Имейте в виду, что представление сообщений является асинхронным, и он Nto будет автоматически срабатывает, если вы не используете интернет-хранилище Exchange (где хранить и транспортировать поставщик тесно связаны).

Вы можете принудительно отправить/получить, вызвав Namespace.SendAndReceive в объектной модели Outlook.

+0

Благодарим за отзыв. 'Namespace.SendAndReceive' делает то же самое, что и удалять вручную и вносить все папки вручную в Outlook, правильно? Если это так, это не поможет. Мы нажали на эту кнопку, и сообщение все еще сидит в папке «Исходящие» с иконкой «черновик», а не с иконкой «отправка». Клиент также протестировал новую версию Redemption (09 января 2017 года), но это не помогло (я этого не ожидал, просто хотел обновить в любом случае). Я также был бы открыт для прямого общения с вами, если это будет работать лучше для вас. Спасибо за помощь! – bruestle2

+1

У вас есть панель предварительного просмотра в папке «Исходящие»? Отображает ли Outlook курсивом сообщение? –

+0

Вот скриншот от клиента с приложением «Отправить/получать», чтобы показать, что они не отправят. http://i.imgur.com/rWYQSh9.png Кроме того, оказывается, что я был некорректен относительно одной детали. Они используют Google App Sync с Office 2016, а не Office 365. – bruestle2

 Смежные вопросы

  • Нет связанных вопросов^_^