Čtení emailů přes IMAP v PHP

V dnešním článku se zaměříme na to, jak zpracovat příchozí e-maily. Pokud potřebujete deaktivovat odběratele newsletteru, kteří mají nedostupnou schránku a vám se vrací emaily o nedoručitelnosti, je řešením takovéto emaily projít a adresu odstranit. Nemusíme to však dělat ručně, dá se to zautomatizovat.

Předpokládám, že na odesílání newsletteru se bude používat spíše samostatná schránka, něco jako no-reply@domena.cz. Pokud by se používala nějaká pracovní, tak by se mohlo stát, že byste prošvihli e-mail o nedoručení, který jste prošvihnout nechtěli.

Následující skript se tedy nejprve připojí do schránky přes imap. Projde všechny zprávy a přečte si jejich obsah. V textu zprávy najde všechny e-mailové adresy, vyloučí ty, které mají co dočinění s doménou odesílatele, a naznačí zpracování co se s těmi adresami dá udělat, typicky smazat nebo deaktivovat.

$mbox = imap_open("{imap.domena.cz:143/notls}Inbox", "jmeno", "heslo") or die();
$MC = imap_check($mbox);
$result = imap_fetch_overview($mbox,"1:{$MC->Nmsgs}",0);
foreach ($result as $overview) {
  $uid=$overview->uid;
  if ($overview->from == "MAILER-DAEMON@domena.cz") {
    $zprava=imap_fetchbody($mbox,$uid,1,FT_UID);
    $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $zprava, $matches);
    foreach ($matches[0] as $email) {
      if (strpos($email,'domena')===false) {
        --- /zkontroluj email v databázi a pokud najdeš shodu/ {
          --- /smaž nebo deaktivuj/
          imap_delete($mbox,$uid,FT_UID);
          break;
        }
      }
    }
  }
}
imap_expunge($mbox);
imap_close($mbox);

Načtení kategorií z heureky

Pokud chcete úspěšný eshop, budete pravděpodobně párovat u zboží kategorie s heurekou. K tomu potřebujete ideálně do databáze dostat všechny heureka kategorie, a následně je buď u kategorií nebo u zboží spárovat. Budu se nyní zabývat tím, jak dostat celý strom kategorií na lokální server do databáze.

V databázi předpokládám tabulku s názvem heureka_kategorie a s jediným sloupcem pojmenovaným nazev. Níže uvedený kód načte všechny kategorie heureky a uloží je do dočasného XML souboru na disku. Následně tento soubor zpracuje a všechny kategorie uloží do databáze, přičemž je ukládá jako textový řetězec včetně celé cesty, tzn. názvy kategorií odděleny oddělovačem |.

$file="http://www.heureka.cz/direct/xml-export/shops/heureka-sekce.xml";
$ch = curl_init($file);
$fp = @fopen("tmp/heureka.xml", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

function vetev($PARENT) {
  global $dbh;
  if (isset($PARENT->CATEGORY)) {
    foreach($PARENT->CATEGORY as $CHILD) {
      $CATEGORY_FULLNAME = isset($CHILD->CATEGORY_FULLNAME) ? $CHILD->CATEGORY_FULLNAME : "";
      $CATEGORY_FULLNAME = trim(str_replace("Heureka.cz |", "", $CATEGORY_FULLNAME));
      if ($CATEGORY_FULLNAME) $dbh->query("insert into heureka_kategorie (nazev) values ('".$CATEGORY_FULLNAME."')");
      vetev($CHILD);	
    }
  }
}

if (file_exists("tmp/heureka.xml")) {

$xml = file_get_contents("tmp/heureka.xml");
$HEUREKA = new SimpleXMLElement($xml);

try {
  $dbh = new PDO("mysql:host=localhost;dbname=nazevdatabaze;charset=utf8",'jmeno','heslo');
  $dbh->query("truncate table heureka_kategorie");
  vetev($HEUREKA);
  $dbh = null;
} catch (PDOException $e) {
    echo "Error!: " . $e->getMessage() . "<br/>";
    exit();
}

}

Načítání měnových kurzů z ČNB nebo ČSOB

Jelikož potřebuji na některých eshopech převádět české koruny na eura, napsal jsem si třídu, která dokáže aktuální kurzy načíst z ČNB nebo z ČSOB. Třídu můžete stáhnout zde.

Co umí? Dokáže načíst online měnový kurz pro jakoukoliv měnu, kterou má daná banka přístupnou na webu. A také načíst všechny tyto údaje do pole a vyhodit jej pro případ, že budete chtít zobrazit více kurzů.

Následující kód vypíše EUR kurz z ČNB:

require_once('kurzy.class.php');
$kurz = new Courses('CNB');
echo $kurz->showOneCourse('EUR');

Tento kód vypíše pole měnových kurzů z ČSOB:

require_once('kurzy.class.php');
$kurz = new Courses('CSOB');
var_dump($kurz->showCourses());

Jak jste jistě pochopili, pro vytvoření instance třídy se použije new Courses(‚nazev_banky‘) a existují dvě metody:

1. showOneCourse(‚mena‘)
– vrátí aktuální kurz pro jednu měnu
2. showCourses()
– vrátí pole kurzů ($pole[‚mena‘])

Název banky může nabývat hodnot ‚CNB‘ nebo ‚CSOB‘. Měna pak ‚EUR‘, ‚USD‘, ‚GBP‘, …

Na závěr doporučení, pokud byste aktualizovali přes tuto třídu kurzy online a třeba každou vteřinu, budete zatěžovat mateřský server banky a to se jim nemusí zrovna dvakrát líbit. Doporučuji proto kurzy skrz tuto třídu ukládat třeba do databáze a aktualizovat jednou za hodinu, nebo jednou za den, dle potřeby.

Odesílání e-mailů v PHP

Pro zasílání e-mailů jsem si oblíbil knihovnu swiftmailer. Je zdarma a je jednoduchá na použití. Umí samozřejmě odesílat i přílohy a využívat funkci mail() anebo přímo smtp server.

require_once('lib/swift_required.php');
$transport = Swift_SmtpTransport::newInstance('smtp.example.org',25)
  ->setUsername('username')
  ->setPassword('password')
;
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('predmet emailu');
$textzpravy = "Ahoj, posílám obrázek: <img src=".$message->embed(Swift_Image::fromPath('image.jpg')).">";
$message -> setFrom('emailodesilatele');
$message -> setBody($textzpravy);
$message -> setTo(array('emailprijemce'));
$result = $mailer -> send($message);

Tisk štítků s čárovým kódem v PHP

Pro tisk štítků s čárovým kódem, konkrétně EAN 13 a CODE 128, používám knihovnu Tomáše Horáčka Barcodepack. Obsahuje také třídy pro QR kódy, UPC, a ještě pár dalších (netestoval jsem).

Příklad pro uložení EAN kódu jako png obrázek:

require_once("/path/barcodepack/class.ean13.php");
$ean = new ean13(substr(1234567891234,0,-1));
imagepng($ean->draw(),"/path_to_save/image.png");

* EAN kód je třeba zbavit posledního čísla.

Load jQuery

Pokud používáte jQuery knihovnu, je vhodnější ji tahat z nějakého repozitáře. Jquery nabízí např. google.

Do stránky tedy vložte kód:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>
if (!window.jQuery) {
document.write('<script src="/path/jquery.min.js"><\/script>');
}
</script>

A do lokálního adrersáře na vašem serveru si knihovnu stáhněte také (/path/jquery.min.js), a v případě, že se knihovnu nepodaří z googlu načíst, načte se z lokálu.