Email csatolmány küldése Drupal-ban a HtmlMimeMail osztállyal

Egyik ügyfelünknél felmerült az igény, hogy egy form kitöltése után automatikusan küldjünk ki egy email-t csatolmánnyal együtt.

A probléma megoldására a régebbről ismert HtmlMimeMail PHP osztályt használtam.

Nagyon jól megszerkesztett osztály úgyhogy nagyon könnyű használni, ám Drupal alatt mégsem lehetett alkalmazni a leírásban olvastakat.

Az első problémát az jelentette, hogy nem lehetett az osztályt beilleszteni, illetve objektumot készíteni belőle. Egyszerűen kifagyott tőle a Drupal és fehér képernyő jelent meg. Szerencsére van olyan verziója is, amitől nem jelentkezik ez a probléma.

Innen telölthető zip-el tömörítve (20 KB): HtmlMimeMail Drupal.

Miután ez megoldódott nagyjából a HtmlMimeMail oldalán található leírásokat kellett alkalmazni néhány dolgot kivéve.

Először egy ellenőrzés arról, hogy nem-e létezik már az osztály:

      if (!class_exists('htmlMimeMail') && !class_exists('Mail_mimePart')) {
        require_once(dirname(__FILE__)."/htmlmimemail/htmlMimeMail.php");
      }

Utána a szokásos eljárást követve létrehozzuk az objektumot, és beállítjuk a karakterkódolást is, hiszen a Drupal UTF-8 -at használ
 
      $mail = new htmlMimeMail();
      $mail->setTextCharset('UTF-8');
      $mail->setHtmlCharset('UTF-8');
      $mail->setHeadCharset('UTF-8');

A setFrom() setSubject() és a setText() vagy setHTML() beállítása ugynúgy történik mint általában:
 
      $mail->setFrom($_POST["offer_name"] . " <" . $_POST["offer_email"] . ">");
      $mail->setSubject('Ezt nézd meg');
      $mail->setText($uzenet);   // Ha text levelt kuldunk
      $mail->setHTML($uzenet); // Ha HTML levelet kuldunk

Na ezután jöhetett a csatolmány hozzárendelése! A HtmlMimeMail weboldalán a következőt olvashatjuk:
$mail->addAttachment(new fileAttachment('example.zip', 'application/zip', new Base64Encoding()));

Ez sajnos hibát generál, mivel nem létezik a FileAttachement osztály, így nincs miből objektumot létrehozni.
A megoldást a következő eljárás jelentette:
      $filename = $node->field_nyitolap_top10_latvany[0]['filepath'];
      $attachment = '';
 
      if ($fp = fopen($filename, 'rb')) {
        while (!feof($fp)) {
          $attachment .= fread($fp, filesize($filename));
        }
      }
      fclose($fp);

Így a csatolmány egyből bekerült a levélbe!

Végül be kell állítani a fejlécet és elküldeni:

      $mail->setHeader('Date',date('D, d M y H:i:s 0'));
      $mail->setHeader('X-Mailer','Drupal');
      $mail->send(array('<' . $_POST["offered_email_$i"] . '>'),'mail');

És tökéletesen működik a csatolmány elküldése Drupal alatt.