MailItem Find Method question

S

Salad

Using the Find method to find a Subject, I have a couple of questions.
If the Subject is "Test", the following code finds the email. If the
subject is "Re: Test", it does not. I have to remove the prefix. Why
is that?

If the subject is null, my code doesn't find the email. I figure
someone can send an email without a subject. Any idea on correcting it?

If Not IsNull(strSubject) Then
Set objMail = _
objNS.GetDefaultFolder(6).Items.Find("[Subject] = """ & _
strSubject & """")
Else
Set objMail = _
objNS.GetDefaultFolder(6).Items.Find("[Subject] Is Null")
End If

I have a question on finding the email by date as well. I pass a date
field to the function. It converts the date time to a string then
searches. Out of 10 email times passed to it, if found only 1. Any
idea whay the code below fails the majority of the time?

strTime = Format(datTime, "m/d/yyyy h:nn AMPM")
Set objMail = objNS.GetDefaultFolder(6).Items.Find("[ReceivedTime]= """
& strTime & """")
 
M

Michael Bauer [MVP - Outlook]

If strSubject is declared as a String type, it never will be Null. Instead
use IsEmpty, or even better just:

If str="" then...

Actually you'd need the LIKE operator in the filter, but that's not
supported. So you'd have to loop through all the collection, and check each
item with
If item.subject like "*whatever*" Then ...

More flexible, and a lot faster, are the Restriction* objects from the
Redemption (www.dimastr.com)

--
Best regards
Michael Bauer - MVP Outlook
Manage and share your categories:
<http://www.vboffice.net/product.html?pub=6&lang=en>


Am Sun, 21 Feb 2010 15:28:08 -0800 schrieb Salad:
 
D

Dmitry Streblechenko

Under the hood, Outlook searches on the PR_NORMALIZED_SUBJECT (which does
not include the prefix), not PR_SUBJECT.
Where does the strSubject come from? Do you actually store it? Or does the
user type it?

--
Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
-
 
S

Salad

Dmitry said:
Under the hood, Outlook searches on the PR_NORMALIZED_SUBJECT (which does
not include the prefix), not PR_SUBJECT.
Where does the strSubject come from? Do you actually store it? Or does the
user type it?

In Access, one can do a File/Import/GetExternalData and link an inbox,
sent, etc folder and it's now a table, similar to an Excel spreadsheet.
So I'm using info from the inbox in my testing.

One of the fields is "Subject" that contains the entire subject line
"Re: Test". Another field is "Subject Prefix" with just the "Re:", and
"Normalized Subject" that contains "Test"

Besides the subject fields , there's also the
received/created/lastmodified columns, the email size, sender name, and
a few other fields like the body.

I thought it'd be relatively simple to find the email.
Works like a champ on the normalized subject as you noted.
I can'r find the email if the subject line is null.
I can't find the email based on any datetime stamp.
Works like a champ on message size.

But I figure there can be one or more emails with the same subject line,
same message size, or same datetimestamp. But all three? I don't think so.

Since the .Find method works fine on the subject and size fields, I'm
obviously passing the wrong filter for a null (blank) subject and for
the date.

I've tried, and failed on
.Find("IsEmpty([Subject]")
.Find("IsNull([Subject]")
.Find("[Subject] = ''")
and for dates
'Set objMail = .Find("[ReceivedTime]= '1/1/2010 3:34:00 AM'")
and Jan 1, 2010, January 1,2010, no seconds, no AM, just the date,
nothing works. Single quotes, double quotes, it doesn't seem to matter.

Based on the above, do you spot anything obvious that is in error? Or
other tests I could make? Or a link to compare my code to for finding
an email?
 
D

Dmitry Streblechenko

Searching by subject is a bad idea, to put it mildly :) What happens if you
have multiple messsages with the same subject?
Use the EntryID property and open the item using using
Application.Session.GetItemFromID. There is no reason to search.

--
Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
-
Salad said:
Dmitry said:
Under the hood, Outlook searches on the PR_NORMALIZED_SUBJECT (which
does not include the prefix), not PR_SUBJECT.
Where does the strSubject come from? Do you actually store it? Or does
the user type it?

In Access, one can do a File/Import/GetExternalData and link an inbox,
sent, etc folder and it's now a table, similar to an Excel spreadsheet. So
I'm using info from the inbox in my testing.

One of the fields is "Subject" that contains the entire subject line "Re:
Test". Another field is "Subject Prefix" with just the "Re:", and
"Normalized Subject" that contains "Test"

Besides the subject fields , there's also the
received/created/lastmodified columns, the email size, sender name, and a
few other fields like the body.

I thought it'd be relatively simple to find the email.
Works like a champ on the normalized subject as you noted.
I can'r find the email if the subject line is null.
I can't find the email based on any datetime stamp.
Works like a champ on message size.

But I figure there can be one or more emails with the same subject line,
same message size, or same datetimestamp. But all three? I don't think
so.

Since the .Find method works fine on the subject and size fields, I'm
obviously passing the wrong filter for a null (blank) subject and for the
date.

I've tried, and failed on
.Find("IsEmpty([Subject]")
.Find("IsNull([Subject]")
.Find("[Subject] = ''")
and for dates
'Set objMail = .Find("[ReceivedTime]= '1/1/2010 3:34:00 AM'")
and Jan 1, 2010, January 1,2010, no seconds, no AM, just the date, nothing
works. Single quotes, double quotes, it doesn't seem to matter.

Based on the above, do you spot anything obvious that is in error? Or
other tests I could make? Or a link to compare my code to for finding an
email?
 
S

Salad

Dmitry said:
Searching by subject is a bad idea, to put it mildly :) What happens if you
have multiple messsages with the same subject?
Use the EntryID property and open the item using using
Application.Session.GetItemFromID. There is no reason to search.
Wouldn't you know, EntryID is not one of the columns in the table tha is
created in Access if one links a folder.

Well, MS gave us/me the partial information, but not all unfortunately.
The table lets one know if there are attachments or not, but not the
attachment names nor as it appears an easy way to find the email. Thus
I'd need a way to find the email if it had attachments.
 
D

Dmitry Streblechenko

If you cannot get entry id as one of the columns, don't use
File/Import/GetExternalData.

--
Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
-
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top