自 Office 365 升级后 VBA 中的 MailItem.Send 无法正常工作

Posted

技术标签:

【中文标题】自 Office 365 升级后 VBA 中的 MailItem.Send 无法正常工作【英文标题】:MailItem.Send in VBA not functioning since Office 365 upgrade 【发布时间】:2018-10-26 10:08:41 【问题描述】:

我们在整个组织中发送了很多电子表格,为了尽可能地自动化,我们编写了一些代码来自动发送并允许我们仍然放入正文。

这个特殊的脚本从我们的财务系统 (SAP) 中提取信息,将其转储到 Excel 中并通过电子邮件发送给用户,它会循环多次下载并每次通过电子邮件发送不同的数据。

这在我们的旧 Windows 7 (Office 2010) 机器上运行良好,但我们中的一些人已经获得了新的 Windows 10 (Office 365) 机器进行试验。

代码运行时没有任何错误消息,但是当它到达 .Send 时,它直接跳转到 End Sub 并且不发送电子邮件。

我已经尝试过 EmailItem.Display,您可以看到电子邮件被填充,然后在桌面上保持可见,因为它循环浏览了其余的电子邮件。

关于如何解决这个问题的任何想法?我可以使用 application.send 功能,但我希望能够将自定义文本添加到电子邮件正文中。

谢谢:)

Sub EmailData()

Dim OL As Object
Dim EmailItem As Object
Dim y As Long
Dim TempChar As String
Dim Bodytext As String
Dim Flds As Variant
Dim EmailText As Range

Application.DisplayAlerts = False
Application.ScreenUpdating = False

'Email Download to nursery

Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.Createitem(OLMailItem)


'Check File Name is correct
Filename = Range("A1") & ".xls"
For y = 1 To Len(Filename)
    TempChar = Mid(Filename, y, 1)
    Select Case TempChar
    Case Is = "/", "\", "*", "?", """", "<", ">", "|"
    Case Else
        SaveName = SaveName & TempChar
    End Select
Next y
ActiveSheet.Cells.Copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlValues
Selection.PasteSpecial Paste:=xlFormats
With ActiveWindow
    .DisplayGridlines = False
    .DisplayZeros = False
End With
Range("A1:S38").Select
Selection.Locked = True
Selection.FormulaHidden = False
Set EmailText = ActiveSheet.Range("AB1:AB5").SpecialCells(xlCellTypeVisible)

ActiveSheet.Protect ("keepsafe")
ActiveWorkbook.SaveAs Networkpath & "\" & SaveName, , "", , True
ActiveWorkbook.ChangeFileAccess xlReadOnly


 EmailItem.display

'On Error Resume Next
With EmailItem
.To = "Daston@blahblah.uk"
'.To = Range("AA1")
.CC = ""
.BCC = ""
.Subject = Filename
.htmlBody = RangetoHTML(EmailText)
.Attachments.Add ActiveWorkbook.FullName

.send
End With

Application.Wait (Now + TimeValue("0:00:02"))

Kill Networkpath & "\" & SaveName
ActiveWorkbook.Close False


Set OL = Nothing
Set EmailItem = Nothing

End Sub

【问题讨论】:

你是说你得到了一个异常,但即使注释掉了“'On Error Resume Next”你也看不到它是什么? 即使删除了“On Error Resume Next”也是正确的,它会直接跳转到 End Sub。它无法发送电子邮件并保持当前工作簿打开。然后它会回到原来的 Sub 并继续循环到下一批数据。 快速更新,我来到了我们使用的另一个电子表格,它在 Excel 中具有相同的电子邮件代码。在“With EmailItem”之前插入“On Error Goto 0”时,我在尝试 .Send 时确实遇到了错误。我收到了旧的运行时 287 应用程序定义或对象定义错误。这可能是由于 Outlook 中不同的信任中心设置或更严格的安全性造成的吗?我注意到我们的 ICT 人员已将我们的信任中心设置锁定为高安全性,而该设置过去是低安全性的。 如果 .Send 被禁用,您可能会冒着使用 SendKeys 绕过安全性的风险。 ***.com/a/48105643/1571407 【参考方案1】:

这描述了在某些情况下,您可以如何“使对象模型充分发挥作用”。

NameSpace.Logon Method (Outlook)

“首先,实例化 Outlook 应用程序对象,然后引用默认文件夹,例如收件箱。这具有初始化 MAPI 以使用默认配置文件并使对象模型完全正常工作的副作用。”

Sub InitializeMAPI ()

    ' Start Outlook.
    Dim olApp As Outlook.Application
    Set olApp = CreateObject("Outlook.Application")

    ' Get a session object. 
    Dim olNs As Outlook.NameSpace
    Set olNs = olApp.GetNamespace("MAPI")

    ' Create an instance of the Inbox folder. 
    ' If Outlook is not already running, this has the side
    ' effect of initializing MAPI.
    Dim mailFolder As Outlook.Folder
    Set mailFolder = olNs.GetDefaultFolder(olFolderInbox)

    ' Continue to use the object model to automate Outlook.
End Sub

【讨论】:

【参考方案2】:

出于安全考虑,HTMLBody、HTMLEditor、Body 和 WordEditor 属性都受地址信息安全提示的约束,因为邮件正文通常包含发件人或其他人的电子邮件地址。

HKCU\Software\Policies\Microsoft\office\16.0\outlook\security\

提示地址簿访问 提示oom地址信息访问

https://support.microsoft.com/en-za/help/926512/information-for-administrators-about-e-mail-security-settings-in-outlo

最可能的原因是 Outlook 安全性。

您可以在 HKCU\Software\Policies\Microsoft\office\16.0\outlook\security 中找到安全配置 (将 16.0 更改为您的 office 版本)

将 promptoomsend 更改为 2(或询问您的系统管理员),重新启动 Outlook 并重试。

更多信息https://support.microsoft.com/en-za/help/926512/information-for-administrators-about-e-mail-security-settings-in-outlo

【讨论】:

以上是关于自 Office 365 升级后 VBA 中的 MailItem.Send 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

【OFFICE 365】Power Query 多工作簿合并

“升级”到 Office 365 专业增强版后的 RODBC 连接

Office365和Office2016有啥区别呢?

我想在 Excel 中使用 VBA 从 Office 365 Outlook 邮件中读取 SenderAddress?

Exchange2010与Office365混合部署升级到Exchange2016混合部署——Ex2016 EAC本地建立O365邮箱

Excel VBA 到 PPT 在 Office 365 64 位中不起作用