Есть ли способ получить имя группы рассылки события NewEmail в Outlook VBA? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь перенаправить новые электронные письма в Outlook из группы рассылки под названием «Служба поддержки» в подпапку в течение определенного времени. Я не думаю, что правила позволяют переадресовывать электронные письма в определенное время, поэтому я использую событие Application.NewEmail.

Мой код настроен прямо сейчас, чтобы он мог переадресовывать электронные письма с адреса электронной почты отправителя Exchange во вложенную папку. Однако мне нужно каким-то образом сделать то же самое с группой рассылки, и я не уверен, как извлечь информацию, необходимую для идентификации группы рассылки.

Вот мой код:

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal cusItem As Object)
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
    Dim strAddress As String, strEntryId As String
    Dim objAddressentry As Outlook.AddressEntry, objExchangeUser As Outlook.ExchangeUser
    Dim objReply As Outlook.MailItem, objRecipient As Outlook.Recipient
    Dim objDestFolder As Outlook.MAPIFolder

    If TypeName(cusItem) = "MailItem" And cusItem.SenderEmailType = "EX" Then

        On Error GoTo ErrorHandler

        Set objReply = cusItem.Reply()
        Set objRecipient = objReply.Recipients.Item(1)

        strEntryId = objRecipient.EntryID

        objReply.Close OlInspectorClose.olDiscard

        Set objAddressentry = objNS.GetAddressEntryFromID(strEntryId)
        Set objExchangeUser = objAddressentry.GetExchangeUser()

        strAddress = objExchangeUser.PrimarySmtpAddress()

        If strAddress = "jabach@example.com" And TimeValue(Now()) >= TimeValue("08:00:00 AM") And TimeValue(Now()) <= TimeValue("05:00:00 PM") Then

        Set objDestFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("ryule")

        cusItem.Move objDestFolder

        End If

    End If

ProgramExit:
  Exit Sub

ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description & vbCrLf & "Click Ok to continue"
  Resume ProgramExit

End Sub

Также есть некоторые проблемы с Application_Startup (), фактически не запускающим Outlook, поэтому у меня все эти переменные объявлены дважды.

1 Ответ

0 голосов
/ 20 июня 2020

Вам необходимо проверить свойство AddressEntry.AddressEntryUserType , которое возвращает константу из перечисления OlAddressEntryUserType , представляющего тип пользователя AddressEntry . AddressEntryUserType обеспечивает более высокий уровень детализации для типов пользователей, чем AddressEntry.DisplayType. Свойство DisplayType не различает guish пользователей с разными типами AddressEntry, такими как AddressEntry, у которых есть адрес электронной почты SMTP (Simple Mail Transfer Protocol), Lightweight Directory Access Protocol (LDAP). адрес, адрес пользователя Exchange или AddressEntry в адресной книге контактов Outlook. Все эти объекты имеют olUser в качестве AddressEntry.DisplayType. Например:

Sub DemoAE() 
 Dim colAL As Outlook.AddressLists  
 Dim oAL As Outlook.AddressList  
 Dim colAE As Outlook.AddressEntries  
 Dim oAE As Outlook.AddressEntry  
 Dim oExUser As Outlook.ExchangeUser  
 Set colAL = Application.Session.AddressLists  
 For Each oAL In colAL  
 'Address list is an Exchange Global Address List  
  If oAL.AddressListType = olExchangeGlobalAddressList Then  
   Set colAE = oAL.AddressEntries  
   For Each oAE In colAE  
     If oAE.AddressEntryUserType = _  
       olExchangeUserAddressEntry Then  
       Set oExUser = oAE.GetExchangeUser  
       Debug.Print(oExUser.JobTitle)  
       Debug.Print(oExUser.OfficeLocation)  
       Debug.Print(oExUser.BusinessTelephoneNumber)  
     End If  
   Next  
  End If  
 Next  
End Sub

Итак, вам может потребоваться использовать метод AddressEntry.GetExchangeDistributionList в случае списков рассылки Exchange.

Перечисление OlAddressEntryUserType предоставляет следующие константы:

  • olExchangeAgentAddressEntry - запись адреса, которая является агентом Exchange.
  • olExchangeDistributionListAddressEntry - запись адреса, которая является списком рассылки Exchange.
  • olExchangeOrganizationAddressEntry - запись адреса, принадлежащая организации Exchange.
  • olExchangePublicFolderAddressEntry - запись адреса, представляющая собой папку Exchange publi c.
  • olExchangeRemoteUserAddressEntry - пользователь Exchange, принадлежащий другому Exchange лес.
  • olExchangeUserAddressEntry - пользователь Exchange, принадлежащий к тому же лесу Exchange.
  • olLdapAddressEntry - запись адреса, использующая облегченный протокол доступа к каталогам (LDAP).
  • olOt herAddressEntry - пользовательский или другой тип записи адреса, например FAX.
  • olOutlookContactAddressEntry - запись адреса в папке контактов Outlook.
  • olOutlookDistributionListAddressEntry - запись адреса, которая является списком рассылки Outlook.
  • olSmtpAddressEntry - запись адреса, которая использует протокол SMTP.

Наконец, я бы предложил обработать событие NewMailEx приложения класс. Событие NewMailEx запускается, когда новое сообщение поступает в папку «Входящие» и до того, как выполняется обработка правила клиента. Вы можете использовать идентификатор записи, возвращенный в массиве EntryIDCollection, для вызова метода NameSpace.GetItemFromID и обработки элемента.

...