Items コレクションにフィルタをかけ、一致するアイテムのコレクションを返します。
条件式はJetクエリまたはDASLクエリで記述します。
コレクションにフィルタをかけるメソッドとしてItems.Restrict メソッドもありますが、違いは検索速度くらいで検索対象のアイテムが少ないときに使います。検索対象のアイテムが多いときはItems.Restrict メソッドを使うと良いです。
- 構文
- Items = Items.Restrict( Filter )
- 引数
- Filter 省略可
- 適用するフィルター文字列式
- 戻り値
- Items コレクションにフィルターを適用し、フィルターに一致するアイテムを含む新しいItems コレクションを返します。
Items オブジェクトを返すメソッド・プロパティ
- Items.Restrict メソッド
- Items コレクションにフィルタを適用し、フィルタに一致する元のすべてのアイテムを含む新しいItems コレクションを返します。
フィルタ
Jetクエリ
Outlook 2003以前のバージョンで使用されていたフィルタ式の記述方法で、AccessのJetデータベースエンジンと同じ構文を使用しています。
Jetクエリで使えるカラム([ ]で囲まれた名前)はMailItem オブジェクトのプロパティと同じと考えて大丈夫だと思います。
フィルタ | 説明 |
---|---|
[BCC] | ブラインド・カーボン・コピー(Blind Carbon Copy) |
[CC] | カーボン・コピー(Carbon Copy) |
[Importance] | 重要度。0:低、1:標準、2:高。 |
[LastModificationTime] | 最終更新日時。日時の形式を参照。 |
[ReceivedTime] | 受信日時。日時の形式を参照。 |
[SenderEmailAddress] | 送信元アドレス |
[SenderName] | 送信者名 |
[SentOn] | 送信日時 |
[Size] | メールのサイズ、バイト(Byte)単位。 |
[Subject] | 件名 |
[To] | 宛先 |
[UnRead] | メールの未既読を指定。TRUEなら未読、FALSEなら既読。 |
重要度(Importance)
重要度で絞り込みます。
Items = Items.Restrict("[Importance] = 0") // 低
Items = Items.Restrict("[Importance] = 1") // 標準
Items = Items.Restrict("[Importance] = 2") // 高
Items = Items.Restrict("[Importance] <= 1") // 低~標準
受信日時(ReceivedTime)
受信日時で絞り込みます。以下は受信日が2023/05/01のメール。[ReceivedTime]は日時情報も含んでいて日時と日付の比較ではマッチしないので、以下のように範囲で指定します。
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01' AND [ReceivedTime] < '2023/05/02'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 0:00' AND [ReceivedTime] < '2023/05/02 0:00'")
受信日時で絞り込みます。以下は受信日時が2023/05/08 09:00:00~2023/05/08 09:59:59のメール。
Items = Items.Restrict("[ReceivedTime] >= '2023/05/08 09:00 PM' AND [ReceivedTime] < '2023/05/08 10:00 PM'")
受信日時は分単位でしか指定できないため、秒単位で絞ることはできず範囲で絞るしかありません。以下は2023/05/08 21:15:00~2023/05/08 21:15:59に受信したメール。
Items = Items.Restrict("[ReceivedTime] >= '2023/05/08 09:15 PM' AND [ReceivedTime] < '2023/05/08 09:16 PM'")
送信者アドレス(SenderEmailAddress)
送信者アドレスで絞り込みます。以下は送信者アドレスがinfo@example.comのメール。
Items = Items.Restrict("[SenderEmailAddress] = 'info@example.com'")
送信者名(SenderName)
送信者名が空欄ではないメール。
Items = Items.Restrict("[SenderName] <> ''")
件名(Subject)
件名がキーワードに一致するメール。
Items = Items.Restrict("[Subject] = 'キーワード'")
サイズ(Size)
サイズで絞り込みます。以下はサイズが5000バイト以上のメール
Items = Items.Restrict("[Size] >= 5000")
サイズが1000~5000バイトのメール。
Items = Items.Restrict("[Size] >= 1000 AND [Size] <= 5000")
宛先(To)
宛先がinfo@example.comのメール。
Items = Items.Restrict("[To] = 'info@example.com'")
未既読(UnRead)
未読のメール。
Items = Items.Restrict("[UnRead] = TRUE")
既読のメール。
Items = Items.Restrict("[UnRead] = FALSE")
複数条件
複数の条件を指定する場合は条件を論理演算子(AND、OR)で繋げます。
Items = Items.Restrict("[ReceivedTime] >= '2023/05/09' AND [ReceivedTime] < '2023/05/10'")
DASLクエリ
Outlook 2007以降のバージョンで導入されたフィルタ式の記述方法で、SQLに似た構文を使用しています。
@SQL = 名前空間:プロパティ名 = 値
@SQL = 名前空間#フィールド名 = 値
@SQL = 名前空間#フィールド名 = 値1;値2;値3;
@SQL = 名前空間:プロパティ LIKE '%文字列%'
@SQL = 名前空間:プロパティ LIKE '%文字列'
@SQL = 名前空間:プロパティ名 IS NULL
名前空間
urn:schemas:httpmail
プロパティ名 | 説明 |
---|---|
attachmentfilename | |
bcc | BCC |
calendar | |
contacts | |
content-disposition-type | |
content-media-type | |
date | |
datereceived | 受信日時 |
deleteditems | |
displaybcc | |
displaycc | |
displayto | |
drafts | |
expiry-date | |
flagcompleted | |
from | |
fromemail | 送信元アドレス |
fromname | |
hasattachment | 添付ファイル True:あり、False:なし |
htmldescription | |
importance | 重要度 0:低、1:標準、2:高 |
inbox | |
journal | |
messageflag | |
msgfolderroot | |
normalizedsubject | |
notes | |
outbox | |
priority | |
read | 未既読。0:未読、1:既読 |
reply-by | |
reply-to | |
savedestination | |
saveinsent | |
sendmsg | |
sender | |
senderemail | |
sendername | |
sentitems | |
subject | 件名 |
submitted | |
tasks | |
textdescription | 本文 |
thread-topic | |
to | |
unreadcount |
urn:schemas-microsoft-com:office:office | Keywords | 分類項目 |
重要度(Importance)
重要度が標準のメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:importance=1")
受信日時(datereceived)
受信日が2023/05/01のメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:datereceived >= '2023/05/01'")
受信日が今日のメール。
Items = Items.Restrict("@SQL=%today(urn:schemas:httpmail:datereceived)%")
受信日が昨日のメール。
Items = Items.Restrict("@SQL=%yesterday(urn:schemas:httpmail:datereceived)%")
受信日が今週のメール。
Items = Items.Restrict("@SQL= %thisweek(urn:schemas:httpmail:datereceived)%")
受信日が先週のメール。
Items = Items.Restrict("@SQL= %lastweek(urn:schemas:httpmail:datereceived)%")
受信日が今月のメール。
Items = Items.Restrict("@SQL=%thismonth(urn:schemas:httpmail:datereceived)%")
受信日が先月のメール。
Items = Items.Restrict("@SQL=%lastmonth(urn:schemas:httpmail:datereceived)%")
SQLで複数の条件を指定する場合は、Restrictメソッドを繰り返し実行します。以下は受信日時が今日で件名に重要を含むメール。
Items = Items.Restrict("@SQL=%today(urn:schemas:httpmail:datereceived)%")
Items = Items.Restrict("@SQL=urn:schemas:httpmail:subject LIKE '%重要%'")
件名(Subject)
件名が重要で始まるメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:subject LIKE '重要%'")
件名が重要を含むメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:subject LIKE '%重要%'")
件名がRE:で始まるメール。大文字小文字の区別はなし。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:subject like 'RE:%'")
件名がFW:で始まるメール。大文字小文字の区別はなし。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:subject like 'FW:%'")
カテゴリ(Categories)
カテゴリがついていないメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:categories like ''")
添付ファイル
添付ファイルがあるメール。
Items = Items.Restrict("@SQL= urn:schemas:httpmail:hasattachment=True")
添付ファイルがないメール。
Items = Items.Restrict("@SQL= urn:schemas:httpmail:hasattachment=False")
送信元アドレス(fromemail)
送信元アドレスに@docomo.ne.jpを含むメール。後方一致ができないので部分一致で行っています。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:fromemail LIKE '%@docomo.ne.jp%'")
複数条件
受信日時が2023/05/01のメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:datereceived>='2023/05/01' AND urn:schemas:httpmail:datereceived<'2023/05/02'")
受信日時が2023/01/01以降で添付ファイルがあるメール。
Items = Items.Restrict("@SQL=urn:schemas:httpmail:datereceived>='2023/01/01' AND urn:schemas:httpmail:hasattachment=True")
日時の形式
以下の形式の組み合わせで記述することができます。時刻区分(午前/午後)を指定しなかった場合、時刻は24時間表記となります。
- <日付>
- <日付> <時刻>
- <日付> <時刻><時刻区分>
- <日付> <時刻> <時刻区分>
- <日付> <時刻区分><時刻>
- <日付> <時刻区分> <時刻>
- <時刻区分><時刻> <日付>
- <時刻区分> <時刻> <日付>
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 12:00'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 05:00AM'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 05:00 AM'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 AM05:00'")
Items = Items.Restrict("[ReceivedTime] >= '2023/05/01 AM 05:00'")
Items = Items.Restrict("[ReceivedTime] >= 'AM05:00 2023/05/01'")
Items = Items.Restrict("[ReceivedTime] >= 'AM 05:00 2023/05/01'")
日付の形式
- YYYY/MM/DD
- MM/DD/YYYY
- YYYY/M/D
- M/D/YYYY
- YYYY年MM月DD日
- MM月DD日YYYY年
時刻の形式
- HH:MM
- H:M
時刻区分
- 午前/午後
- AM/PM
- A/P
AM0:00、AM12:00は24時間表記の0:00、PM0:00、PM12:00は24時間表記の12:00を指します。
時刻を24時間表記で記述した場合、時刻区分は記述しても無視されます。
以下はどちらも2023/05/10 13:00を指します。
2023/05/10 13:00 AM
2023/05/10 13:00 PM
LIKE句
列(カラム)に対して文字列検索を行うことができます。
クエリ | 説明 |
---|---|
LIKE '<文字列>' | 完全一致 |
LIKE '<文字列>%' | 前方一致 |
LIKE '%<文字列>%' | 文字列を含む |
比較演算子・論理演算子
演算子 | 意味 |
---|---|
a = b | aとbが等しい |
a < b | aがb未満より小さい |
a <= b | aがb以下 |
a > b | aがbより大きい |
a >= b | aがb以上 |
a <> b | aとbが等しくない |
a AND b | aかつb |
a OR b | aまたはb |
IS NULL | 否定 |
フィルタにかけたメールの件数を求めるにはItems.Restrict メソッドを使います。以下は未読メールの件数を取得します。
DIM Items = Folder.Items.Restrict("[UnRead] = TRUE")
PRINT Items.Count
ここにはない演算子を使って条件を指定する場合は、MailItemでループするときにIF文を使います。
以下は受信日時が2022/01/01〜2022/01/31の範囲で、件名に
Items = Items.Restrict("[ReceivedTime] >= '2022/01/01' AND [ReceivedTime] <= '2022/01/31'")
FOR MailItem IN Items
IFB POS("重要", MailItem.Subject) <> 0 THEN
ENDIF
NEXT
プログラム実行例
指定期間に受信したメールを取得(Outlook)
CONST olFolderInbox = 6
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderInbox)
DIM Items = Folder.Items
DIM start = "2022/01/01"
DIM end = "2022/01/31"
Items = Items.Restrict("[ReceivedTime] >= '" + start + "' AND [ReceivedTime] < '" + end + "'")
FOR MailItem IN Items
WITH MailItem
PRINT "受信日時:<#TAB>" + .ReceivedTime
PRINT "件名:<#TAB><#TAB>" + .Subject
PRINT "----------"
ENDWITH
NEXT
指定期間のメール情報を取得(Outlook)
CONST olFolderInbox = 6
CONST xlTop = -4160
CONST xlLeft = -4131
DIM Excel = ExcelBoot()
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderInbox)
DIM Items = Folder.Items
DIM start = "2021/01/01"
DIM end = "2021/01/02"
Items = Items.Restrict("[ReceivedTime] >= '" + start + "' AND [ReceivedTime] < '" + end + "'")
DIM array[][1] = "受信日時", "ReceivedTime", + _
"送信者メールアドレス", "SenderEmailAddress", + _
"送信者", "SenderName", + _
"CC", "CC", + _
"BCC", "BCC", + _
"件名", "Subject", + _
"本文", "Body", + _
"HTML本文", "HTMLBody"
Excel.Application.ScreenUpdating = FALSE
FOR i = 0 TO UBound(array)
Excel.Cells(1, i + 1).Value = array[i][0]
NEXT
DIM row = 2
FOR MailItem IN Items
FUKIDASI(row + "/" + Items.Count)
WITH MailItem
FOR i = 0 TO UBound(array)
Excel.Cells(row, i + 1).Value = EVAL("." + array[i][1])
NEXT
ENDWITH
row = row + 1
NEXT
WITH Excel.Range("A1").CurrentRegion
.ColumnWidth = 20
.RowHeight = 30
.VerticalAlignment = xlTop
.HorizontalAlignment = xlLeft
ENDWITH
Excel.Application.ScreenUpdating = TRUE
指定期間に受信したメールからURLを抽出(Outlook)
HASHTBL url = HASH_SORT
CONST olFolderInbox = 6
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderInbox)
DIM Items = Folder.Items
DIM start = "2021/01/01"
DIM end = "2021/01/07"
Items = Items.Restrict("[ReceivedTime] >= '" + start + "' AND [ReceivedTime] <= '" + end + "'")
DIM row = 1
FOR MailItem IN Items
FUKIDASI(row + "/" + Items.Count)
DIM Matches = reExecute(MailItem.Body, "https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?")
FOR Match IN Matches
url[Match.Value] = url[Match.Value] + 1
NEXT
row = row + 1
NEXT
FOR i = 0 TO LENGTH(url) - 1
FUKIDASI(i + "/" + (LENGTH(url) - 1))
PRINT url[i, HASH_KEY]
NEXT
指定期間に受信したメールの添付ファイルをすべて保存(Outlook)
CONST olFolderInbox = 6
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderInbox)
DIM Items = Folder.Items
DIM start = "2021/01/01"
DIM end = "2021/01/31"
Items = Items.Restrict("[ReceivedTime] >= '" + start + "' AND [ReceivedTime] <= '" + end + "'")
DIM folderspec = "D:\Desktop\Outlook\"
CreateFolders(folderspec)
DIM row = 1
FOR MailItem IN Items
FUKIDASI(row + "/" + Items.Count)
FOR i = 1 TO MailItem.Attachments.Count
DIM Attachment = MailItem.Attachments.Item(i)
DIM path = folderspec + Attachment
path = uniqueFilename(path)
Attachment.SaveAsFile(path)
PRINT path
NEXT
row = row + 1
NEXT
指定期間のメールを日毎に集計(Outlook)
CONST olFolderIndex = 6
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderIndex)
DIM Items = Folder.Items
Items = Items.Restrict("[ReceivedTime] >= '2020/12/01' AND [ReceivedTime] < '2020/12/31'")
HASHTBL dates = HASH_SORT
FOR MailItem IN Items
DIM datetime = MailItem.ReceivedTime
GETTIME(0, datetime)
DIM date = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
dates[date] = dates[date] + 1
NEXT
FOR i = 0 TO LENGTH(dates) - 1
PRINT dates[i, HASH_KEY] + "<#TAB>" + dates[i, HASH_VAL]
NEXT
- Items.Restrict メソッド (Outlook) | Microsoft Learn
- https://platform.kobot.jp/support/solutions/articles/47001150388-outlook%E3%83%A1%E3%83%BC%E3%83%AB%E5%8F%96%E5%BE%97%E6%99%82%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
- https://vicugna-pacos.github.io/vba/outlook/search-and-filter/
- Get Outlook Mail activity Filter with From AND Subject - Help - UiPath Community Forum
- Compoze Software API Documentation: Class HttpMailProperty
2020/12/05 78
2020/12/06 60
2020/12/07 72
2020/12/08 82
2020/12/09 75
2020/12/10 91
2020/12/11 82
2020/12/12 77
2020/12/13 63
2020/12/14 71
2020/12/15 104
2020/12/16 84
2020/12/17 80
2020/12/18 93
2020/12/19 78
2020/12/20 66
2020/12/21 67
2020/12/22 75
2020/12/23 82
2020/12/24 73
2020/12/25 87
2020/12/26 73
2020/12/27 56
2020/12/28 65
2020/12/29 69
2020/12/30 44
2020/12/31 1
過去7日間に受信した迷惑メールの受信日時とメールアドレスを取得
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folders = NameSpace.Folders("Yahoo!_新").Folders("迷惑メール")
DIM startDate = dateAdd("d", -7, today())
DIM endDate = dateAdd("d", -1, today())
DIM Items = Folders.Items.Restrict("[ReceivedTime] >= '" + startDate + "' AND [ReceivedTime] < '" + endDate + "'")
DIM count = Items.Count
Items.Sort("受信日時")
FOR Index = 1 TO count
WITH Items.Item(Index)
PRINT .ReceivedTime + "<#TAB>" + .SenderEmailAddress
ENDWITH
NEXT
未読メールの本文からURLを抽出
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.Folders("Android_新").Folders("受信トレイ")
DIM Items = Folder.Items.Restrict("[UnRead] = TRUE")
Items.Sort("受信日時", TRUE)
// クリックするURLを格納した配列(部分一致)
DIM urls[] = "://example.com"
DIM driver = CREATEOLEOBJ("Selenium.WebDriver")
WebDriverDownload.Chrome()
// ログイン情報を保存
CONST PROFILE_PATH = "C:\Users\" + BETWEENSTR(DOSCMD("SET"), "USERNAME=", "<#CR>") + "\AppData\Local\Google\Chrome\User Data\Default"
driver.AddArgument("user-data-dir=" + PROFILE_PATH)
driver.Start("chrome")
DIM count = Items.Count
FOR Index = count TO 1 STEP -1
WITH Items.Item(Index)
FUKIDASI(Index + "<#TAB>" + .SenderEmailAddress + "<#TAB>" + .ReceivedTime)
DIM Matches = reExecute(.Body, "https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?")
// メール本文のURLをループ
FOR Match IN Matches
// クリックするURLをチェック
FOR i = 0 TO UBound(urls)
IF POS(urls[i], Match.Value) = 0 THEN CONTINUE
driver.Get(Match.Value) // リンクを開く
NEXT
NEXT
SLEEP(1.000)
ENDWITH
NEXT
参考文献
関連記事
- MailItem オブジェクト
- メールメッセージを表します。
- MailItem.Attachments プロパティ (Outlook)
- メールに添付されているすべての添付ファイルを表すOutlook.Restrictを返します。
- MailItem.BodyFormat プロパティ (Outlook)
- メール本文の形式を表すOlBodyFormatクラスの定数を取得または設定します。
- MailItem.To プロパティ (Outlook)
- Outlook アイテムの宛先の受信者の表示名一覧を表す、セミコロン(;)で区切られた文字列型(String) の一覧を設定します。
- MailItem.HTMLBody プロパティ (Outlook)
- メールのHTML形式の本文を表す文字列型の値を取得または設定します。
- MailItem.Parent プロパティ (Outlook)
- 指定したオブジェクトの親オブジェクトを返します。
- MailItem.ReceivedTime プロパティ (Outlook)
- アイテムを受信した日付と時刻を示す日付型(Date)の値を取得します。
- CDO.From プロパティ
- メッセージの差出人(From)を指定します。
- AppointmentItem オブジェクト
- 新しい予定を表すAppointmentItemオブジェクトを作成します。
- Folder オブジェクト