【问题标题】:Obtain "sender" and "emailbody" properties获取“sender”和“emailbody”属性
【发布时间】:2020-06-25 07:28:13
【问题描述】:

背景
我在 Outlook 中扫描收件箱,然后根据电子邮件的标题将结果报告给 Excel 电子表格。我将使用与 Microsoft office 关键字中相同的示例,并会说“Office”。

IE:办公室:笔记本电脑有问题。 我需要获取发送邮件的用户名或电子邮件地址,可能还有电子邮件正文中的一些关键字。
我找到了仅通过使用表和行来遍历具有此关键字的项目的方法。


问题
我无法找到将 row.item 从表格转换为电子邮件的方法,也无法获得“sender”或“emailbody”属性。


代码
您需要添加 Outlook 参考

Option Base 1
Sub Outlook_ScanForEmails()
Const TxtTag  As String = "http://schemas.microsoft.com/mapi/proptag/"
Const TxtWordSubject As String = "Office:"
Dim OutTable As Outlook.Table
Dim OutRow As Outlook.Row
Dim OutEmail As Outlook.MailItem
Dim OutApp As Outlook.Application: Set OutApp = New Outlook.Application
Dim CounterEmails As Long
Dim TotalEmails As Long
Dim TxtFilter As String: TxtFilter = "@SQL=" & Chr(34) & TxtTag & "0x0037001E" & Chr(34) & " ci_phrasematch '" & TxtWordSubject & "'"
Dim TxtCourse As String
Dim DteReport As Date
Set OutTable = OutApp.Session.GetDefaultFolder(olFolderInbox).GetTable(TxtFilter)
    TotalEmails = OutTable.GetRowCount
    For CounterEmails = 1 To TotalEmails
    Set OutRow = OutTable.GetNextRow
    DteReport = OutRow("LastModificationTime")
    TxtCourse = OutRow("Subject")
    TxtCourse = Right(TxtCourse, Len(TxtCourse) - Len(TxtWordSubject))
    Next CounterEmails

End Sub


进一步的想法
我宁愿不遍历每封电子邮件,因为该表将流程缩小到仅迭代我需要的行项目。

【问题讨论】:

  • If you require a writeable object from the Table row, obtain the Entry ID for that row from the default EntryID column in the Table and then use the GetItemFromID method of the NameSpace object to obtain a full item, such as a MailItem or ContactItem, that supports read-write operations. 来自msdn.microsoft.com/en-us/vba/outlook-vba/articles/…
  • 谢谢@Sorceri!但是,我找不到采用这种方法的方法。我试过这个IDNumber = OutRow.Parent.Columns.Item(1)Set OutEmail = OutApp.Session.GetItemFromID(OutRow("Subject"))

标签: excel vba outlook


【解决方案1】:

根据我的评论,您可以从表的 entryID 列中获取邮件项目。以下是如何完成此操作的示例。

Option Base 1
Sub Outlook_ScanForEmails()
Const TxtTag  As String = "http://schemas.microsoft.com/mapi/proptag/"
Const TxtWordSubject As String = "Office:"
Dim OutTable As Outlook.Table
Dim OutRow As Outlook.Row
Dim OutEmail As Outlook.MailItem
Dim OutApp As Outlook.Application: Set OutApp = New Outlook.Application
Dim CounterEmails As Long
Dim TotalEmails As Long
Dim TxtFilter As String: TxtFilter = "@SQL=" & Chr(34) & TxtTag & "0x0037001E" & Chr(34) & " ci_phrasematch '" & TxtWordSubject & "'"
Dim TxtCourse As String
Dim DteReport As Date

Set OutTable = OutApp.Session.GetDefaultFolder(olFolderInbox).GetTable()
    TotalEmails = OutTable.GetRowCount
    For CounterEmails = 1 To TotalEmails
    Set OutRow = OutTable.GetNextRow
    DteReport = OutRow("LastModificationTime")
    TxtCourse = OutRow("Subject")
    'Define a string for the EntryId
    Dim entryID As String
    'get EntrId
    entryID = OutRow("EntryID")
    'define a MailItem
    Dim mi As MailItem
    'Get the MailItem from the ID
    Set mi = OutApp.Session.GetItemFromID(entryID)
    'do something with the mail item
    TxtCourse = Right(TxtCourse, Len(TxtCourse) - Len(TxtWordSubject))
    Next CounterEmails

End Sub

【讨论】:

  • 谢谢!有趣的是,我在尝试将其作为函数或从列中调用时迷失了方向。
【解决方案2】:

要将 Outlook 电子邮件提取到 excel 中,请在 excel 文件中使用以下代码,并参考 Microsoft Outlook 视图控件和 MS Outlook 16.0 对象库。

代码:

Sub GetFromOutlook()
Dim OutlookApp As Outlook.Application
Dim OutlookNamespace As Namespace
Dim wb As Workbook, ws As Worksheet
Dim Folder As MAPIFolder
Dim OutlookMail As Variant
Dim i As Integer
Set wb = ThisWorkbook
Set ws = wb.Sheets("Mail")
Set OutlookApp = New Outlook.Application
Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")
Set Folder = OutlookNamespace.GetDefaultFolder(olFolderInbox).GetTable(TxtFilter)    
i = 1

For Each OutlookMail In Folder.Items
'here you can update the condition to which it should be extracted

    If OutlookMail.ReceivedTime > ws.Range("D" & i).Value And OutlookMail.Subject <> ws.Range("B" & i).Value Then 
            ws.Range("B1").Offset(i, 0).Value = OutlookMail.Subject
        ws.Range("C1").Offset(i, 0).Value = OutlookMail.ReceivedTime
        ws.Range("D1").Offset(i, 0).Value = OutlookMail.ReceivedTime
        ws.Range("E1").Offset(i, 0).Value = OutlookMail.SenderName
        ws.Range("F1").Offset(i, 0).Value = OutlookMail.Body
        i = i + 1
    End If
Next OutlookMail

Set Folder = Nothing
Set OutlookNamespace = Nothing
Set OutlookApp = Nothing

End Sub

【讨论】:

  • 感谢您的帮助,但是,您正在从表中设置文件夹,因此尝试运行时出错
  • Set Folder = OutlookNamespace.GetDefaultFolder(olFolderInbox),这里指的是文件夹收件箱,您可以根据需要更改目标文件夹,例如:Set Folder = OutlookNamespace.GetDefaultFolder(olFolderInbox).Folders (“新文件夹”)文件夹“新文件夹”内的电子邮件被提取。
猜你喜欢
  • 2011-02-09
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多