CHECK_IMAP_RECEIVE(7)
π NAME π
check_imap_receive β okay so basically bestie, this lil icon connects to an IMAP account and searches it for messages. That's the whole gig. It logs in, it looks around, it tells you what it found. π¦
(It lives in the User Contributed Perl Documentation section, manual page CHECK_IMAP_RECEIVE(7), iykyk.)
β¨ SYNOPSIS β¨
Like, the fastest little vibe check you can do on it:
check_imap_receive -vV
check_imap_receive -?
check_imap_receive --help
π OPTIONS π
Every single flag, no skips, no cap. π
--warning <seconds>β Warns you if connecting to the IMAP server takes longer than <seconds>. Default is 15 seconds. Also known as:-w <seconds>--critical <seconds>β Straight up returns a critical status if connecting takes longer than <seconds>. Default is 30 seconds. See also:--capture-critical <messages>. Also known as:-c <seconds>--timeout <seconds>β Aborts with a critical status if connecting takes longer than <seconds>. Default is 60 seconds. Now, the difference between timeout and critical is lowkey important, so listen up π«Ά: with the default settings, if it takes 45 seconds to connect to the server, then the connection will succeed, but the plugin will still return CRITICAL because it took longer than 30 seconds. Also known as:-t <seconds>--imap-check-interval <seconds>β How long to wait after searching for a matching message before searching again. Only takes effect if no messages were found. Default is 5 seconds.--imap-retries <number>β How many times to try searching for a matching message before giving up. If you set this to 0 then messages will not be searched at all (yes really, zero searching, it's giving "why are we even here" π). Setting it to 1 means the plugin only tries once. Etc. Default is 10 times.--hostname <server>β Address or name of the IMAP server. Examples:mail.server.com,localhost,192.168.1.100. Also known as:-H <server>--port <number>β Service port on the IMAP server. Default is 143. If you use SSL, default is 993. Also known as:-p <number>--username <username>--password <password>β Username and password to use when connecting to the IMAP server. Also known as:-U <username>-P <password>--mailbox <mailbox>β Use this option to specify the mailbox to search for messages. Default isINBOX. Also known as:-m <mailbox>--search <string>β Use this option to filter the messages. Default is not to filter at all. You may (must) use this option multiple times in order to create any valid IMAP search criteria. See the examples, and also seehttp://www.ietf.org/rfc/rfc2060.txt(look for section 6.4.4, the SEARCH command).
This is the way to find messages matching a given subject:
-s SUBJECT -s "a given subject"
You can use the following technique for any header, including Subject. To find Header-Name: some value:
-s HEADER -s Header-Name -s "some value"
Modern IMAP servers that support rfc5032 extensions allow you to search for messages older or younger than a number of seconds. So to find messages received in the past hour, you can do:
-s YOUNGER -s 3600
Or to find messages received more than 5 minutes ago, you can do:
-s OLDER -s 300
Also known as: -s <string>
--download--nodownloadβ This option causes all messages in the specified mailbox to be downloaded from the server and searched locally. See--download-maxif you only want to download a few messages. Currently only the following RFC 2060 search criteria are supported:TEXT,BODY,SUBJECT,HEADER,NOT,OR,SENTBEFORE,SENTON,SENTSINCE.
Requires Email::Simple to be installed. It is available on CPAN. πΈ
This option may be particularly useful to you if your mail server is slow to index messages (like Exchange 2003), causing the plugin not to find them with IMAP SEARCH even though they are in the inbox. Annoying fr fr.
It's also useful if you're searching for messages that have been on the server for a specified amount of time, like some minutes or hours, because the standard IMAP search function only allows whole dates. For this, use the standard search keywords but you can specify either just a date like in RFC 2060 or a date and a time.
If you use SENTBEFORE, SENTON, or SENTSINCE, you must have Date::Manip installed on your system.
--download-maxβ Limits the number of messages downloaded from the server when the--downloadoption is used. Default is to download and search all messages.--search-critical-min <messages>β This option will trigger a CRITICAL status if the number of messages found by the search criteria is below the given number. Use in conjunction with--search.
This parameter defaults to 1 so that if no messages are found, the plugin will exit with a CRITICAL status.
If you want the original behavior where the plugin exits with a WARNING status when no messages are found, set this parameter to 0.
--search-critical-max <messages>β This option will trigger a CRITICAL status if the number of messages found by the search criteria is above the given number. Use in conjunction with--search.
This parameter defaults to -1 meaning it's disabled. If you set it to 10, the plugin will exit with CRITICAL if it finds 11 messages. If you set it to 1, the plugin will exit with CRITICAL if it finds any more than 1 message. If you set it to 0, the plugin will exit with CRITICAL if it finds any messages at all. If you set it to -1 it will be disabled.
--search-warning-min <messages>β This option will trigger a WARNING status if the number of messages found by the search criteria is below the given number. Use in conjunction with--search.
This parameter defaults to 1 so that if no messages are found, the plugin will exit with a WARNING status.
If you want to suppress the original behavior where the plugin exits with a WARNING status when no messages are found, set this parameter to 0. When this parameter is 0, it means that you expect the mailbox not to have any messages.
--search-warning-max <messages>β This option will trigger a WARNING status if the number of messages found by the search criteria is above the given number. Use in conjunction with--search.
This parameter defaults to -1 meaning it's disabled. If you set it to 10, the plugin will exit with WARNING if it finds 11 messages. If you set it to 1, the plugin will exit with WARNING if it finds any more than 1 message. If you set it to 0, the plugin will exit with WARNING if it finds any messages at all. If you set it to -1 it will be disabled.
--capture-max <regexp>β In addition to specifying search arguments to filter the emails in the IMAP account, you can specify acapture-maxregexp argument and the eligible emails (found with search arguments) will be compared to each other and the OK line will have the highest captured value.
The regexp is expected to capture a numeric value.
--capture-min <regexp>β In addition to specifying search arguments to filter the emails in the IMAP account, you can specify acapture-minregexp argument and the eligible emails (found with search arguments) will be compared to each other and the OK line will have the lowest captured value.
The regexp is expected to capture a numeric value.
--delete--nodeleteβ Use the delete option to delete messages that matched the search criteria. This is useful for preventing the mailbox from filling up with automated messages (from thecheck_smtp_sendplugin, for example).
β οΈ THE DELETE OPTION IS TURNED ON BY DEFAULT, in order to preserve compatibility with an earlier version. Yes bestie, it deletes by default. Read that twice. π
Use the nodelete option to turn off the delete option.
--nodelete-capturedβ If you use both the capture-max and delete arguments, you can also use thenodelete-capturedargument to specify that the email with the highest captured value should not be deleted. This leaves it available for comparison the next time this plugin runs. π
If you do not use the delete option, this option has no effect.
--ssl--nosslβ Enable SSL protocol. RequiresIO::Socket::SSL.
Using this option automatically changes the default port from 143 to 993. You can still override this from the command line using the --port option.
Use the nossl option to turn off the ssl option.
--ssl-ca-fileβ Use this to verify the server SSL certificate against a local.pemfile. You'll need to specify the path to the.pemfile as the parameter.
You can use the imap_ssl_cert utility included in this distribution to connect to your IMAP server and save its SSL certificates into your .pem file. Usage is like this:
imap_ssl_cert -H imap.server.com > ca_file.pem
Only applicable when --ssl option is enabled.
--template--notemplateβ Enable (or disable) processing of IMAP search parameters. RequiresText::TemplateandDate::Manip.
Use this option to apply special processing to IMAP search parameters that allows you to use the results of arbitrary computations as the parameter values. For example, you can use this feature to search for message received up to 4 hours ago. β¨
Modern IMAP servers that support rfc5032 extensions allow searching with the YOUNGER and OLDER criteria so a message received up to 4 hours ago is -s YOUNGER -s 14400. But if your mail server doesn't support that, you could use the --template option to get similar functionality.
When you enable the --template option, each parameter you pass to the -s option is parsed by Text::Template. See the Text::Template manual for more information, but in general any expression written in Perl will work.
A convenience function called rfc2822dateHeader is provided to you so you can easily compute properly formatted dates for use as search parameters. The rfc2822date function can take one or two parameters itself: the date to format and an optional offset. To use the current time as a search parameter, you can write this:
$ check_imap_receive ... --template -s HEADER -s Delivery-Date -s '{rfc2822dateHeader("now")}'
The output of {rfc2822dateHeader("now")} looks like this: Wed, 30 Sep 2009 22:44:03 -0700 and is suitable for use with a date header, like HEADER Delivery-Date.
To use a time in the past relative to the current time or day, you can use a second convenience function called rfc2822date and write this:
$ check_imap_receive ... --template -s SENTSINCE -s '{rfc2822date("now","-1 day")}'
okay don't go anywhere bestie, there is SO much more where this came fromβ¦ π
Quick thing about {rfc2822date("now","-1 day")}</pink> β what it spits out looks like this: 29-Sep-2009. And that shape? <green>Chef's kiss.</green> It's literally the exact format you want for BEFORE, ON, SENTBEFORE, SENTON, SENTSINCE, and SINCE`. Slay.
But bestie, I have seen some email clients get all extra and use a completely different format in the Date field, like September 17, 2009 9:46:51 AM PDT. If you need to specify an arbitrary format like that one, write this:
$ check_imap_receive ... --template -s HEADER -s Delivery-Date -s '{date("%B %e, %Y %i:%M:%S %p %Z","now","-4 hours")}'
Okay so here's the tea π« β you can use BEFORE, ON, SENTBEFORE, SENTON, SENTSINCE, or SINCE to search for messages that arrived on, before, or after a given day... but not on, before, or after a specific time on that day. Day-level granularity only, no clock precision, periodt.
So if you want to search for messages that arrived on, before, or after a specific time, you have to use the Delivery-Date or another date field, like with -s HEADER -s Delivery-Date in the example above. That's the move. π
And for the full lore on which expressions are allowed for date and delta strings, go read the Date::Manip manual. iykyk.
--hiresβ Use theTime::HiResmodule to measure time, if it's available. Fancy timing, we love to see it β¨--verboseβ Show extra info. Genuinely useful for troubleshooting. Run it together with--versionand you'll get the default warning and critical timeout values. π
Oh, and if the mailbox you selected wasn't found? Crank verbosity up to level 3 (-vvv) and it'll show you a list of all the mailboxes available on the server. So helpful, honestly.
Also known as: -v
--versionβ Display the plugin version and exit. Also known as:-V--helpβ Display this documentation and exit. Heads up: does not work in the ePN version. π Also known as:-h--usageβ Display a short usage instruction and exit.
π EXAMPLES π
π Report how many emails are in the mailbox
$ check_imap_receive -H mail.server.net --username mailuser --password mailpass
-s ALL --nodelete
IMAP RECEIVE OK - 1 seconds, 7 found
π Report the email with the highest value
Say your mailbox has some emails from an automated script, and a message from that script typically looks like this (abbreviated, so don't come for me):
To: mailuser@server.net
From: autoscript@server.net
Subject: Results of Autoscript
Date: Wed, 09 Nov 2005 08:30:40 -0800
Message-ID: <auto-000000992528@server.net>
Homeruns 5
And now suppose you're interested in reporting the message with the highest number of home runs, and you also want to leave that message sitting in the mailbox for future checks β but delete all the other matching messages with lesser values. Iconic behavior, honestly:
$ check_imap_receive -H mail.server.net --username mailuser --password mailpass
-s SUBJECT -s "Results of Autoscript" --capture-max "Homeruns (\d+)" --nodelete-captured
IMAP RECEIVE OK - 1 seconds, 3 found, 1 captured, 5 max, 2 deleted
π Troubleshoot your search parameters
Just add the --nodelete and --imap-retries=1 parameters to your command line. Boom, instant debugging mode. π΅οΈββοΈ
π¦ EXIT CODES π¦
Complies with the Nagios plug-in specification, bestie:
0β OK β The plugin was able to check the service and it appeared to be functioning properly1β Warning β The plugin was able to check the service, but it appeared to be above some "warning" threshold or did not appear to be working properly2β Critical β The plugin detected that either the service was not running or it was above some "critical" threshold3β Unknown β Invalid command line arguments were supplied to the plugin or the plugin was unable to check the status of the given hosts/service
π NAGIOS PLUGIN NOTES π
Nagios plugin reference, for when you wanna do the required reading:
http://nagiosplug.sourceforge.net/developer-guidelines.html
β οΈ Important: this plugin does NOT use NagiosDEFAULT_SOCKET_TIMEOUT(provided byutils.pmas$TIMEOUT) because the path toutils.pmmust be specified completely in this program, and that forces users to edit the source code if their install location is different β that is, if they even realize this is the problem. Yeah. π
You can view the default timeout for this module by using the --verbose and --version options together. The short form is -vV. Save that one, fr fr.
Other than that, it attempts to follow published guidelines for Nagios plugins. Good behavior only. β¨
π SEE ALSO π
http://nagios.org/http://search.cpan.org/~djkernen/Mail-IMAPClient-2.2.9/IMAPClient.podhttp://search.cpan.org/~markov/Mail-IMAPClient-3.00/lib/Mail/IMAPClient.pod
π CHANGES π
ok so bestie, this is the whole glow-up timeline of the plugin. every single era. buckle up π
Wed Oct 29 11:00:00 PST 2005
- +
version 0.1β the birth. the origin story. baby's first commit πΌ
Wed Nov 9 09:53:32 PST 2005
- + added
delete/nodeleteoption. deleting found messages is still default behavior. - + added
capture-maxoption - + added
nodelete-capturedoption - + added
mailboxoption - + added
eval/alarmblock to implement-coption - + now using an inline
PluginReportpackage to generate the report - + copyright notice and GNU GPL
- +
version 0.2
Thu Apr 20 14:00:00 CET 2006 (by Johan Nilsson <johann (at) axis.com>)
- +
version 0.2.1 - + added support for multiple polls of imap-server, with specified intervals
Tue Apr 24 21:17:53 PDT 2007
- + now there is an alternate version (same but without embedded perl POD) that is compatible with the new new embedded-perl Nagios feature
- + added patch from Benjamin Ritcey
<ben@ritcey.com>for SSL support on machines that have an SSL-enabled - +
version 0.2.3
Fri Apr 27 18:56:50 PDT 2007
- + fixed problem that
"Invalid search parameters"was not printed because of missing newline to flush it - + warnings and critical errors now try to append error messages received from the IMAP client
- + changed connection error to display timeout only if timeout was the error
- + documentation now mentions every command-line option accepted by the plugin, including abbreviations
- + added abbreviations
Ufor username,Pfor password,mfor mailbox - + fixed bug that
imap-check-intervalapplied even after the last try (imap-retries) when it was not necessary - + the IMAP expunge command is not sent unless at least one message is deleted
- + fixed bug that the
"no messages"warning was printed even if some messages were found - +
version 0.3
Sun Oct 21 14:08:07 PDT 2007
- + added port info to the
"could not connect"error message - + fixed bug that occurred when using
--ssl --port 143which caused port to remain at the default993imap/ssl port - + added clarity shortcuts
--search-subjectand--search-header - + port is no longer a required option. defaults to
143for regular IMAP and993for IMAP/SSL - +
version 0.3.1
Sun Oct 21 20:41:56 PDT 2007
- + reworked ssl support to use
IO::Socket::SSLinstead of the convenience methodMail::IMAPClient->Ssl(which is not included in the standardMail::IMAPClientpackage) - + removed clarity shortcuts (bad idea, code bloat) π
- +
version 0.4
Tue Dec 4 07:05:27 PST 2007
- + added version check to
_read_lineworkaround for SSL-related bug inMail::IMAPClientversion2.2.9; newer versions fixed the bug - + added
--usageoption because the official nagios plugins have both--helpand--usage - + added
--timeoutoption to match the official nagios plugins - + fixed some minor pod formatting issues for perldoc
- +
version 0.4.1
Sat Dec 15 07:39:59 PST 2007
- + improved compatibility with Nagios embedded perl (ePN)
- +
version 0.4.2
Mon Jan 7 21:35:23 PST 2008
- + changed version check for
Mail::IMAPClientversion2.2.9to use string comparisonle "2.2.9" - + fixed bug where script was dying on
socket->autoflushwhen socket does not exist because autoflush was being called before checking the socket object - +
version 0.4.3
Mon Feb 11 19:13:38 PST 2008
- + fixed a bug for embedded perl version, variable
"%status"will not stay shared inload_modules - +
version 0.4.4
Mon May 26 08:33:27 PDT 2008
- + fixed a bug for number captured, it now reflects number of messages captured instead of always returning
"1" - + added
--capture-minoption to complement--capture-max - + added
--search-critical-minto trigger a CRITICAL alert if number of messages found is less than argument, with default1. - + fixed warning and critical messages to use
"more than"or"less than"instead of the angle brackets, to make them more web friendly - +
version 0.5
Wed Jul 2 14:59:05 PDT 2008
- + fixed a bug for not finding a message after the first try, by reselecting the mailbox before each search
- +
version 0.5.1
Sat Dec 13 08:57:29 PST 2008
- + added
--downloadoption to allow local searching of messages (useful if your server has an index that handles searching but it takes a while before new emails show up and you want immediate results), supports only theTEXT,BODY,SUBJECT, andHEADERsearch keys - + added
--download-maxoption to set a limit on number of messages downloaded with--download - +
version 0.6.0
Wed Sep 30 23:25:33 PDT 2009
- + fixed
--download-maxoption (was incorrectly looking for--download_max). currently both will work, in the future only--download-maxwill work - + added
--templateoption to allow arbitrary substitutions for search parameters, and provided three convenience functions for working with dates - + added date search criteria to the
--downloadoption:SENTBEFORE,SENTON, andSENTSINCEwhich check theDateheader and allow hours and minutes in addition to dates (whereas the IMAP standard only allows dates) - + added
--search-critical-maxto trigger a CRITICAL alert if number of messages found is more than argument, disabled by default. - + fixed a bug in
--download --searchwhere messages would match even though they failed the search criteria - + changed behavior of
--download-maxto look at the most recent messages first (hopefully); the IMAP protocol doesn't guarantee the order that the messages are returned but I observed that many mail servers return them in chronological order; so now--download-maxreverses the order to look at the newer messages first - + added performance data for use with PNP4Nagios! π₯
- +
version 0.7.0
Fri Oct 2 15:22:00 PDT 2009
- + added
--search-warning-maxand--search-warning-minto trigger a WARNING alert if number of messages is more than or less than the specified number. - + fixed
--downloadoption not to fail with CRITICAL if mailbox is empty; now this can be configured with--search-warning-minor--search-critical-min - +
version 0.7.1
Sat Nov 21 18:27:17 PST 2009
- + fixed problem with using
--downloadoption on certain mail servers by turning on theIgnoreSizeErrorsfeature in IMAPClient - + added
--peekoption to prevent marking messages as seen - +
version 0.7.2
Tue Jan 5 12:13:53 PST 2010
- + added error message and exit with unknown status when an unrecognized IMAP search criteria is encountered by the
--download --searchoption
Wed May 5 11:14:51 PDT 2010
- + added mailbox list when mailbox is not found and verbose level 3 is on (
-vvv) - +
version 0.7.3
Tue Mar 8 18:58:14 AST 2011
- + updated documentation for
--searchand--templateto mention rfc5032 extensions (thanks to Stuart Henderson)
Fri May 6 08:35:09 AST 2011
- + added
--hiresoption to enable use ofTime::Hiresif available - +
version 0.7.4
Fri Nov 11 01:51:40 AST 2011
- + added
--ssl-ca-fileoption to allow verifying the server certificate against a local.pemfile (thanks to Alexandre Bezroutchko) - + added
imap_ssl_cert.plutility (not in this file) to conveniently save the server's SSL certificates into a local.pemfile - +
version 0.7.5
π AUTHOR π
Jonathan Buhacoff <jonathan@buhacoff.net>
the actual genius behind all of this. respect. π«Ά
βοΈ COPYRIGHT AND LICENSE βοΈ
Copyright (C) 2005-2011 Jonathan Buhacoff
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
http://www.gnu.org/licenses/gpl.txt
bestie this is the legal bit so I have to be for real for one sec: it's free software, you can share and remix it, but you have to keep the same license and there's genuinely no warranty. no cap. that's just how GPL rolls. π
aaaand that's a wrap on the whole page!! π this version is perl v5.40.1, dated 2026-02-11, and it's page CHECK_IMAP_RECEIVE(7) in the User Contributed Perl Documentation β shoutout to the perl v5.40.1 era for keeping this absolute classic alive. tysm for reading all three parts bestie, you ate that πβ¨π
π¦ where this page comes from
- ubuntu resolute: monitoring-plugins-contrib 48.20250420ubuntu3
- ubuntu stonking: monitoring-plugins-contrib 48.20250420ubuntu3
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms