Port87’s search bar is a full‑text, query‑language powered engine. It can search subjects, bodies, attachments, labels, dates, and more, without leaving the UI. In fact, every mail list you see inside Port87, like when you click the links in the sidebar, uses queries in the search bar to work.
When you type simple text into the search bar, Port87 will use a full text search on the subject, from address, sender address, body text, body html, and attachments.
A simple search works well, but when you need to really dig deep and find exactly what you're looking for, understanding Port87's powerful search feature can help.
Port87’s search bar is built on our open‑source Nymph.js Query Parser using the below properties. See its docs for full grammar and feature reference.
Port87's Full-Text Search engine is an open source implementation using our SciActive Tokenizer. This tokenizer performs word stemming using the Snowball algorithm, so the word "delivered" in an email will match queries like "deliver", "delivery", and "delivers", but not "liver". Stop words and punctuation are removed from both the search index and queries, so words like "is" and "the" will not match.
Our Full-Text Search engine supports search-engine-like syntax features:
'baseball tickets'. This syntax uses stemming, so it will match "baseball tickets", "baseball ticket", and "baseballs ticketed", for example."delivered" or "delivered today". This syntax does not use stemming, so it will only match "delivered" and "delivered today", respectively. Note that stop words and puntuation are still removed, so "delivered today" will still match text like "It is delivered. And then today we can't." (Since after stop words and punctuation are removed, this text becomes "delivered today".)music or video or 'vinyl records' or 'cassette tapes'.receipt -promo or delivered -"amazon.com".A "qref" (query reference) clause uses a subquery to find mail that references something that matches the subquery. Practically, this means mail that has a "body", "headers", or "labels" object that matches a given subquery. Because mail is stored in Port87 in three parts (Mail, Body, and Headers) and also references the labels it belongs to, qref clauses let you search for mail across all of these parts.
A qref clause identifies both the property that contains the reference, and the type of object (its class name) the reference refers to:
propertyname<{ClassName inner query}>
This is why you'll see both "body" and "Body" in a qref query for the body of an email, or "labels" and "Label" in a qref query for the labels of an email.
Matching the subject.
subject(amazon delivery)
Matching the from address.
from(hperrin-friends@port87.com)
Matching the body text. This uses a "qref" clause to find all mail that has a body that matches the text "your receipt".
body<{Body html(your receipt)}>
Matching attachment names. This also uses a "qref" clause, because attachment names are stored on the body entity.
body<{Body attachments(family.jpg)}>
In order to fully utilize Port87's search feature, it's helpful to understand the structure of an email inside Port87. The search bar searches for "Mail" objects, which represent an email message. You can use the properties of the mail objects to narrow your search.
The mail object has the following properties:
guid: A globally unique identifier. Every object has one.cdate: A timestamp of when the object was created.mdate: A timestamp of when the object was last modified.tags: A list of tags. These can include "system", "auto", "autoreply", "bare", "read", "draft", and "sent".labels: A list of labels applied to the email.receivedFrom: The "return path" address the email was received from.receivedTo: The "mail to" address the email was received to.headers: A headers object holding additional headers for the email.body: A body object holding the contents of the email.size: The message's size, in bytes.attachments: The number of attachments the email has.delivered: A boolean (true or false), representing whether the email was delivered. This will be false if an email is waiting for screening. This will also be false for draft emails.rejected: If a sent email was rejected, this contains the reason given by the destination server.trash: A timestamp of when the email was placed in the trash.threadId: A thread ID, which is shared by other emails a message relates to, like replies.The following properties come from the email's headers:
date: A timestamp of the "Date" header.subject: The "Subject" header.from: The "From" header, containing the author's name and address.sender: The "Sender" header. When an email is sent by another person than the From address, it can use the sender to specify who actually sent the email.replyTo: An address that replies should be directed to.to: The address or list of addresses the email was sent to.cc: The address or list of addresses the email was copied to.bcc: The address or list of addresses the email was blind copied to. This will only exist on your sent mail.messageId: A unique message identifier assigned by the sending server.inReplyTo: The message ID of the message this one is a reply to.references: The message IDs of all of the emails this one references (often includes older messages in a thread).In addition to these standard headers, an email contains other headers. These are stored on the object referenced in the headers property. This object uses the class name "Headers", and has the following properties:
guid: A globally unique identifier. Every object has one.cdate: A timestamp of when the object was created.mdate: A timestamp of when the object was last modified.The object referenced in the body property of the mail object stores an email message's content. This object uses the class name "Body", and has the following properties:
guid: A globally unique identifier. Every object has one.cdate: A timestamp of when the object was created.mdate: A timestamp of when the object was last modified.html: The HTML (formatted) content of the email.text: The plain text (unformatted) content of the email.attachments: A list of attachments on the email.The object(s) referenced in the labels property of the mail object are the labels assigned to the message. These objects use the class name "Label", and have the following properties:
guid: A globally unique identifier. Every object has one.cdate: A timestamp of when the object was created.mdate: A timestamp of when the object was last modified.name: The name of the label.id: The ID of the label. This creates the label's email address.domain: A reference to the Domain object of this label, if there is one.bare: If this label is for a domain, this is a boolean representing whether this label is used for messages addressed to the bare address on this domain.parent: A label object. This is the label this label is filed underneath.unread: The total unread email count.pending: A boolean representing if this label is pending.blocked: A boolean representing if this label is blocked.notifications: A boolean representing if this label sends notifications.aggbox: A boolean representing if this label is shown in the aggbox.markNewAsRead: A boolean representing if this label marks new messages as read.screening: A boolean representing if this label screens senders.screeningContacts: A boolean representing if this label even screens contacts.public: A boolean representing if this label is public.publicDescription: The public description of this label.When you search using the search bar, Port87 will automatically append some additional query parameters to the search to help with organization.
limit:10 is appended. This number can be adjusted in your settings. reverse:true is appended to show new emails first.<sent> or <!sent>
<!sent> is appended.[trash]
[!trash] is appended, then[delivered], [!delivered], or <draft>
[delivered] is appended.<spam> or <!spam>
<!spam> is appended.<bare> or <!bare>
<!bare> is appended.<autoreply> or <!autoreply>
<!autoreply> is appended.<draft> or <!draft>
<!draft> is appended.Example: subject(hello) becomes subject(hello) limit:10 reverse:true <!sent> [!trash] [delivered] <!spam> <!bare> <!autoreply> <!draft>
If you'd like to eliminate these added parameters, you can use an "or" selector to select for both possibilities.
Example: subject(hello) (| [delivered] [!delivered]) will find messages regardless of whether the sender has passed the screening check.
Port87 includes controls at the top of the search results to adjust these search settings. You'll notice that by using them, your search query is adjusted on the fly.