Swiftmailer dvojité tečky (double dot)

Pokud jste si oblíbili pro odesílání emailů knihovnu swiftmailer, možná jste při rozesílce hromadných emailů narazili na problém tzv. double dot.

Projevuje se to tak, že v rámci odesílacího cyklu při každém druhém a dalším emailu se nahradí tečka dvěmi tečkami na začátku každého řádku začínajího právě tečkou. Pokud do emailu vkládáte css styly, tak je velmi pravděpodobné, že se vás to dotýká. Aktuálně funguje následující kus kódu, který stačí vložit do odesílacího skriptu.

Swift_Preferences::getInstance()->setCacheType('null');

Č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);

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);