Eigenes Skript als SMTP-Host verwenden
Veröffentlichungsdatum: 13. Oktober 2023
Änderungsdatum: 24. Oktober 2023
weblication mail e-mail smtp host mailsystem phpmailer mailversand mailserver
Ü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;
}
}Weiterführende Links
- Wie kann ich in Weblication® ein eigenes Skript als SMTP-Host für den E-Mail-Versand verwenden?
- In den Systemeinstellungen von Weblication® (Bereich Mailserver) wird definiert, welches Mailsystem für den Versand von E-Mails über Formulare und Skripte genutzt wird. Ab CMS-Version 13 kann dafür statt eines direkten SMTP-Hosts ein PHP-Skript angegeben werden. Tragen Sie im Feld **„SMTP-Host“** folgendes Format ein: <code class="codeInline">script(/Pfad-zum/script.php)</code> Ersetzen Sie dabei den Pfad innerhalb der Klammer durch den Pfad zum Skript relativ zur **DocRoot**.
- Ab welcher Version ist die Option verfügbar, einen PHP-Skriptaufruf statt eines direkten SMTP-Hosts zu konfigurieren?
- Diese Möglichkeit ist **ab CMS-Version 13** verfügbar.
- Wann empfiehlt sich der Einsatz eines PHP-Skripts statt der PHP-Mail-Funktion oder eines SMTP-Servers?
- Der Einsatz eines Skripts wird **empfohlen**, wenn **nicht** auf die PHP-Mail-Funktion oder einen **SMTP-Server** zurückgegriffen werden kann.
- Welche Funktion muss im Skript vorhanden sein, damit Weblication® den E-Mail-Versand darüber ausführen kann?
- Im Skript muss die Funktion **<code class="codeInline">sendMailScript</code>** definiert sein. In dieser Funktion wird individuell festgelegt, wie der E-Mail-Versand (z. B. über Bibliotheken oder Mail-Funktionen) durchgeführt werden soll.
- Was muss das Skript als Rückgabe liefern?
- Das Skript muss als Rückgabe **<code class="codeInline">true</code>** oder **<code class="codeInline">false</code>** liefern.
- Wie sieht der von der Doku vorgeschlagene Aufbau für den SMTP-Host in den Systemeinstellungen aus?
- Der Eintrag im Feld **„SMTP-Host“** soll wie folgt aussehen: <code class="codeInline">script(/_sendMailScript.php) IhrSMTPHost.tld</code> Die Doku weist darauf hin, dass die Angabe des Hosts nach der <code class="codeInline">script(...)</code>-Klammer **optional** ist, da der Host in der Regel im Script hinterlegt ist.
- Wie kann ich im Beispiel-Skript mit PHPMailer einen SMTP-Server ansteuern?
- Im Beispiel wird **PHPMailer** verwendet. Dazu wird innerhalb der Funktion **<code class="codeInline">sendMailScript($mailData, $smtpOptions)</code>** ein Array <code class="codeInline">$smtpOptions</code> mit SMTP-Parametern (z. B. <code class="codeInline">host</code>, <code class="codeInline">port</code>, <code class="codeInline">username</code>, <code class="codeInline">password</code>, <code class="codeInline">secure</code>) gesetzt und anschließend PHPMailer entsprechend konfiguriert (z. B. <code class="codeInline">isSMTP()</code>, <code class="codeInline">Host</code>, <code class="codeInline">SMTPAuth</code>, <code class="codeInline">Port</code>, <code class="codeInline">Username</code>, <code class="codeInline">Password</code>, <code class="codeInline">SMTPSecure</code>).
- Welche SMTP-Verschlüsselung kann im Beispiel-Skript gesetzt werden (ssl/tls)?
- Im Beispiel wird <code class="codeInline">secure</code> in <code class="codeInline">$smtpOptions</code> genutzt, standardmäßig auf <code class="codeInline">ssl</code> gesetzt. Wenn <code class="codeInline">$smtpOptions['secure'] === 'tls'</code> ist, wird <code class="codeInline">SMTPSecure</code> auf **STARTTLS** umgestellt; ansonsten wird implizites TLS über **ENCRYPTION_SMTPS** verwendet.
- Wie übergibt das Skript die Empfänger- und Absenderdaten?
- Das Skript verwendet das Array <code class="codeInline">$mailData</code>. Im Beispiel werden abhängig von den vorhandenen Einträgen gesetzt: - <code class="codeInline">from</code> via <code class="codeInline">setFrom</code> - <code class="codeInline">to</code> via <code class="codeInline">addAddress</code> (mehrere Empfänger möglich) - <code class="codeInline">replyTo</code> via <code class="codeInline">addReplyTo</code> - <code class="codeInline">cc</code> via <code class="codeInline">addCC</code> - <code class="codeInline">bcc</code> via <code class="codeInline">addBCC</code>
- Wie wird im Beispiel-Skript der Mailinhalt (Subject/Body) gesetzt?
- Im Beispiel: - <code class="codeInline">Subject</code> wird aus <code class="codeInline">$mailData['subject']</code> gesetzt (ansonsten: <code class="codeInline">'no subject defined'</code>). - <code class="codeInline">Body</code> wird aus <code class="codeInline">$mailData['body'][0]['content']</code> gelesen (ansonsten: <code class="codeInline">'no body defined'</code>). Außerdem wird <code class="codeInline">isHTML(false)</code> verwendet.
- Gibt es im Beispiel eine Timeout-Einstellung und Debug-Ausgabe für PHPMailer?
- Ja. Das Beispiel setzt: - <code class="codeInline">$mail->Timeout = 10;</code> - <code class="codeInline">$mail->SMTPDebug = SMTP::DEBUG_SERVER;</code> (aktiviert eine ausführliche Debug-Ausgabe für SMTP).