通过Outlook Redemption发送的邮件滞留在Outlook发件箱中

时间:2017-01-16 21:29:18

标签: c# outlook office365 outlook-redemption outlook-2016

这个问题发生在我们的一位客户身上,我无法使用相同版本的Outlook在我身边复制。我的客户和我正在使用安装了Outlook 2016的Office 365。当他通过Outlook Redemption(用于Outlook集成的第三方程序)在我们的程序中发送电子邮件时,邮件卡在他的发件箱中。

如果他双击该消息(因此它在Outlook中弹出),他可以点击发送按钮,它将成功发送。如果他们使用旧版本的Outlook(2010),这不是问题。我当时将它们升级到最新版本的Outlook Redmeption(2016年5月7日发布),但看起来他们几天前刚刚推出新版本。我很快就会尝试,但更新日志并未提及邮件卡在发件箱中。

我还注意到,他的发件箱中的电子邮件似乎是“草稿”中的电子邮件。在他们的发件箱上,他们有一个'发送'他们的象征。这似乎很重要,但我不确定我能做些什么。

此外,点击发送/接收所有文件夹也无济于事。

我的代码如下。感谢您的帮助。

        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;
    }

2 个答案:

答案 0 :(得分:1)

请记住,邮件提交是异步的,除非您使用在线Exchange存储(存储和传输提供程序紧密耦合),否则它将自动触发。

您可以通过在Outlook对象模型中调用Namespace.SendAndReceive来强制发送/接收。

答案 1 :(得分: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;
    }