#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
Но концовка не так хороша, как кажется, код работает, но
- в большинстве случаев код захватывает что-то другое, а не адрес электронной почты отправителя на листе Excel.
- Поскольку мы ежедневно получаем более 500 электронных писем, код становится слишком медленным, поскольку он проверяет всю папку с нуля, есть ли возможность добавить дату начала, которую я могу указать в листе Excel, и код будет начинаться только с этой даты.
- Не уверен, почему он также не заполняет колонку 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. проблема была решена, она была связана с неправильным форматом даты.