The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

ASNMTAP::Asnmtap::Plugins::Mail is a Perl module that provides Mail functions used by ASNMTAP-based plugins.

SYNOPSIS

  use ASNMTAP::Asnmtap::Plugins::Mail;

  my $objectNagios = ASNMTAP::Asnmtap::Plugins::Mail->new ();

Description

Sending and receiving fingerprinted (TXT or XML) mails. It are Mail::Sendmail (an simple platform independent mailer) based functions.

EXAMPLE

  use ASNMTAP::Asnmtap::Plugins v3.002.003;
  use ASNMTAP::Asnmtap::Plugins qw(:PLUGINS %STATE);

  my $objectPlugins = ASNMTAP::Asnmtap::Plugins->new (
    _programName        => 'check_template.pl',
    _programDescription => "General plugin template for the '$APPLICATION'",
    _programVersion     => '3.002.003',
    _programGetOptions  => ['timeout|t:i', 'trendline|T:i'],
    _timeout            => 30,
    _debug              => 1);

  use ASNMTAP::Asnmtap::Plugins::Mail v3.002.003;

  my $objectMAIL = ASNMTAP::Asnmtap::Plugins::Mail->new (
    _asnmtapInherited => \$objectPlugins,
    _SMTP             => { smtp => qw(smtp.citap.be) },
    _mailType         => 1,
    _text             => { SUBJECT => 'uKey=MAIL_P_0001' },
    _mail             => {
                           from   => 'alex.peeters@citap.be',
                           to     => 'asnmtap@citap.com',
                           status => $APPLICATION .' Status UP',
                           body   => $body
                         }
    );

  $objectPlugins->pluginValues ( { stateValue => $ERRORS{OK}, alert => ':)' }, $TYPE{APPEND} );

  $objectPlugins->exit (7);

ATTRIBUTES

_asnmtapInherited

A required reference to an ASNMTAP::Asnmtap::Plugins or ASNMTAP::Asnmtap::Plugins::Nagios subclass

Through this way of working we inherited the command line option --debug.

_SMTP

is an HASH, with the same parameters like %Mail::Sendmail::mailcfg{}

smtp

this is a reference to a list of smtp servers, so if your main server is down, the module tries the next one. If one of your servers uses a special port, add it to the server name with a colon in front, to override the default port (like in my.special.server:2525).

optional, default: localhost

port

port used when none is specified in the server name.

optional, scalar value, default: 25

from

from address used if you don't supply one in your script. Should not be of type 'user@localhost' since that may not be valid on the recipient's host.

optional, scalar value, default: undefined

retries

how many times should the connection to the same SMTP server be retried in case of a failure.

optional, scalar value, default: 3;

delay

number of seconds to wait between retries. This delay also happens before trying the next server in the list, if the retries for the current server have been exhausted. For CGI scripts, you want few retries and short delays to return with a results page before the http connection times out. For unattended scripts, you may want to use many retries and long delays to have a good chance of your mail being sent even with temporary failures on your network.

optional, scalar value, default: 1 (second);

mime

set this to 0 if you don't want any automatic MIME encoding. You normally don't need this, the module should 'Do the right thing' anyway.

optional, scalar value, default: 0

tz

normally, your time zone is set automatically, from the difference between time() and gmtime(). This allows you to override automatic detection in cases where your system is confused.

optional, scalar value, default: undefined (automatic detection at run-time).

debug

prints stuff to STDERR. Current maximum is 6, which prints the whole SMTP session, except data exceeding 500 bytes.

optional, scalar value, default: inherited from the parent object command line option -d or --debug

_IMAP4
imap4

IMAP4 host to connect to.

port (reserved)

port used when none is specified in the server name.

optional, scalar value, default: 143

username

optional, scalar value, default: undef

password

optional, scalar value, default: undef

timeout

maximum time, in seconds, to wait for a response from the IPAM4 server

optional, scalar value, default: 120 unless inherited from the parent object attribute _timeout

debug

debugging information

optional, scalar value, default: inherited from the parent object command line option -d or --debug

_POP3

settings used by Net::POP3 - Post Office Protocol 3 Client class (RFC1939)

pop3

POP3 host to connect to. It may be a single scalar, or an scalar array with hosts to try in turn.

Syntax for POP3 host is <hostname>[:<port>] where <hostname> can be a hostname or the IP-address on the 'xxx.xxx.xxx.xxx'

 single scalar: pop3 => 'pop3.citap.be', 'pop3.citap.be:110', 'xxx.xxx.xxx.xxx' or 'xxx.xxx.xxx.xxx:110'

required when POP3 used for dowloading the receiving mails, default: undef

port (reserved)

port used when none is specified in the server name.

optional, scalar value, default: 110

username

optional, scalar value, default: undef

password

optional, scalar value, default: undef

timeout

maximum time, in seconds, to wait for a response from the POP3 server

optional, scalar value, default: 120 unless inherited from the parent object attribute _timeout

debug

debugging information

optional, scalar value, default: inherited from the parent object command line option -d or --debug

_mailType

For clients that are sensitive to cookie-based authentication.

optional, mailType can be 0 or 1

  0, TXT formated fingerprint (default)
  1, XML formated fingerprint
TXT

Each e-mail exists of an TXT fingerprint. This allows us lateron only to pick up the required e-mails with pop3, because we will filter out the emails with a minimum band width the e-mails desired from the mail box.

When the status and the header plus the first 7 lines of the e-mail agrees to these fingerprint, the e-mail is picked up, processes, and removed from the mail box.

Fingerprint
Subject
 SUBJECT / From: Source_email_address To: Application_Monitor_email_address

 SUBJECT: description can be found lateron into this document.
Message
 SUBJECT / From: Source_email_address To: Application_Monitor_email_address
 <plugin naam> <plugin description>
 Timestamp <Source email address>: dd-mm-yyyy hh:mm:ss[.hhh]
 Status <naam from the service up/down>

 SUBJECT: description can be found lateron into this document.
Example
 ASNMTAP / From: alex.peeters@citap.com To: asnmtap@citap.com 
 <mail-xml-citap-com.pl> <Mail XML plugin template for testing the 'Application Monitoring'>
 Timestamp <alex.peeters@citap.com>: 2006/02/04 11:01:11
 Status <Application Monitoring Status Down>
XML

Each e-mail exists of an XML fingerprint. This allows us lateron only to pick up the required e-mails with pop3, because we will filter out the emails with a minimum band width the e-mails desired from the mail box.

When the status and the header plus the first 5 lines of the e-mail agrees to these fingerprint, the e-mail is picked up, processes, and removed from the mail box.

DTD for validation XML
 <?xml version="1.0" encoding="UTF-8"?>

 <!ENTITY AUTHOR  "Alex Peeters">
 <!ENTITY EMAIL   "Alex.Peeters@citap.com">
 <!ENTITY PURPOSE "2005/11/15, dtd schema v1.0 for Fingerprint Email by XML">

 <!ELEMENT FingerprintEmail (Schema, Fingerprint)>
 <!ELEMENT Schema (#PCDATA)>
 <!ATTLIST Schema Value CDATA #FIXED "1.0">
 <!ELEMENT Fingerprint (#PCDATA)>
 <!ATTLIST Fingerprint
   From CDATA #REQUIRED
   To CDATA #REQUIRED
   Destination CDATA #REQUIRED
   Plugin CDATA #REQUIRED
   Description CDATA #REQUIRED
   Environment (PROD|TEST|ACC|DEV|SIM|LOCAL) #REQUIRED
   Date CDATA #REQUIRED
   Time CDATA #REQUIRED
   Epochtime CDATA #REQUIRED
   Status CDATA #REQUIRED
 >
Example

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE FingerprintEmail SYSTEM "dtd/FingerprintEmail-1.0.dtd"><FingerprintEmail><Schema Value="1.0"/><Fingerprint From="alex.peeters@citap.com" To="asnmtap@citap.com" Destination="ASNMTAP" Plugin="mail-fingerprint-xml-citap-com.pl" Description="XML fingerprint Mail plugin template for testing the 'Application Monitoring'" Environment="PROD" Date="2006/2/4" Time="11:1:18" Epochtime="1139047278" Status="Application Monitoring Status UP" /></FingerprintEmail>

_text

required textual descriptions

SUBJECT

SUBJECT is the textual descriptions for the preffix of the subject

required, scalar value, default: 'uKey=ASNMTAP'

When you have more then one mail plugin, then you should use for the subject an unique key. Normally we use 'uKey=MAIL_?_nnnn' where '?' is the environment and 'nnnn' the number to make the SUBJECT unique.

 - P(roduction) : 'uKey=MAIL_P_0001', 'uKey=MAIL_P_0002' ... 'uKey=MAIL_P_nnnn'
 - S(imulation) : 'uKey=MAIL_S_0001', 'uKey=MAIL_S_0002' ... 'uKey=MAIL_S_nnnn'
 - A(cceptation): 'uKey=MAIL_A_0001', 'uKey=MAIL_A_0002' ... 'uKey=MAIL_A_nnnn'
 - T(est)       : 'uKey=MAIL_T_0001', 'uKey=MAIL_T_0002' ... 'uKey=MAIL_T_nnnn'
 - D(evelopment): 'uKey=MAIL_D_0001', 'uKey=MAIL_D_0002' ... 'uKey=MAIL_D_nnnn'
 - L(ocal)      : 'uKey=MAIL_L_0001', 'uKey=MAIL_L_0002' ... 'uKey=MAIL_L_nnnn'

The reason for this is that the processing from the emails is much faster, because after the verification from the 'To:', 'From:' and 'Subject:' fields from the HEAD of your email you already know if its the required email to process with this plugin, and you don't read everytime the BODY to be sure.

from

is the textual descriptions for from

optional, scalar value, default: 'From:'

to

is the textual descriptions for to

optional, scalar value, default: 'To:'

subject

is the textual descriptions for the subject

optional, scalar value, default: 'Subject:'

status

is the textual descriptions for the status

optional, scalar value, default: 'Status'

_mail

required mail parameters

from

from email address

required, scalar value

to

to from email address

required, scalar value

status

status message

required, scalar value

body

body message for the email

required, scalar value

METHODS

sending_fingerprint_mail()

Sending fingerprint emails. The fingerprints can be formated as TXT or XML.

Returns a status for $returnCode (OK..UNKNOWN).

perfdataLabel

This means that there performance data for the sending time will be created and the name for the label equals the value from perfdataLabel.

Is an scalar (value is a string), default 'email send'

receiving_fingerprint_mail()
Returns $ERRORS{CRITICAL} when:

- Date or Time into Fingerprint XML are wrong

- Epochtime difference from Date and Time into Fingerprint XML are wrong

- Result into Fingerprint XML are out of date

Returns $ERRORS{WARNING} when:

- Result into Fingerprint XML are out of date

custom

optional, is an reference to your own custom defined function

$self:

the reference to the current object

date

date returned from the fingerprint item 'Epochtime'

day

day returned from the fingerprint item 'Epochtime'

month

month returned from the fingerprint item 'Epochtime'

year

year returned from the fingerprint item 'Epochtime'

time

time returned from the fingerprint item 'Epochtime'

hour

hour returned from the fingerprint item 'Epochtime'

min

min returned from the fingerprint item 'Epochtime'

sec

sec returned from the fingerprint item 'Epochtime'

numberOfMatches

without an custom defined function is this the number of email that matches te fingerprint.

with an custom defined function do you need to increment the value in your custom defined function everytime you say that this mail matches your request.

$self->{defaultArguments}->{numberOfMatches}++;

result

the extracted message from the email starting just after the fingerprint

$asnmtapInherited:

A required reference to an ASNMTAP::Asnmtap::Plugins or ASNMTAP::Asnmtap::Plugins::Nagios subclass

Through this way of working we inherited the command line option --debug.

$email:
IMAP4

A new Net::IMAP::Simple object is created and all IMAP4 commands are accessed via method calls on this object.

POP3

A new Net::POP3 object is created and all POP3 commands are accessed via method calls on this object.

$msgnum:
  sub actionOnReceivingFingerprintMail {
    my ($self, $asnmtapInherited, $email, $msgnum) = @_;

    no warnings 'deprecated';
    my $returnCode = $ERRORS{OK};

    # put here your code regarding the MailBody - - - - - - - - - - - - -
    print "\n\n". $self->{defaultArguments}->{result}. "\n\n";

    $$asnmtapInherited->pluginValues ( { stateValue => $returnCode, alert => '.' }, $TYPE{APPEND} );

    # put here your code for deleting the email from the Mailbox  - - - -

    # IMAP4
    # $email->delete( $msgnum ) unless ( $$asnmtapInherited->getOptionsValue ('debug') or $$asnmtapInherited->getOptionsValue ('onDemand') );

    # POP3
    # $email->Delete( $msgnum ) unless ( $$asnmtapInherited->getOptionsValue ('debug') or $$asnmtapInherited->getOptionsValue ('onDemand') );

    $self->{defaultArguments}->{numberOfMatches}++;

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    return ( $returnCode );
  }

and now with customArguments:

  sub actionOnReceivingFingerprintMail {
    my ($self, $asnmtapInherited, $email, $msgnum, $arguments) = @_;

    no warnings 'deprecated';
    my $returnCode = $ERRORS{OK};

    # put here your code regarding the MailBody - - - - - - - - - - - - -
    print "\n\n". $self->{defaultArguments}->{result}. "\n\n";

    $$asnmtapInherited->pluginValues ( { stateValue => $returnCode, alert => '.' }, $TYPE{APPEND} );

    # put here your code for deleting the email from the Mailbox  - - - -

    # IMAP4
    # $email->delete( $msgnum ) unless ( $$asnmtapInherited->getOptionsValue ('debug') or $$asnmtapInherited->getOptionsValue ('onDemand') );

    # POP3
    # $email->Delete( $msgnum ) unless ( $$asnmtapInherited->getOptionsValue ('debug') or $$asnmtapInherited->getOptionsValue ('onDemand') );

    $self->{defaultArguments}->{numberOfMatches}++;

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    return ( $returnCode );
  }
customArguments

optional, when you need to pass parameters to your own custom defined function, this can be done with customArguments.

  customArguments: SCALAR, ARRAY, HASH,
                   REF SCALAR, REF ARRAY, REF HASH
checkFingerprint

can be 0 or 1:

0: email found when when 'From:', 'To:' and 'Subject' matches

1: email found when when 'From:', 'To:', 'Subject' and formated fingerprint matches

optional, scalar value, default 1

receivedState

can be 0 or 1:

0: When we receive no mails then the state $ERRORS{CRITICAL} is returned, otherwise the custom function returns $ERRORS{OK..UNKNOWN}

1: When we receive no mails then the state $ERRORS{OK} is returned, otherwise the custom function returns $ERRORS{OK..UNKNOWN}

optinal, scalar value, default 0

outOfDate

calculate ...

required when _mailType = 1 (XML), scalar value

perfdataLabel

This means that there performance data for the number of matches will be created and the name for the label equals the value from perfdataLabel.

Is an scalar (value is a string), default 'email(s) received'

Returns a status for $returnCode (OK..UNKNOWN).

EXPORT

TAGS

  • ALL

    none

AUTHOR

Alex Peeters [alex.peeters@citap.be]

SEE ALSO

ASNMTAP::Asnmtap, ASNMTAP::Asnmtap::Plugins

  check_template-mail.pl
  check_template-mail-fingerprint-xml.pl
  check_template-mail-xml-fingerprint-xml.pl
  check_template-mail-xml-fingerprint-xml-monitoring.pl
  check_template-mail-xml-fingerprint-xml-monitoring-1.1.pl
  check_template-mail-xml.pl
  check_template-mail-fingerprint.pl

DEPENDENCIES

  ASNMTAP::Asnmtap::Plugins
  ASNMTAP::Time
  Date::Calc
  Email::Simple
  Mail::POP3Client
  Mail::Sendmail
  MIME::Base64
  MIME::Parser
  MIME::Tools
  Net::IMAP::Simple
  Net::POP3
  Time::Local

COPYRIGHT NOTICE

(c) Copyright 2000-2011 by Alex Peeters [alex.peeters@citap.be], All Rights Reserved.

ASNMTAP is based on 'Process System daemons v1.60.17-01', Alex Peeters [alex.peeters@citap.be]

 Purpose: CronTab (CT, sysdCT),
          Disk Filesystem monitoring (DF, sysdDF),
          Intrusion Detection for FW-1 (ID, sysdID)
          Process System daemons (PS, sysdPS),
          Reachability of Remote Hosts on a network (RH, sysdRH),
          Rotate Logfiles (system activity files) (RL),
          Remote Socket monitoring (RS, sysdRS),
          System Activity monitoring (SA, sysdSA).

'Process System daemons' is based on 'sysdaemon 1.60' written by Trans-Euro I.T Ltd

LICENSE

This ASNMTAP CPAN library and Plugin templates are free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The other parts of ASNMTAP may be used and modified free of charge by anyone so long as this copyright notice and the comments above remain intact. By using this code you agree to indemnify Alex Peeters from any liability that might arise from it's use.

Selling the code for this program without prior written consent is expressly forbidden. In other words, please ask first before you try and make money off of my program.

Obtain permission before redistributing this software over the Internet or in any other medium. In all cases copyright and header must remain intact.