PHPMailer funktioniert mit neuer IPS Version 7 nicht mehr

Mit der Installation von IPS 7 bekomme ich beim E-Mai versenden folgende Fehlermeldung:

Fatal error: Uncaught Error: Call to undefined function each() in C:\ProgramData\Symcon\scripts\class.smtp.php:388
Stack trace:
#0 C:\ProgramData\Symcon\scripts\class.phpmailer.php(756): SMTP->Data(‚Date: Tue, 5 De…‘)
#1 C:\ProgramData\Symcon\scripts\class.phpmailer.php(576): PHPMailer->SmtpSend(‚Date: Tue, 5 De…‘, ‚–b1_5ae0087707…‘)
#2 C:\ProgramData\Symcon\scripts\41312.ips.php(277): PHPMailer->Send()
#3 C:\ProgramData\Symcon\scripts\41312.ips.php(40): sendHtmlMail(‚<body bgc…‘)
#4 {main}
thrown in C:\ProgramData\Symcon\scripts\class.smtp.php on line 388

Ich vermute mal, dass hat mit einer neuen PHP Version zu tun, die IPS ab Version 7 nutzt. Und ich erinnere mich ganz dunkel, dass man wahrscheinlich irgendwo das PHPMailer Modul neu einbinden muss!? Aber wo??? Oder ist der Programmcode nicht mehr aktuell?

function sendHtmlMail ($body) {

	require("class.phpmailer.php");
	$mail = new PHPMailer();
	$mail->Host = "xyz.de";
    $mail->Port = "465";
	$mail->SMTPAuth = true;
	$mail->Username = "a@b.de";
	$mail->Password = "xyz";
    $mail->SMTPSecure = "ssl";

	$mail->IsSMTP();
	$mail->IsHTML(true);
	$mail->CharSet = "UTF-8";
	$mail->Mailer = "smtp";
	$mail->From = utf8_encode("a@b.de");
	$mail->FromName = utf8_encode("xyz");
	$mail->Priority = 1;
	$mail->Subject	= utf8_encode("xyz");
	$mail->Body	= utf8_encode($body);

	$mail->AddAddress(utf8_encode("a@b.de"), utf8_encode("SECURITY"));
	$mail->AddReplyTo(utf8_encode("a@b.de"), utf8_encode("SECURITY"));

    $attachment = CAMS_HOME_DIR . "27470.jpg";
    $mail->addAttachment($attachment, "XYZ.JPEG");

	if(!$mail->Send())
	{
	   echo "Script #".$_IPS['SELF']." Die Mail konnte nicht verschickt werden!><p>";
	   echo "Mailer Error: " . $mail->ErrorInfo;
	   exit;
	}
}

Wäre evtl. unsere SMTP Instanz eine native Alternative? Ab der 7.0 unterstützen wir auch HTML.

paresy

Leider nein, weil ich mehr als ein Attachment verschicken muss. Hast Du eine Idee, warum das mit der neuen 7er Version von IPS nicht mehr läuft?

Danach sieht es aus, denn die Fehlermeldung "Call to undefined function each() " verweist auf eine Funktion die seit PHP 7.2 (entsprechend IPS 5.0) depreciated war und nun in PHP8 offensichtlich entfernt wurde.

Der Code auf dem der Symcon PHPMailer aufbaut ist aktualisiert und nun kompatibel mit PHP8.

Man müsst es also „nur“ in die IPS-Version einbauen. Ob das Austauschen der betreffenden php-Files ausreicht weiß @Fonzo vermutlich!?

Wieso? Es geht doch gar nicht um das Modul PHPMailer von fonzo.
Michael

Sorry, dann hatte ich mich von der Vielfalt der Projekte names PHPMailer verwirren lassen. Der von mir oben verlinkte PHPMailer soll jedenfalls PHP8-kompatibel sein.

Ich brauche bitte noch mal kurz eure Hilfe, weil es schon so lange her ist, dass ich das gemacht habe und ich stehe da irgendwie auf dem Schlauch.

Ist der PHPMailer nicht integraler Bestandteil von der PHP Version 8, die IPS jetzt nutzt? Zumindest kann ich doch die Klasse PHPMailer instanziieren und auch die diversen Methoden-Aufrufe funktionieren (siehe meinen Code oben)…

Oder wie bekomme ich den PHPMailer von Github bei mir rein? Vielen Dank im Voraus…

Nein.

Ja, aber deine Klasse ist halt zu alt…

Dateien runterladen und z.B. in einem neuen Ordner platzieren.

Das ist deine alte Datei. Vermutlich kannst du die also nicht 1:1 ersetzen.
Beispiel aus der Doku vom PHPMailer

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);

Michael

:pray: :pray: :pray:

Vielen Dank Michael!

Ich brauche leider doch nochmal Support:

Ich habe die veralteten PHPMailer Dateien von PHPMailer download | SourceForge.net entfernt und die neuen von Github https://github.com/PHPMailer/PHPMailer/tree/master/src in ein Untervereichnis von Scripts kopiert.

Danach habe ich den IPS Server beendet und nochmal neu gestartet (keine Ahnung, ob das erforderlich ist!?).

Im Script habe ich dann die Dateien eingebunden, was auch funktioniert:

require(„./PHPMailer/PHPMailer.php“);
require(„./PHPMailer/SMTP.php“);

Wenn ich dann allerdings die Klasse PHPMail instanziieren will

$mail = new PHPMailer();

…bekomme ich folgende Fehlermeldung:

Fatal error: Uncaught Error: Class „PHPMailer“ not found in C:\ProgramData\Symcon\scripts\41312.ips.php:280
Stack trace:
#0 C:\ProgramData\Symcon\scripts\41312.ips.php(45): sendHtmlMail(‚<body bgc…‘)
#1 {main}
thrown in C:\ProgramData\Symcon\scripts\41312.ips.php on line 280

Und das Schlüsselwort „use“ führt bei mir immer zu folgendem Fehler:

Parse error: syntax error, unexpected token „use“ in C:\ProgramData\Symcon\scripts\41312.ips.php on line 267

Ein Hinweis, woran das liegen könnte wäre super… Vielen Dank im Voraus!

Hat hierzu jemand einen Tipp für mich?

Es wäre vermutlich für sehr viele IPS Nutzer einfacher, wenn der eingebaute SMTP-Mailer auch mehr als ein Attachment versenden könnte. Das sind wenige Zeilen Code und ich könnte mir den ganzen Aufwand sparen und für Euch wäre das ein leichtes, optional ein zweites oder drittes Attachment zu verarbeiten…

Ich habe keine Ahnung von dem Thema, aber um die mitlesenden PHP-Kenner zur Hilfe zu motivieren würde ich gerne auf die Examples des Github PHPMailer verlinken:

Das sollte doch machbar sein auch in IPS?

Hätte ich auch gedacht! Ist es aber leider nicht. Das fängt schon damit an, dass das Schlüsselwort „use“ zu der Fehlermeldung

Parse error: syntax error, unexpected token „use“ in C:\ProgramData\Symcon\scripts\41312.ips.php on line 267

führt. Ist das nicht Teil des Sprachumfangs von PHP? Auf jeden Fall komme ich hier nicht weiter und habe auch überhaupt keine Idee… :frowning:
Wie gesagt: Am einfachsten wäre es doch, man könnte mit SMTP_SendMailAttachment — IP-Symcon :: Automatisierungssoftware nicht nur ein Attachment versenden! Das wäre mein Wunsch zu Weihnachten :santa:

Das use-Statement selbst wirft bei mir keinen Fehler in IPS, gerade getestet.

Schau mal ob in der Zeile davor ein Semikolon am Zeilenende fehlt!

Danke für Deine Hilfe! :slight_smile:

Die Syntax ist einwandfrei. Aber ich habe jetzt mal das „use“-Statement ganz an den Anfang gesetzt und siehe da: Das läuft ohne Probleme durch.

Dafür kommt jetzt ein anderer Fehler:

Fatal error: Uncaught Error: Class „PHPMailer\PHPMailer\Exception“ not found in C:\ProgramData\Symcon\scripts\PHPMailer\PHPMailer.php:1615
Stack trace:
#0 C:\ProgramData\Symcon\scripts\PHPMailer\PHPMailer.php(1519): PHPMailer\PHPMailer\PHPMailer->preSend()
#1 C:\ProgramData\Symcon\scripts\41312.ips.php(308): PHPMailer\PHPMailer\PHPMailer->send()
#2 C:\ProgramData\Symcon\scripts\41312.ips.php(54): sendHtmlMail(‚<body bgc…‘)
#3 {main}
thrown in C:\ProgramData\Symcon\scripts\PHPMailer\PHPMailer.php on line 1615

Das riecht irgendwie nach einer fehlenden Datei?! Aber die sind eigentlich vollständig von Github nach IPS kopiert:

Bildschirmfoto 2023-12-17 um 19.37.57

Was allerdings nach wie vor zu einem Fehler führt und von mir deshalb auskommentiert wurde, ist die folgende Zeile:

require ‚…/vendor/autoload.php‘;

Warning: require(…/vendor/autoload.php): Failed to open stream: No such file or directory in C:\ProgramData\Symcon\scripts\41312.ips.php on line 7

Der Vendor Pfad zieht ungefähr 50000000 Bibliotheken nachsich. Diese kann der sog. COMPOSER automatisch irgendwoher zaubern. Du baust dir also (gibt es auch als Online-Tool) mittels composer die benötigten Bibliotheken zusammen und kannst dann den vendor Ordner entsprechend in deinem Script Ordner anlegen.

Für mich sieht es nach einem Tippfehler aus, denn in deiner oben zitierten Codezeile hast du 3 Punkte im relativen Pfad anstatt 2 Punkte…

Wenn du hier deinen ganzen Code postest anstatt einzelner Zeilen können die PHP-Spezies vermutlich besser helfen. Zugangsdaten kannst du ja anonymisieren.

OK. Danke. Ich habe mir das Composer Tool runtergeladen und installiert, aber auch hier komme ich nicht wirklich weiter. Bei der Installation soll ich den Pfad für PHP auswählen, aber dort wird nichts angezeigt. Das heißt wohl, das der COMPOSER keine PHP Installation auf meinem Server findet?! Funktioniert das denn überhaupt so mit IPS?

Verstehe ich das richtig, dass der PHPMailer von Github von weitere PHP-Bibliotheken braucht, die ich mit dem COMPOSER zusammen sammle?

Das war wohl eher ein Kopierfehler… Der vollständige Code sieht so aus:

//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
require „…/vendor/autoload.php“;
require(„./PHPMailer/PHPMailer.php“);
require(„./PHPMailer/SMTP.php“);
include („54094.ips.php“); // AQUARIUM
include („27397.ips.php“); // ALARMANLAGE
// AM ANFANG HTML TABELLE VORBEREITEN
$str = ‚‘;
$str .= 'DIVERSE HTML TAGS ';
// DIVERSE FUNKTIONSAUFRUFE ZUM SAMMELN DER DATEN (HIER ENTFERNT)
$str .= "ERGÄNZUNG DER HTML TABELLE ";
sendHtmlMail ($str);
}

function sendHtmlMail ($body) {
try {
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->Host = ‚smtp.xyz.de‘;
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = ‚a@b.de‘;
$mail->Password = ‚xyz‘;
$mail->setFrom(‚a@b.de‘, ‚XYZ INFO‘);
$mail->addReplyTo(‚a@b.de‘, ‚XYZ‘);
$mail->addAddress(‚a@b.de‘, ‚XYZ‘);
$mail->Subject = ‚XYZ INFO MAIL‘;
// $mail->msgHTML($body);
// $mail->AltBody = $body;
$mail->AltBody = ‚TEXT‘;
$mail->addAttachment(CAMS_HOME_DIR . ‚27470.jpg‘);
if (!$mail->send()) {
echo 'Mailer Error: ’ . $mail->ErrorInfo;
} else {
echo ‚Message sent!‘;
}
} catch (Exception $e) {
echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (\Exception $e) { //The leading slash means the Global PHP Exception class will be caught
echo $e->getMessage(); //Boring error messages from anything else!
}
}

Ja so ist es. Composer benötigt php. Also entweder auf dem IP-Symcon rechner ausführen und die Symcon php.exe verlinken (mit der das vielleicht geht) oder php per Hand von php.net herunterladen, entpacken/installieren und den Pfad dort angeben.