======Spam Filter Rules: IfMatch====== ^Statement |IfMatch | ^Version |2.1.7+ | ^Purpose |Allows you to perform a regular or substring match on a variable or part of the message being processed | **IfMatch** statements require a data parameter and a search value, in the format IfMatch The **IfMatch** statement must be terminated with an **EndIf** and may contain an **Else** statement, just like the [[spamrules_statement_if|If]] statement. =====Data===== ^ Parameter name ^ Description ^ Version ^ ^${variable} |Allows you to search a variable's content |2.1.7 | ^text |This searches any plain text part of the message, but does not search attachments |2.1.7 | ^texta |This performs the same task as **text**, but also searches plain text attachments |2.1.7 | ^body |This searches any plain text or HTML part of the message. HTML parts have the HTML tags stripped out and are converted to plain text before searching them.|2.1.7 | ^bodya |This performs the same task as **body**, but also searches plain text attachments |2.1.7 | ^anytext |This performs the same task as **body**, but also searches the subject line |2.1.7 | ^anytexta |This performs the same task as **bodya**, but also searches the subject line |2.1.7 | ^htmlsource |This searches the raw HTML source of the message |2.1.7 | ^htmlsourcea |This performs the same task as **htmlsource**, but also searches plain text attachments |2.1.7 | ^htmltext |This searches the text of any HTML parts of the message, after stripping out tags and converting HTML to plain text |2.1.7 | ^htmltexta |This performs the same task as **htmltext**, but also searches plain text attachments |2.1.7 | ^raw-header |This searches the entire message header, without any decoding being performed |2.1.7 | ^header |This searches the entire message header, with any MIME encoded header lines being decoded first |2.1.7 | ^tag |This searches all the HTML tags in the message |2.1.7 | ^rawurl |This searches all the URLs in the message in the form they are in the message |2.1.7 | ^url |This searches all the URLs in the message after they have been decoded (e.g. %xx encodings have been converted to the actual character) |2.1.7 | ^rcpt |This searches all the recipients of the message that VPOP3 knows about (i.e. all recipients in the SMTP envelope, or all recipients which VPOP3 thinks the message is for) |2.1.7 | ^senderip |This allows you to check if the sender's IP address is local or remote (test for 'local' or 'remote') |2.1.7 | ^protocol |This allows you to check whether VPOP3 received the message using SMTP or POP3 (test for 'smtp' or 'pop3') |2.1.7 | ^whitelist |This allows you to see if the search text is in the spam whitelist |2.1.7 | ^blacklist |This allows you to see if the search text is in the spam blacklist |2.1.7 | ^'''' |This lets you search a specific field in the message header. Any header name can be used. Any MIME encoded header lines will be decoded before searching them. The header name should be typed without the angle brackets (<>).|2.1.7 | ^Raw-'''' |This lets you search a specific field in the message header. Any header name can be used. MIME encoded header lines will not be decoded before searching them. The header name should be typed without the angle brackets (<>). |2.1.7 | ^attachment |This searches all the attachment filenames in the message |2.1.11 | ^rawmessage |This lets you search through the first 10kB of the raw, undecoded message content.|2.2.1 | ^rawmessageall |This lets you search through the entire raw, undecoded message content. This should be used with caution as it may make the spam filter very slow if large attachments are being received.|2.2.1 | =====Search===== The search parameter to the **IfMatch** statement can either be a regular expression or a simple case insensitive substring search string. You should put quotes around the text or Perl Compatible Regular Expression (PCRE) to search for. To specify a regular expression surround it with '/' characters, otherwise VPOP3 will do a single case insensitive substring search. With regular expressions, it will normally do a case sensitive search, treating the entire search data as a single line. You can modify this behaviour by adding characters after the final '/' character: ^i |The search will be case insensitive | ^m |The search will treat the input data as multiline data – this means that the $ and ^ characters match at the start and end of a line rather than the start and end of the entire data | ^n |An empty string is not considered to be a valid match if this option is set. For example, without this option set, a match of a?b? will always match, but may match the empty string at the start of the search string. | ^s |The search will let the . (dot) character match a newline character as well as other characters | ^x |Whitespace characters in the search pattern are ignored except when escaped or within a character class | ^A |The pattern is forced to be 'anchored' to the start of the search string | ^D |The dollar character matches only at the end of the search string. Without this, it can also match immediately before the final character if it is a newline character. | ^U |The search will be “ungreedy” instead of the default mode of greedy. | =====Example===== This following example will perform a case insensitive regular expression search of the Subject line of the message header to see if it contains the text **hello** anywhere. IfMatch subject "/.*hello.*/i" # Statements EndIf The example above does not need a regular expression and could also be achieved with a substring search, like so: IfMatch subject "hello" # Statements EndIf This following example uses a regular expression to check whether a Cc header is present IfMatch cc "/./" # Statements EndIf