email-class.php

Sehr oft müssen Skripte, die durch ein print2forms-Gateway aufgerufen werden, Informationen via E-Mail an Kunden oder Lieferanten automatisiert weiterreichen. Dabei steht immer auch die Anbindung eines PHP-Skriptes an einen E-Mail-Server in Frage.

Um das nicht in jedem Skript neu ausformulieren zu müssen, wird hier eine PHP-Klasse mit dem Namen email-class vorgestellt, die den Aufwand zum Absenden einer E-Mail vereinfachen soll.

Quellcode

Die im Quellcode nachfolgend dargestellte Klasse übernimmt eigentlich nur die Aufgaben, den E-Mail-Server auszuwählen und dann die gewünschte E-Mail abzusenden. Dabei kann die Mail zusätzlich an eine weitere Adresse (CC) gesandt werden. Weil eine E-Mail in aller Regel auch ein Dokument als Anhang benötigt, ist das ebenfalls vorgesehen.

Das Skript sollte vorzugsweise über diesen Link email-class.php geladen werden, weil beim Laden über den Reiter des Quellcodes die Unicode-BOM verlorengeht. 1)

email-class.php
<?php
 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
 
require "C:/php8/PHPMailer/src/Exception.php";
require "C:/php8/PHPMailer/src/PHPMailer.php";
require "C:/php8/PHPMailer/src/SMTP.php";
 
class email
  {
    private $server = "";
    private $port = 0;
    private $username = "";
    private $password = "";
 
/*----------------------------------------------------------------------------*/
 
    public function __construct ($server ="server.de",
                                 $port = 465,
                                 $username = "user",
                                 $password = "passwart")
      {
        $this->server = $server;
        $this->port = $port;
        $this->username = $username;
        $this->password = $password;
      }
 
/*----------------------------------------------------------------------------*/
 
    function sendMail ($data, & $msg)
      {
        $mail = new PHPMailer ();
 
        $mail->isSMTP ();
        //$mail->SMTPDebug = SMTP::DEBUG_LOWLEVEL;
 
        $mail->Host       = $this->server;
        $mail->Port       = $this->port;
        $mail->SMTPAuth   = true;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Username   = $this->username;
        $mail->Password   = $this->password;
        $mail->CharSet    = "UTF-8";
 
        $mail->isHTML (true);
        $mail->setFrom ($data ["from"], $data ["fromname"]);
        $mail->addAddress ($data ["to"], $data ["toname"]);
 
        if (array_key_exists ("cc", $data))                 /* cc is optional */
          $mail->addCC ($data ["cc"], $data ["ccname"]);
 
        $mail->addAttachment ($data ["file"], $data ["filename"]);
        $mail->Subject = $data ["subject"];
        $mail->Body = $data ["body"];
        $mail->AltBody = strip_tags (str_replace ("<br/>", "\n", $mail->Body));
 
        if (! $mail->send ())
          {
            $msg = trim ($mail->ErrorInfo);
            $mail = null;
            return 0;
          }
 
        $mail = null;
        $msg = "";
        return 1;
      }
  }
?>


Konstruktor

Der Konstruktor der Klasse benötigt als Parameter die Daten für den E-Mail-Server. Das sind dessen Adresse, die zu benutzende Port-Nummer, sowie den Anmeldenamen und das Passwort.

Die Parameter sind mit Standardwerten angelegt. Damit steht es dem Nutzer frei, ob er in jedem seiner PHP-Skripte die Anmeldedaten als Parameter mit übergibt, oder ob er das einmal durch eine Modifikation des Konstruktors erledigt. In diesem zweiten Fall sind die eigentlichen Skripte unabhängig von den Anmeldedaten, was im Sinne der Wartbarkeit zu bevorzugen ist. 2)

    $em = new email ("server", 587, "user", "password");
    $em = new email ();


sendMail

Die Methode benötigt zwei Parameter. Zum einen ist das ein Array mit den Daten für die E-Mail, und zum zweiten die Adresse einer Zeichenkette, in der im Falle eines Fehlers die Meldung des Mail-Servers landet.

Das Array liefert über die entsprechenden Schlüssel die notwendigen Daten:

Schlüssel Inhalt
from E-Mail-Adresse des Absenders der E-Mail
fromname Klartextname des Absenders der E-Mail
to E-Mail-Adresse des Empfängers der E-Mail
toname Klartextname des Empfängers der E-Mail
cc E-Mail-Adresse des Kopie-Empfängers der E-Mail (optional)
ccname Klartextname des Kopie-Empfängers der E-Mail (optional)
file Pfad und Name der Datei, die als Anhang beigefügt werden soll
filename Name der Datei, wie er in der E-Mail als Anhang erscheinen soll
subject Betreffzeile der E-Mail
body Inhalt der E-Mail als HTML-Zeichenkette. Diese wird als HTML-Teil der E-Mail genutzt. Als reiner Text-Teil der E-Mail wird automatisch eine Zeichenkette erzeugt, bei der alle '<br/>'-Tags gegen Zeilenvorschübe ersetzt und alle anderen HTML-Tags entfernt sind.


Der Rückkehrwert der Methode ist Eins wenn das Versenden erfolgreich war. Die übergebenen Zeichenkette ist dann leer. Im Fehlerfall wird eine Null zurückgegeben und die übergebene Zeichenkette enthält den (technischen, meist englischen) Fehlertext des E-Mail-Servers.

Ein Beispiel für die Erzeugung einer E-Mail:

$data = array
  (
    "from"     => "info@lieferant-gmbh.local",
    "fromname" => "Buchhaltung Lieferant GmbH",
    "to"       => $vars ["CustomerMail"],
    "toname"   => $vars ["CustomerName"],
    "file"     => $pdf,
    "filename" => "Rechnung {$vars ["InvoiceNo"]}.pdf",
    "subject"  => "Lieferant GmbH - Rechnung {$vars ["InvoiceNo"]}",
    "body"     =>
 
    $p2f->substitute ("Sehr geehrte Damen und Herren,<br/><br/>" .
                      "vielen Dank für Ihren Auftrag @OrderNo@.<br/><br/>" .
                      "Mit dieser Mail erhalten Sie dazu unsere Rechnung @InvoiceNo@<br/>" .
                      "mit Datum vom @InvoiceDate@ im Format PDF/A.<br/><br/>" .
                      "Mit freundlichen Grüßen<br/>" .
                      "Ihre Lieferant GmbH<br/><br/><br/>" .
                      "Lieferant GmbH<br/>" .
                      "Lieferweg 21<br/>" .
                      "80345 Musterstadt<br/><br/>" .
                      "Tel.: +49 1234 1234-0<br/>" .
                      "Fax:  +49 1234 1234-123<br/><br/>" .
                      "Mail: info@lieferant-gmbh.local<br/><br/>" .
                      "Geschäftsführer: A. Mustermann<br/>" .
                      "Registergericht Musterstadt: 5 HRB 12345<br/>" .
                      "USt-IdNr.: DE123456789<br/>", $vars)
  );
 
$em = new email ();
 
if ($em->sendMail ($data, $message) == 0)
  $p2f->error ("Sending e-mail failed '$message'");  


Hinweise


1)
Für die korrekte Funktion der Skripte ist es unumgänglich, dass Unicode zum Einsatz kommt. Die Kontrolldatei ist eine in UTF-8 kodierte Datei und somit müssen auch die zur Verarbeitung genutzten Skripte Unicode unterstützen. Ansonsten gibt es erhebliche Probleme mit länderspezifischen Zeichen.

2)
Bei der Verbindung zum E-Mail-Server wird unterstellt, dass dies eine verschlüsselte Verbindung ist. Sollte das wieder Erwarten im Einzelfall nicht zutreffen, sind gegebenenfalls weitere Modifkationen innerhalb der Klasse notwendig.

3)
Dadurch kann z.B. im Falle, dass die E-Mail nicht zustellbar ist, eine Fehler-E-Mail an einen Help-Desk oder an den Absender gehen, um über das Problem zu informieren.