Чтобы проверить, ответили ли вы на электронное письмо клиента через vba

#excel #vba #outlook

Вопрос:

Поздравляю вас с наступающим днем!

Я написал небольшой код VBA, чтобы проверить, ответила ли моя команда на электронное письмо клиента или нет. ежедневно мы получаем от клиента более 500 электронных писем, для отслеживания которых я написал приведенный ниже код, чтобы проверить, какие все электронные письма просматриваются.

 Dim O As Outlook.Application
Dim R As Long

Sub project2()
Set O = New Outlook.Application
Dim Omail As Outlook.MailItem
Set Omail = O.CreateItem(olMailItem)
Dim ONS As Outlook.Namespace
Set ONS = O.GetNamespace("MAPI")

Dim FOL As Outlook.Folder
Set FOL = ONS.GetDefaultFolder(olFolderInbox).Folders("MD-GPS")
R = 2
For Each Omail In FOL.Items

        Cells(R, 1) = Omail.Subject
        Cells(R, 2) = Omail.SenderEmailAddress
            
            Call REPLY_STATUS(Omail.Subject, Omail.SenderEmailAddress)
            
R = R   1
On Error Resume Next
Next Omail
End Sub

Sub REPLY_STATUS(MailSubject As String, MailSender As String)

Dim SentEmail As Outlook.MailItem
Set SentEmail = O.CreateItem(olMailItem)

Dim ONS2 As Outlook.Namespace
Set ONS2 = O.GetNamespace("MAPI")

        
Dim FOL2 As Outlook.Folder
Set FOL2 = ONS2.GetDefaultFolder(olFolderSentMail)
Dim check As String
check = "RE: " amp; MailSubject

For Each SentEmail In FOL2.Items

            If check = SentEmail.Subject And MailSender = SentEmail.Recipients(1).Address Then
                       Cells(R, 3) = "Yes"
                       Exit For
            Else
            End If
 On Error Resume Next
Next SentEmail


End Sub
 

Но концовка не так хороша, как кажется, код работает, но

  1. в большинстве случаев код захватывает что-то другое, а не адрес электронной почты отправителя на листе Excel.

введите описание изображения здесь

  1. Поскольку мы ежедневно получаем более 500 электронных писем, код становится слишком медленным, поскольку он проверяет всю папку с нуля, есть ли возможность добавить дату начала, которую я могу указать в листе Excel, и код будет начинаться только с этой даты.
  2. Не уверен, почему он также не заполняет колонку 3, т. Е. Если ответил, однако моя команда действительно ответила на эти электронные письма.
  3. он не собирает последние электронные письма из определенной подпапки («MD-GPS»), почему это происходит?

Любая помощь в этом будет весьма признательна.

Примечание: Для обработки ошибки учетной записи exchange stmp я попытался использовать следующий файл MailItem.Sender.GetExchangeUser.PrimarySmtpAddress, но единственный недостаток в том, что если я изменю подпапку на что-то другое, это не сработает.

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Во — первых, вам не нужно создавать SentEmail — избавьтесь от

 Set SentEmail = O.CreateItem(olMailItem)
 

линия.

Во — вторых, никогда не просматривайте все элементы в папке- используйте Items.Find/FindNext или Items.Restrict .

В-третьих, вы видите адрес типа EX (в отличие от SMTP). Проверьте MailItem.Sender.Type свойство — если это «SMTP», используйте MailItem.Sender.Address . В противном случае (в случае «БЫВШЕГО») используйте MailItem.Sender.GetExchangeUser().PrimarySmtpAddress .

Тем не менее, вы можете проверить, ответил ли кто — нибудь вообще на исходное сообщение — проверьте, присутствует ли PR_LAST_VERB_EXECUTED свойство MAPI (имя DASL http://schemas.microsoft.com/mapi/proptag/0x10810003 ) — 103 равно EXCHIVERB_REPLYTOALLand 102 EXCHIVERB_REPLYTOSENDER . Если свойство вообще не задано, нет причин для поиска.

Для поиска подходящей темы используйте запрос типа

 "[Subject] = ' amp; MailSubject  amp; "'"
 

Обратите внимание, что объектная модель Outlook не позволяет выполнять поиск получателей сообщений или вложений. Если использование выкупа является опцией, вы можете использовать что-то вроде следующего. Вы можете указать получателей в качестве одного из полей поиска, и Погашение создаст ограничение на имя / адрес получателя / SMTP-адрес

 set session = CreateObject("Redemption.RDOSession")
session.MAPIOBJECT = O.Session.MAPIOBJECT
set SentEmail = FOL2.Items.Find("""http://schemas.microsoft.com/mapi/proptag/0x0E1D001F"" = '" amp; MailSubject amp; "' AND Recipients = '" amp; MailSender amp; "'")
 

Обратите внимание , что большинство магазинов MAPI не будут выполнять поиск по PR_SUBJECT , только по PR_NORMALIZED_SUBJECT (что является темой без префикса RE: или FW:) — именно это используется в приведенном выше фрагменте.

Комментарии:

1. можно ли добавить дату начала, чтобы код выполнял поиск по электронной почте, начиная с указанной даты начала ?

2. Конечно, вы можете добавить ограничение на ReceivedTime свойство, которое должно быть больше или меньше любого значения.

3. остальное все улажено, не могли бы вы помочь мне с полученным временем в коде, где мне нужно это упомянуть ?

4. Установите FOL = msgs. Ограничить(«[ReceivedTime] >= ‘» amp; Формат(CDate(msg.ReceivedTime), «01/10/2021 00:00») amp; «‘») я попробовал все вышесказанное, но ничего не вышло

5. проблема была решена, она была связана с неправильным форматом даты.