Eigenes Skript als SMTP-Host verwenden

Nutzbar ab: Version 013.002.002.001

Über die Systemeinstellungen von Weblication® wird definiert, welches Mailsystem für den Versand von E-Mails über Formulare und Skripte herangezogen werden soll.

Ab CMS-Version 13 steht zusätzlich zur direkten Angabe eines SMTP-Hosts die Möglichkeit zur Verfügung, ein PHP-Skript für den Versand der E-Mails anzugeben. Diese Möglichkeit ist in den Fällen zu empfehlen, wenn nicht auf die PHP-Mail Funktion oder einen SMTP-Server zurückgegriffen werden kann.

Um ein Skript nutzen zu können, muß in den Systemeinstellungen (Mailserver) im Feld "SMTP-Host" folgendes eingetragen werden:

script(/Pfad-zum/script.php)

(die Pfad-Angabe innerhalb der Klammer ersetzen Sie durch das innerhalb der DocRoot abliegende Skript)

Im Skript wird die Funktion "sendMailScript" definiert, in welcher individuell definiert werden kann, über welche Mail-Funktion, Bibliothek, etc. der E-Mail Versand stattfinden soll.

Nachfolgend ein Beispiel-Skript, das die PHPMailer Bibliothek verwendet, über welche der gewünschte SMTP-Server mit dessen Daten angegeben werden können. Denkbar ist auch der Einsatz eines eigenen Mail-Servers, welcher über das Skript angesprochen wird.

Beispiel-Skript mit Funktion sendMailScript

/* ################################################
# PHPMailer sendMailScript, welches über Weblication® CMS mit engineType="wSMTP2" angesprochen werden kann
# verfügbar ab CMS-Version 013.002.002.001
###################################################
*/

/*
# In den Systemeinstellungen muss der SMTP-Host wie folgt definiert werden:
# script(/_sendMailScript.php) IhrSMTPHost.tld
# Die Host-Angabe nach der script-Klammer ist optional, da der Host in der Regel im Script hinterlegt ist.
# Im angegebenen Skript wird dann die Funktion sendMailScript aufgerufen,
# welche auf die SMTP-Host Einstellungen der Systemeinstellungen zurückgreift.
# Das Skript muss als Rückgabe ein true oder false liefern!
# (Beispiel-Skript siehe nachfolgend)
*/
include($_SERVER['DOCUMENT_ROOT'].'/weblication/grid.php');

//error_reporting(E_ALL);ini_set('error_reporting', 1);ini_set('display_errors', 1);

//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\POP3;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\OAuth;
use PHPMailer\PHPMailer\OAuthTokenProvider;
use PHPMailer\PHPMailer\DSNConfigurator;

require_once($_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/Exception.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/PHPMailer.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/SMTP.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/OAuthTokenProvider.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/OAuth.php');

//Load Composer's autoloader
//require 'vendor/autoload.php';

/*
  // Für Tests direkt über ein PHP-Skript:

  $mailData['from']     = array('from@domain.dd', 'From Name');
  $mailData['to']       = array(array('info@domain.dd', 'Max Mustermann'), array('mail@domain.dd', 'Erika Mustermann'));
  $mailData['replyTo']  = array('reply@domain.dd', 'Reply Name');
  $mailData['cc']       = array(array('cc@domain.dd', 'Cc Name'));
  $mailData['bcc']      = array(array('bcc@domain.dd', 'Bcc Name'));
  $mailData['subject']  = 'Test E-Mail _sendMailScript';
  $mailData['body']     = "\nInhalt der Test E-Mail!\n\nVersendet am: ".date('d.m.Y')." ".date('H:i:s')." Uhr\n";

  $smtpOptions = [
    'host' => 'IhrSMTPserver.tld', 
    'port' => wApplication::getOptionPath('/wConf/mail/smtp/server/@port'),
    'username' => '', // aus der Weblication Conf auslesen: wApplication::getOptionPath('/wConf/mail/smtp/server/@userName')
    'password' => '', // aus der Webication Conf auslesen: wApplication::getOptionPath('/wConf/mail/smtp/server/@userPass')
    'secure' => 'ssl' // z.B. 'ssl' oder 'tls'
  ];

  sendmailScript($mailData, $smtpOptions);
*/

function sendMailScript($mailData, $smtpOptions){

  // SMTP-Daten für den E-Mail Versand
  $smtpOptions = [
    'host' => '', // z.B. 'smtp.IhreDomain.tld'
    'port' => '', // z.B. '25' oder '587' oder '465' , oder aus Weblication Conf: wApplication::getOptionPath('/wConf/mail/smtp/server/@port'),
    'username' => '', // z.B. info@IhreDomain.tld , oder aus Weblication Conf: wApplication::getOptionPath('/wConf/mail/smtp/server/@userName')
    'password' => '', // Passwort der Mailbox , oder aus Weblication Conf: wApplication::getOptionPath('/wConf/mail/smtp/server/@userPaa')
    'secure' => 'ssl' // z.B. 'ssl' oder 'tls' , oder aus Weblication Conf: wApplication::getOptionPath('/wConf/mail/smtp/server/@secure')
  ];

  //Create an instance; passing `true` enables exceptions
  $mail = new PHPMailer(true);

  try {
      //Server settings
    $mail->Timeout = 10;
    $mail->SMTPDebug  = SMTP::DEBUG_SERVER;                     //Enable verbose debug output
    $mail->isSMTP();                                            //Send using SMTP
    $mail->Host       = $smtpOptions['host'];                   // SMTP server
    $mail->SMTPAuth   = true;                                   // enable SMTP authentication
    $mail->Port       = $smtpOptions['port'];                   // set the SMTP port for the GMAIL server
    $mail->Username   = $smtpOptions['username'];               // SMTP account username
    $mail->Password   = $smtpOptions['password'];               // SMTP account password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Enable implicit TLS encryption
    if($smtpOptions['secure'] === 'tls'){
      $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    }

    $mail->CharSet = 'utf-8';
    
    //Recipients
    if(isset($mailData['from'])){
      $mail->setFrom($mailData['from'][0], $mailData['from'][1]); // Add a recipiert
    }
    if(isset($mailData['to'])){
      foreach($mailData['to'] as $key => $data){
        $mail->addAddress($data[0], $data[1]);
      }
    }
    if(isset($mailData['replyTo'])){
      $mail->addReplyTo($mailData['replyTo'][0], $mailData['replyTo'][1]);
    }
    if(isset($mailData['cc'])){
      foreach($mailData['cc'] as $key => $data){
        $mail->addCC($data[0], $data[1]);
      }
    }
    if(isset($mailData['bcc'])){
      foreach($mailData['bcc'] as $key => $data){
        $mail->addBCC($data[0], $data[1]);
      }
    }

    //Content
    $mailBody = $mailData['body'][0]['content'] ?? null;
    $mail->isHTML(false);                                  //Set email format to HTML
    $mail->Subject = $mailData['subject'] ?? 'no subject defined';
    $mail->Body    = $mailBody ?? 'no body defined';
    //$mail->AltBody = $mailData['AltBody'];

    //Attachments
    //$mail->addAttachment('/var/tmp/file.tar.gz');         //Add attachments
    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    //Optional name

    // language
    //$mail->setLanguage('de', $_SERVER['DOCUMENT_ROOT'].'/_externe-Anwendungen/PHPMailer/languages/');

    $mail->send();
    echo 'Message has been sent';
    return true;
  }
  catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    var_dump( $e->getMessage() );
    return false;
  }

}