- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个代码(我从 How do you extract email addresses from the 'To' field in outlook? 和另一个消失的来源中复制并稍微编辑了它)目前正在运行以提取日期、姓名和电子邮件地址(发件人、收件人、抄送)中的每封电子邮件一个特定的邮件文件夹。然而,在交叉引用从 Outlook 手动导出的电子邮件列表(通过导入和导出向导)后,我意识到大约有 30 封电子邮件在 VBA 导出表中有错误。对于包含各自电子邮件信息的每一行,“发件人”、“收件人”和“抄送”中的名称均为空白,而相应的电子邮件列只是成功提取的前一封电子邮件的副本。到目前为止,根据我的观察,这些电子邮件之间的相似之处在于它们都是针对 Microsoft 团队 session 的(例如,邀请参加团队 session )。下图描述了错误:
此外,一个人有两个电子邮件地址(每个地址都有不同的域)。但是,只有一个邮箱地址成功导出了对应的邮箱;包含其他电子邮件地址的电子邮件无法导出该特定电子邮件地址,即使他们的名字仍然存在。同样,错误是这样的:
请帮助我识别并在可能的情况下纠正上述问题,因为我在编码方面几乎没有经验。提前致谢。代码如下-
Option Explicit
Sub GetEmail()
Dim appOutlook As Object
Dim olNs As Object
Dim olFolder As Object
Dim olItem As Object
Dim iRow As Integer
' Get/create Outlook Application
On Error Resume Next
Set appOutlook = GetObject(, "Outlook.Application")
If appOutlook Is Nothing Then
Set appOutlook = CreateObject("Outlook.Application")
End If
On Error GoTo 0
Set olNs = appOutlook.GetNamespace("MAPI")
'Set olFolder = olNs.GetDefaultFolder(6) ' 6 == Inbox for some reason
Set olFolder = olNs.Session.PickFolder
' Clear
ThisWorkbook.ActiveSheet.Cells.Delete
' Build headings:
Range("A1:G1") = Array("From:", "To:", "CC:", "SenderEmailAddress", "RecipientEmailAddress", "CCEmailAddress", "Date")
For iRow = 1 To olFolder.Items.Count
Cells(iRow + 1, 1) = olFolder.Items.Item(iRow).Sender
On Error Resume Next
Cells(iRow + 1, 2) = olFolder.Items.Item(iRow).To
Cells(iRow + 1, 3) = olFolder.Items.Item(iRow).CC
Dim Arr As Variant: Arr = EmailAddressInfo(olFolder.Items(iRow))
Cells(iRow + 1, 4) = Arr(olOriginator)
Cells(iRow + 1, 5) = Arr(olTo)
Cells(iRow + 1, 6) = Arr(olCC)
Cells(iRow + 1, 7) = olFolder.Items.Item(iRow).ReceivedTime
Next iRow
End Sub
Private Function EmailAddressInfo(olItem As MailItem) As Variant
If olItem.Class <> olMail Then Exit Function
On Error GoTo ExitFunction
Dim olRecipient As Outlook.Recipient
Dim olEU As Outlook.ExchangeUser
Dim olEDL As Outlook.ExchangeDistributionList
Dim ToAddress, CCAddress, Originator, email As String
With olItem
Select Case UCase(.SenderEmailType)
Case "SMTP": Originator = .SenderEmailAddress
Case Else
Set olEU = .Sender.GetExchangeUser
If Not olEU Is Nothing Then Originator = olEU.PrimarySmtpAddress
End Select
End With
For Each olRecipient In olItem.Recipients
With olRecipient
Select Case .AddressEntry.AddressEntryUserType
Case olSmtpAddressEntry 'OlAddressEntryUserType.
email = .Address
Case olExchangeDistributionListAddressEntry, olOutlookDistributionListAddressEntry
Set olEDL = .AddressEntry.GetExchangeDistributionList
email = IIf(Not olEDL Is Nothing, olEDL.PrimarySmtpAddress, "")
Case Else
Set olEU = .AddressEntry.GetExchangeUser
email = IIf(Not olEU Is Nothing, olEU.PrimarySmtpAddress, "")
End Select
If email <> "" Then
Select Case .Type
Case olTo: ToAddress = ToAddress & email & ";"
Case olCC: CCAddress = CCAddress & email & ";"
End Select
End If
End With
Next
EmailAddressInfo = Array(Originator, ToAddress, CCAddress)
ExitFunction:
End Function
最佳答案
错误处理可能很乏味,这就是为什么经常看到一揽子 On Error Resume Next
的原因。这会隐藏错误,因此结果不可信。对于没有经验的人来说,“代码运行”是莫名其妙的。
可以说 On Error GoTo ExitFunction
更好,因为它没有给出任何结果,因此您会意识到存在问题。
在删除了 On Error Resume Next
和 On Error GoTo ExitFunction
后,您可以在看到需要错误处理的位置后构建自己的错误处理逻辑。
按您认为合适的方式进行调整。
Option Explicit
Sub GetEmail()
Dim appOutlook As Object
Dim olFolder As Object
Dim olItem As Object
Dim iRow As Long
Dim Arr As Variant
' Get/create Outlook Application
On Error Resume Next
Set appOutlook = GetObject(, "Outlook.Application")
On Error GoTo 0 ' <-- Remove error bypass as soon as possible
If appOutlook Is Nothing Then
Set appOutlook = CreateObject("Outlook.Application")
End If
Set olFolder = Session.PickFolder
If olFolder Is Nothing Then Exit Sub
' Clear
ThisWorkbook.ActiveSheet.Cells.Delete
' Build headings:
Range("A1:G1") = Array("From:", "To:", "CC:", "SenderEmailAddress", "RecipientEmailAddress", "CCEmailAddress", "Date")
For iRow = 1 To olFolder.Items.Count
Set olItem = olFolder.Items.Item(iRow)
If olItem.Class = olMail Then
With olItem
Cells(iRow + 1, 1) = .Sender
Cells(iRow + 1, 2) = .To
Cells(iRow + 1, 3) = .CC
Arr = EmailAddressInfo(olFolder.Items(iRow))
Cells(iRow + 1, 4) = Arr(olOriginator)
Cells(iRow + 1, 5) = Arr(olTo)
Cells(iRow + 1, 6) = Arr(olCC)
Cells(iRow + 1, 7) = .ReceivedTime
End With
Else
Cells(iRow + 1, 8) = "Errors, due to object not having mailtem property, bypassed."
With olItem
On Error Resume Next
Cells(iRow + 1, 1) = .Sender
Cells(iRow + 1, 2) = .To
Cells(iRow + 1, 3) = .CC
On Error GoTo 0 ' <-- Remove error bypass as soon as possible
Arr = EmailAddressInfo(olFolder.Items(iRow))
Cells(iRow + 1, 4) = Arr(olOriginator)
Cells(iRow + 1, 5) = Arr(olTo)
Cells(iRow + 1, 6) = Arr(olCC)
Cells(iRow + 1, 7) = .ReceivedTime
End With
End If
Next iRow
End Sub
Private Function EmailAddressInfo(objItem As Object) As Variant
' https://stackoverflow.com/a/66484483/1571407
Dim olRecipient As Outlook.Recipient
Dim olEU As Outlook.ExchangeUser
Dim olEDL As Outlook.ExchangeDistributionList
Dim ToAddress As String
Dim CCAddress As String
Dim Originator As String
Dim email As String
If objItem.Class <> olMail Then
EmailAddressInfo = Array("Not a mailitem.", "", "")
Exit Function
End If
Debug.Print objItem.Subject
With objItem
Select Case UCase(.SenderEmailType)
Case "SMTP"
If Len(.SenderEmailAddress) > 0 Then
Originator = .SenderEmailAddress
Else
Originator = "Not available."
End If
Debug.Print "Originator: " & Originator
Case Else
Set olEU = .Sender.GetExchangeUser
If Not olEU Is Nothing Then
Originator = olEU.PrimarySmtpAddress
Debug.Print "Originator: " & Originator
End If
End Select
End With
For Each olRecipient In objItem.Recipients
With olRecipient
Select Case .AddressEntry.AddressEntryUserType
Case olSmtpAddressEntry 'OlAddressEntryUserType.
email = .Address
Case olExchangeDistributionListAddressEntry, olOutlookDistributionListAddressEntry
Set olEDL = .AddressEntry.GetExchangeDistributionList
email = IIf(Not olEDL Is Nothing, olEDL.PrimarySmtpAddress, "")
Case Else
Set olEU = .AddressEntry.GetExchangeUser
If Not olEU Is Nothing Then
' This may be valid somewhere but
' in my environment it is never used
email = olEU.PrimarySmtpAddress
Debug.Print " olEU.PrimarySmtpAddress: " & email
Else
Debug.Print
Debug.Print "**** olEU Is Nothing ****"
' https://stackoverflow.com/a/51939384/1571407
' "It looks like, for email addresses outside of your organization,
' the SMTP address is hidden in emailObject.Recipients(i).Address"
email = .Address
Debug.Print " olRecipient.Address: " & email
End If
End Select
If email <> "" Then
Select Case .Type
Case olTo
ToAddress = ToAddress & email & ";"
Debug.Print ToAddress
Case olCC
CCAddress = CCAddress & email & ";"
Debug.Print CCAddress
End Select
End If
End With
Next
EmailAddressInfo = Array(Originator, ToAddress, CCAddress)
End Function
关于excel - 将电子邮件详细信息从 Outlook 导出到 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72179620/
以下 Outlook 的命令适用于 Outlook 2010: outlook.exe /c ipm.note /m "&subject=abc" /a "c:\attach.txt" 但它不适用于
我有 2 个电子邮件帐户,一个是 Gmail,另一个是 Outlook。我想在邮件到达时自动将进入 Outlook 的邮件接收到 Gmail。我该怎么做?Outlook 是否存在任何可能阻碍此操作的安
Outlook 加载项如何在邮件上设置 MAPI 属性(例如正文内容),但仅将其保存在本地缓存中(而不发送回 Exchange 服务器)?我见过使用一些加密插件来完成此操作。 我愿意使用几乎任何可以实
有什么方法可以在 Outlook 的模板主题或正文中插入今天的日期吗?这样,每当我打开保存的模板时,今天的日期就会自动显示在主题和正文中。 有什么内置功能吗?像 Date() 这样的东西? 最佳答案
我有一个时事通讯系统,可以跟踪阅读它的人。尽管此功能仅在允许下载图像的情况下才有效。但这不是我现在的问题。 我的问题是,当我在 Outlook (2010) 中打开新闻稿并授予下载图像的权限时,我的系
我需要从 Outlook msg 文件中读取内容。目前我正在使用来自 CodeProject.com 的类(class)项目来实现这一点,因为在服务器上部署 VSTO 和 Outlook 不是一种选择
我正在开发可与共享邮箱一起使用的 Outlook 加载项。目前,office 插件在委托(delegate)场景中不可用,但 MS 已经发布了支持这些场景的预览版本。https://learn.mic
我正在开发可与共享邮箱一起使用的 Outlook 加载项。目前,office 插件在委托(delegate)场景中不可用,但 MS 已经发布了支持这些场景的预览版本。https://learn.mic
我开发了一个运行良好的 Outlook Web 插件。它是一个任务 Pane ,可在约会的组合模式下使用,它收集事件数据、添加一些数据并将其发送到某个地方的 API。 我现在想做的是将经过身份验证的用
在 Outlook for Mac 中,office.js Outlook 加载项在我假设是 Safari Web 控件的任务 Pane 中运行。我无法确定您如何从任务 Pane 中运行的加载项中清除
Marshal.GetActiveObject("Outlook.Application") 在 Outlook 启动并继续运行时抛出 操作不可用(HRESULT 异常:0x800401E3 (MK_
我有一个 VSTO Outlook 2007 加载项。我必须检查 Outlook 是否与交换服务器脱机/联机。我正在使用如下代码: NameSpace ns = Application.GetNam
我正在尝试在图像上方添加文本,如下所示。它适用于除 Outlook 2010、Outlook 2007、Outlook 2013 之外的所有电子邮件客户端。所有这三个客户端都忽略了填充。我到处都试过了
有没有办法处理 Outlook 邮件项中收件人的悬停事件?我想在悬停时显示一个弹出窗口,其中包含有关收件人的一些信息,并想知道是否可以通过 Outlook 加载项实现。 最佳答案 因为 Inspect
我正在尝试在 Outlook 2007 中创建、更新和删除事件(但最好它适用于所有版本)。创建和删除事件工作正常。我关注了 several threads但由于某种原因更新操作失败。 当我双击 ICS
我在 ms Outlook 中有 2 个帐户('user1@test.com' - 默认配置文件,'user2@test.com'),我正在尝试使用非默认帐户通过 python 发送消息。这是我的代码
我有一个我最近继承的Outlook 2007加载项,目前在生产中存在一个问题,有些用户正在周期性地,似乎是随机地禁用其加载项。外接程序中没有日志,并且在外接程序代码中的每个方法/事件调用周围都存在tr
是否可以为 创建 HTML 电子邮件签名? 2003年展望或以上不引用外部图像? 也就是说,使用那些特殊的“cid”引用,但将图像本身嵌入到签名中,而不是嵌入到文件系统或网络中。 这适用于根据用户的各
似乎没有太多信息或任何好的代码示例用于以编程方式设置 Outlook 2007 MailItem 的类别。 MSDN has a limited page ,并提到使用 VB 的 拆分 功能,或多或少
Outlook 2007 在 Outlook 中撰写新邮件时,可以创建指向其他邮件的链接吗? Whww 我正在撰写一封新邮件,我想创建一个指向已发送项目的链接,单击此链接应该会打开邮件。 这能做到吗?
我是一名优秀的程序员,十分优秀!