【问题标题】:Mail Stuck in Outbox of Outlook 2013 sent using Redemption使用兑换发送的邮件卡在 Outlook 2013 的发件箱中
【发布时间】:2017-12-08 03:44:49
【问题描述】:

目前我正在将应用程序迁移到新版本,我在应用程序中遇到问题。基本上它是一个 VBA Access 应用程序,它将向用户发送报告。对于邮件传递部分,它使用 Redemption.dll

当前版本:

  • Windows XP
  • 微软办公软件 2003
  • Redemption.dll v 4.5.0.812

迁移到

  • Windows 7

  • MS Office 2013

  • Redemption.dll v 4.5.0.812

场景 1: 在 Win 7 机器上使用 redemption.dll v 4.5.0.812 运行应用程序时,报告传递功能运行没有错误。但我注意到邮件卡在发件箱中。当我打开 Outlook 2013 时,邮件就会送达。因此,当我保持 Outlook 打开并运行该功能时,邮件就会送达。

场景 2: 现在在 Win 7 机器上使用开发者版本 redemption.dll v 5.14 邮件也卡在发件箱中。

可能是什么原因,是需要更改代码还是与 Outlook 2013 相关的一些设置更改? 任何形式的帮助都会非常有用....非常需要它:-) 如果需要更改代码,是否可以保留 redemption.dll 版本 v 4.5(根据要求)

如果您需要更多信息,请告诉我。

谢谢

【问题讨论】:

    标签: vba outlook mapi outlook-redemption outlook-2013


    【解决方案1】:

    来自http://www.dimastr.com/redemption/faq.htm#1

    当我使用 Redemption 发送消息时,它只是留在草稿文件夹中

    消息提交是扩展 MAPI 中的一个两步过程:

    1. 调用 IMessage::Submit()

    2. 刷新传出消息队列。

    如果您使用的是 Exchange Server,则不需要第 2 步,因为 Exchange 邮件存储与 Exchange 传输提供程序紧密绑定。但是,如果您使用 POP3/SMTP 传输和 PST 文件作为消息存储,则需要步骤 #2。要刷新消息队列,请创建 Redemption.MAPIUtils 对象的实例并在调用 SafeMailItem.Send 后调用其 DeliverNow 方法(类似于 CDO 中的 Session.DeliverNow):

    MailItem.Send
    Set Utils = CreateObject("Redemption.MAPIUtils")
    Utils.DeliverNow
    

    但是,如果您使用带有 PST 文件和 POP3/SMTP 传输提供程序的 Outlook 2002 或更新版本,或者以仅 Internet 模式安装的 Outlook 2000,则会出现一个问题:无法使用扩展 MAPI 刷新队列。 Outlook 的那部分完全被破坏了。但请注意,任何配置的带有 Exchange Server 或 Outlook 2000 C/W 的 Outlook 2002/2003(在线)都可以。

    如果您在缓存模式下将 Outlook 2003 或更高版本与 Exchange 结合使用,则会出现同样的问题。取消选中 Exchange Server 属性中的“使用缓存模式”以强制使用联机模式 - 这将确保邮件立即传递。

    作为最后的手段,您可以在发送消息后模拟单击 Outlook 中的“发送/接收”按钮:

    MailItem.Send
    Set Btn = Application.ActiveExplorer.CommandBars.FindControl(1, 5488) 
    Btn.Execute
    

    请注意,在 Outlook 2003 中,该按钮现在是下拉菜单,真正的发送/接收是按钮的子项:

    Set Btn = Application.ActiveExplorer.CommandBars.FindControl(1, 7095)
    Btn.Execute
    

    请注意,上面的代码假设有一个活动的资源管理器;如果您以编程方式启动 Outlook(并且以前不是由用户启动)并且不显示任何文件夹,则不会出现这种情况。在这种情况下,您可以使用 Namespace.SyncObjects 集合开始同步。:

     set NS = Application.GetNamespace("MAPI")
     NS.Logon
     Set Sync = NS.SyncObjects.Item(1)
     Sync.Start
    

    在 Outlook 2010 中,您还可以使用 Namespace.SendAndReceive 方法。

    【讨论】:

    • 感谢德米特里的回复。完成后,我在outlook 2013中取消选中“使用缓存模式”以强制在线模式,邮件确​​实立即送达。现在我有另一个查询,如前所述“如果您在缓存模式下使用带有 Exchange 的 Outlook 2003 或更高版本”,但在我当前版本的 Outlook 2003 中,使用缓存模式已选中,并且邮件已发送没有问题。所以关闭缓存模式是解决方案,或者我可以做任何改变并保持缓存模式开启。
    • 您可以使用 Namespace.SendAndReceive,但请记住,它是异步的,您需要确保在发送/接收完成之前一直引用 Outlook。
    • 再次感谢德米特里,我的错误是我在错误的机器上检查使用缓存模式。它不适用于 Outlook 2003 及更高版本。太好了,无需任何代码更改
    • 嗨,我使用 Outlook 2013 将应用程序迁移到 Windows 7,但是当我通过兑换发送电子邮件时 Set oRedemptionMail = CreateObject ("Redemption.SafeMailItem") oRedemptionMail.Item = oItemMail oRedemptionMail.Send 电子邮件仍保留在草稿文件夹能帮我吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多