Script for mail check

Posted on 2011-03-01
Last Modified: 2013-12-26
This is my my first question and a weird one. I have a website on a linux server. This website has a company email system which is where we generate a lot of sales. Its basically a PHP contact page that emails the sales department. Every morning, just to make sure that the system is working correctly (no issues with server outgoing or our mail servers incoming) I set up a cron job on the server that hits a php script that tests the email system. Basically the job just hits the contact php page and populates the fields with 'test' values and sends the email just like if a customer had sent it.

I know, very convoluted, sorry.

This is what I'm trying to do:

I want to set up another cron job that runs 5 minutes after the test job runs. This job will check the mail folder, see if the test email has been received. If it has, delete the email and do nothing. If it hasn't received the test email, I want it to send me email at a different address with an alert.

In essence, right now I get a test email every day from the server. I never really read them or even see them anymore because I get them everyday. I'd like to stop getting the daily email and just get an email when the system fails.

I know the mail on the server is stored in a single file for every user. I know I could run a GREP command and search for the text in the email title that says "This is a TEST email". But how would I delete the email if it does?

Am I thinking about this the wrong way?
Question by:tunes4life
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Expert Comment

ID: 35007591
You can access the /var/mail directory, you may be able to remove the file. Look for a file with your userID.

You could also create a script to read mail and delete it with a for or while loop (if you have an idea of how many messages { you can tell that via the header option in mail I believe}).

Author Comment

ID: 35007765
If I deleted the file in /var/mail, wouldn't that delete all mail for the particular user?

Are you talking a bout a bash script with the loop? Any chance of getting a example of the basic commands? I know the basics of Linux programming but I would assume I would need to incorporation some 'Mail' commands in the script? Maybe example of a site that gives some good tutorials?

Thanks for the quick reply
LVL 40

Expert Comment

ID: 35075503
If you have a pop/imap server available, you can use fetchmail to check for mail and optionaly delete it.
OTOH, is it possible for you to have the test mail delivered to another "user" account? In that case you can empty that users mailbox.

LVL 34

Expert Comment

by:Duncan Roe
ID: 35081073
If you had Maildir delivery, where every message is in a separate file, your problem would become relatively simple.
Otherwise, you might be able to engineer a solution using a text-mode (not GUI) email client (aka MUA) and expect.
From the point of view of writing an expect script, the simpler the MUA is, the better. So mail or mailx might be preferable to mutt for instance. Your script would look for your distinctive test mail header and produce a report if it doesn't find one. Then it would get the MUA to delete the message.
LVL 19

Accepted Solution

simon3270 earned 500 total points
ID: 35081108
It would be cleaner to use a mail program to read and delete the mail, but if that is not possible, the folowing script will delete the mail with the specified text in it.

It assume that $MAIL is the file containing that user's mail, and that the mail follows standard mailbox rules; each mesage starts with a From line, and any lines starting "From " within the mail are escaped (which is why you sometimes see ">From " within an email).  The space after the From is important - there may be one or more "From: " lines, with a colon in them, but we aren't looking for those.  The "checkline" variable contains the text which will uniquely identify the test email.

Before you test this, copy the user's $MAIL file somewhere safe!

Note that there is no locking here - if another mail arrives while the check mail is being deleted, that new mail may be lost.  To make this less of a problem,it might be worht adopting part of noci's solution, and sending these check emails to a dummy user.  Then there is only one email a day for that user,and that email will be the one deleted.

I do make use of a quirk of csplit here - since the first line of $MAIL starts "From ", csplit will create an empty first file, and the second file it creates will contain the first email.  This means that even if all emails (or the only email) in $MAIL is deleted, the "cat" below the "rm" line still has at least one file (i.e. the empty first file) to write to $MAIL.

checkline="This is the test email"

if grep "$checkline" $MAIL >/dev/null
  # test email has arrived - delete it
  mkdir /tmp/check.$$
  cd /tmp/check.$$
  csplit $MAIL -n 4 -k -s '/^From /' '{*}'
  rm $(grep -l "$checkline" *)
  cat * > $MAIL
  cd "$oldpwd"
  rm -r /tmp/check.$$
  # No check email found - tell someone
  echo No Check Email on $(date) | mail -s "No check email today"

Open in new window


Featured Post

Turn Insights Into Action

You’ve already invested in ITSM tools, chat applications, automation utilities, and more. Fortify these solutions with intelligent communications so you can drive business processes forward.

With xMatters, you'll never miss a beat.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article will show, step by step, how to integrate R code into a R Sweave document
Every server (virtual or physical) needs a console: and the console can be provided through hardware directly connected, software for remote connections, local connections, through a KVM, etc. This document explains the different types of consol…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

695 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question