/// <summary> /// Gets if specified message matches with this class search-key. /// </summary> /// <param name="no">IMAP message sequence number.</param> /// <param name="uid">IMAP message UID.</param> /// <param name="size">IMAP message size in bytes.</param> /// <param name="internalDate">IMAP message INTERNALDATE (dateTime when server stored message).</param> /// <param name="flags">IMAP message flags.</param> /// <param name="message">Mime message main header only.</param> /// <param name="bodyText">Message body text.</param> /// <returns></returns> public bool Match(long no, long uid, long size, DateTime internalDate, IMAP_MessageFlags flags, Mail_Message message, string bodyText) { #region ALL // ALL // All messages in the mailbox; the default initial key for ANDing. if (m_SearchKeyName == "ALL") { return(true); } #endregion #region BEFORE // BEFORE <date> // Messages whose internal date (disregarding time and timezone) // is earlier than the specified date. else if (m_SearchKeyName == "BEFORE") { if (internalDate.Date < (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region BODY // BODY <string> // Messages that contain the specified string in the body of the message. // // NOTE: Compare must be done on decoded header and decoded body of message. // In all search keys that use strings, a message matches the key if // the string is a substring of the field. The matching is case-insensitive. else if (m_SearchKeyName == "BODY") { string val = bodyText; if (val != null && val.ToLower().IndexOf(((string)m_SearchKeyValue).ToLower()) > -1) { return(true); } } #endregion #region HEADER // HEADER <field-name> <string> // Messages that have a header with the specified field-name (as // defined in [RFC-2822]) and that contains the specified string // in the text of the header (what comes after the colon). If the // string to search is zero-length, this matches all messages that // have a header line with the specified field-name regardless of // the contents. // // NOTE: Compare must be done on decoded header field value. // In all search keys that use strings, a message matches the key if // the string is a substring of the field. The matching is case-insensitive. else if (m_SearchKeyName == "HEADER") { string[] headerField_value = (string[])m_SearchKeyValue; // If header field ends with ":", remove it. if (headerField_value[0].EndsWith(":")) { headerField_value[0] = headerField_value[0].Substring(0, headerField_value[0].Length - 1); } if (string.IsNullOrEmpty(headerField_value[1])) { return(true); } else { MIME_h h = message.Header.GetFirst(headerField_value[0]); if (h == null) { return(false); } else { if (h.ValueToString().ToLower().IndexOf(headerField_value[1].ToLower()) > -1) { return(true); } } } } #endregion #region KEYWORD // KEYWORD <flag> // Messages with the specified keyword flag set. else if (m_SearchKeyName == "KEYWORD") { if ((flags & IMAP_Utils.ParseMessageFlags((string)m_SearchKeyValue)) != 0) { return(true); } } #endregion #region LARGER // LARGER <n> // Messages with an [RFC-2822] size larger than the specified number of octets. else if (m_SearchKeyName == "LARGER") { if (size > (long)m_SearchKeyValue) { return(true); } } #endregion #region NOT // NOT <search-key> or (<search-key> <search-key> ...)(SearchGroup) // Messages that do not match the specified search key. else if (m_SearchKeyName == "NOT") { return(!SearchGroup.Match_Key_Value(m_SearchKeyValue, no, uid, size, internalDate, flags, message, bodyText)); } #endregion #region ON // ON <date> // Messages whose internal date (disregarding time and timezone) // is within the specified date. else if (m_SearchKeyName == "ON") { if (internalDate.Date == (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region OR // OR <search-key1> <search-key2> - SearckKey can be parenthesis list of keys ! // Messages that match either search key. else if (m_SearchKeyName == "OR") { object serachKey1 = ((object[])m_SearchKeyValue)[0]; object serachKey2 = ((object[])m_SearchKeyValue)[1]; if (SearchGroup.Match_Key_Value(serachKey1, no, uid, size, internalDate, flags, message, bodyText) || SearchGroup.Match_Key_Value(serachKey2, no, uid, size, internalDate, flags, message, bodyText)) { return(true); } } #endregion #region SENTBEFORE // SENTBEFORE <date> // Messages whose [RFC-2822] Date: header (disregarding time and // timezone) is earlier than the specified date. else if (m_SearchKeyName == "SENTBEFORE") { if (message.Date.Date < (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region SENTON // SENTON <date> // Messages whose [RFC-2822] Date: header (disregarding time and // timezone) is within the specified date. else if (m_SearchKeyName == "SENTON") { if (message.Date.Date == (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region SENTSINCE // SENTSINCE <date> // Messages whose [RFC-2822] Date: header (disregarding time and // timezone) is within or later than the specified date. else if (m_SearchKeyName == "SENTSINCE") { if (message.Date.Date >= (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region SINCE // SINCE <date> // Messages whose internal date (disregarding time and timezone) // is within or later than the specified date. else if (m_SearchKeyName == "SINCE") { if (internalDate.Date >= (DateTime)m_SearchKeyValue) { return(true); } } #endregion #region SMALLER // SMALLER <n> // Messages with an [RFC-2822] size smaller than the specified number of octets. else if (m_SearchKeyName == "SMALLER") { if (size < (long)m_SearchKeyValue) { return(true); } } #endregion #region TEXT // TEXT <string> // Messages that contain the specified string in the header or body of the message. // // NOTE: Compare must be done on decoded header and decoded body of message. // In all search keys that use strings, a message matches the key if // the string is a substring of the field. The matching is case-insensitive. else if (m_SearchKeyName == "TEXT") { // See body first string val = bodyText; if (val != null && val.ToLower().IndexOf(((string)m_SearchKeyValue).ToLower()) > -1) { return(true); } // If we reach so far, that means body won't contain specified text and we need to check header. foreach (MIME_h headerField in message.Header) { if (headerField.ToString().ToLower().IndexOf(((string)m_SearchKeyValue).ToLower()) > -1) { return(true); } } } #endregion #region UID // UID <sequence set> // Messages with unique identifiers corresponding to the specified // unique identifier set. Sequence set ranges are permitted. else if (m_SearchKeyName == "UID") { return(((IMAP_SequenceSet)m_SearchKeyValue).Contains(uid)); } #endregion #region UNKEYWORD // UNKEYWORD <flag> // Messages that do not have the specified keyword flag set. else if (m_SearchKeyName == "UNKEYWORD") { if ((flags & IMAP_Utils.ParseMessageFlags((string)m_SearchKeyValue)) == 0) { return(true); } } #endregion #region SEQUENCESET // <sequence set> // Messages with message sequence numbers corresponding to the // specified message sequence number set. else if (m_SearchKeyName == "SEQUENCESET") { return(((IMAP_SequenceSet)m_SearchKeyValue).Contains(no)); } #endregion return(false); }