Sivut

keskiviikko 6. heinäkuuta 2016

PHP: Tarkistetaan sähköposti IMAP postilaatikosta


Monessa työpöytäympäristössä (Desktop) on käytössä saapuvan sähköpostin tarkistamiseen tarkoitettu ilmoitus. Niin sanottu Mail Notify. Tämä toimii vaikka itse sähköpostiohjelma (Outlook tai Thunderbird) ei olisikaan käynnissä.

Ainakin Ubuntu, Debian ja openSUSE sisälsivät aikoinaan tämän ominaisuuden, mutta yllätys oli, että uudesta 64 -bittisestä Ubuntusta se puuttui. Tai ainakaan se ei toiminut toivotulla tavalla.

Silloin kun joku toiminto tietokoneesta puuttuu, niin minä yleensä koodaan sen itse. Niin siis tässäkin tapauksessa. Apuun tuli PHP -kieleen ympätty ominaisuus IMAP -postilaatikon käsittelyyn. Sen avulla pystyy kirjautumaan omaan postilaatikkoon ja tarkistamaan tilanteen: paljonko laatikossa on postia ja montako kirjettä on lukematta.

Kirjoitetaan siis PHP -ohjelma joka tarkistaa postilaatikon ja ilmoittaa saapuneesta postista käyttäjälle. Se vaatii tietysti, että PHP -kielen vaatimat palikat on asennettu tietokoneelle ja ohjelma voidaan suorittaa ajastetusti vaikkapa cron -ajastuksella (Linux).

Itse PHP -ohjelma on varsin yksinkertainen. Tässä siitä listaus, joka tarkistaa kaksi postilaatikkoa:


<?php

/*
 imap_open — Open an IMAP stream to a mailbox
  All names which start with { are remote names,
  and are in the form "{" remote_system_name [":" port] [flags] "}" [mailbox_name] where:
    remote_system_name - Internet domain name or bracketed IP address of server.
    port - optional TCP port number, default is the default port for that service
    flags - optional flags, see following table.
    mailbox_name - remote mailbox name, default is INBOX

 imap_status — Returns status information on a mailbox
 Valid flags are
    SA_MESSAGES - set $status->messages to the number of messages in the mailbox
    SA_RECENT     - set $status->recent to the number of recent messages in the mailbox
    SA_UNSEEN     - set $status->unseen to the number of unseen (new) messages in the mailbox
    SA_UIDNEXT     - set $status->uidnext to the next uid to be used in the mailbox
    SA_UIDVALIDITY - set $status->uidvalidity to a constant that changes when uids for the mailbox may no longer be valid
    SA_ALL - set all of the above

*/

# MyHost imap with ssl
$myhost="{myserver.org:993/imap/ssl/novalidate-cert}";

# Google with imap
$gmailhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX";

$user="username@myhost.org";
$pass="********";

$gmailuser = "user.name@gmail.com";
$gmailpass = "********";

// In crontab All commands need to reference their location eg. /usr/bin $notify_cmd = "/home/user/bin/notify-send-user.sh -U user -i info 'Sinulle on postia!' ";

// Status file. Append and clear after a month, maybe joskus?
$file = "/home/user/bin/mail/mail_status.txt";
file_put_contents( $file, "\n--- ooo ---\n\n", FILE_APPEND );

date_default_timezone_set('Europe/Helsinki');
$t=time();
file_put_contents( $file, (date("d-m-Y H:i",$t))."\n", FILE_APPEND );

# ------ Myhost Mailbox -----

if ($mbox=imap_open( $host, $user, $pass ))
  {
    file_put_contents( $file, "Host Connected\n", FILE_APPEND );
  } else
  {
    file_put_contents( $file, "Host Connection FAIL!\n", FILE_APPEND );
    exit(1);
  }

$data_unread = 0;

$status = imap_status($mbox, "{myserver.org:993}INBOX", SA_ALL);
if ($status) {
  $msgs = $status->messages;
  $data_unread = $status->unseen;   
 
  $notify_msg = "'Host: $data_unread";    // Alkaa hipsulla
  file_put_contents( $file, "Datatuki\n"."-Messages: ".$msgs."\n-Unread  : " . $data_unread . "\n", FILE_APPEND );
 
} else {
  file_put_contents( $file, "Host imap_status failed: " . imap_last_error() . "\n", FILE_APPEND );
}

imap_close($mbox);

# ------- Google Gmail Mailbox -------------

if ($mbox=imap_open( $gmailhost, $gmailuser, $gmailpass ))
  {
    file_put_contents( $file, "Gmail Connected\n", FILE_APPEND );
  } else
  {
    file_put_contents( $file, "Gmail Connection FAIL!\n", FILE_APPEND );
    exit(1);
  }

$gmail_unread = 0;

$status = imap_status($mbox, "{imap.gmail.com:993}INBOX", SA_ALL);
if ($status) {
  $msgs = $status->messages;
  $gmail_unread = $status->unseen; 
  // Append messages
  $notify_msg .= " Gmail: $gmail_unread'";  // Loppuu hipsuun
  file_put_contents( $file, "Gmail\n"."-Messages: ".$msgs."\n-Unread  : " . $gmail_unread . "\n", FILE_APPEND );
 
} else {
  file_put_contents( $file, "Gmail imap_status failed: " . imap_last_error() . "\n", FILE_APPEND );
}

imap_close($mbox);


# ------ If there is any email ------

if( $data_unread != 0 || $gmail_unread != 0 ) {
  // Sinulle on jotakin postia!
  $notify_cmd .= $notify_msg; 
  exec($notify_cmd);
  exec($play_cmd);
  } else {
    file_put_contents( $file, "Nothing to do ...\n", FILE_APPEND );
  }

?>

Että silleen.
Tämä koodi ilmoittaa kun uutta postia on saapunut.


Ei kommentteja:

Lähetä kommentti