E-Mail mit php script über ssmtp versenden

Hallo Zusammen

Ich möchte bei einem bestimmten Ereignis von meinem Homegear-Server eine E-Mail zugesandt bekommen. Das stelle ich mir so vor, daß ich zum Beispiel darauf hingewiesen werde, wenn eine Batterie leer wird:

rc $hg->addEvent(array("TYPE" => 0,"ID" =>  "MyBatteryEmptyEvent","PEERID" => 1,"PEERCHANNEL" => 1,"TRIGGER" => 8,"TRIGGERVALUE" => true,"VARIABLE" => "LOWBAT","EVENTMETHOD" => "runScript","EVENTMETHODPARAMS" => array("battlow.php") ))

Dazu habe ich einen ssmtp-Server korrekt konfiguriert und dieses Skript geschrieben:

#!/usr/bin/env php
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
try{
        $komplettText = "Batterie ist schwach";
        $receiver = 'valid@mailadress.com';
        $subject = 'My Test script';
        $headers = 'From: valid@senderadress.net' . "\n" .
        'Reply-To: valid@senderadress.net' . "\n" .
        'X-Mailer: PHP/' . phpversion();
        $status = mail($receiver,$subject,$komplettText);
}
catch(\Homegear\HomegearException $e) {
        print "Exception catched. Code: ".$e->getCode().". Message: ".$e->getMessage();
}
?>

zusätzlich habe ich in den Dateien /etc/homegear/php.ini und /etc/php/php.ini folgenden Abschnitt eingefügt:

[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/bin/ssmtp -t
mail.add_x_header = On

Nun zum Kern der Frage. Das angegebene Skript funktioniert, wenn ich es direkt mit php battlow.php aufrufe. Wenn ich es aber in der Homegear-Konsole starte mit rc $hg->runScript("battlow.php")
, dann bekomme ich keine Mail. Im Logfile /var/log/homegear/homegear.log erhalte ich nur folgenden Eintrag:

02/01/17 18:45:12.946 Script Engine Server: Info: Starting script "/var/lib/homegear/scripts/inline.php" with id 1803.
02/01/17 18:45:12.966 Script Engine Server: Info: Client number 0 is calling RPC method: runScript Parameters:
(String) battlow.php
02/01/17 18:45:12.966 Info: Executing script "/var/lib/homegear/scripts/battlow.php" with parameters "" using internal script engine.
02/01/17 18:45:12.967 Script Engine Server: Info: Starting script "/var/lib/homegear/scripts/battlow.php" with id 1804.
02/01/17 18:45:12.972 Script Engine Server: Response: 
(Struct length=2)
{
  [EXITCODE]
  {
    (Integer) 0
  }
  [OUTPUT]
  {
    (String) 
  }
}
02/01/17 18:45:12.981 Script Engine Server: Info: Client number 0 is calling RPC method: scriptFinished
(Integer) 0
02/01/17 18:45:12.981 Info: Script with id 1803 finished with exit code 0
02/01/17 18:45:12.982 Script Engine Server: Response: 
(void)
02/01/17 18:45:13.060 Script Engine Server: Info: Client number 0 is calling RPC method: scriptFinished
(Integer) 0
02/01/17 18:45:13.062 Info: Script with id 1804 finished with exit code 0
02/01/17 18:45:13.064 Script Engine Server: Response:

Ich suche seit Tagen in den Foren und Logfiles nach Hinweisen für mein Problem, aber ich komme nicht weiter. Es wäre großartig, wenn mir jemand weiterhelfen könnte. Vielen Dank im Voraus,
Alexander

Hi @Nerdgear,

Exit-Code 0 ist unter Linux/Unix “all good” - frei nach dem Motto “no news is good news”.
Mit exit() kannst du einen speziellen Code senden, wenn benötigt: http://php.net/manual/de/function.exit.php - Beispiel #2

Gleichzeitig solltes du auf deinem Pi mal in /var/log/mail.log gucken. Dort stehen die Meldungen des lokalen MTA (Mail Transfer Agent). Ich kann gerade nicht sagen ob standardmäßig einer installiert ist - postfix wäre hier der geeignete Kandidat.

Da du aber Mails von (wahrscheinlich) einer dynamischen offiziellen IP versenden willst, wird dich jeder vernünftige Mailserver als Spam behandeln. Dies würde nur funktionieren, wenn du deinem Pi einen Relay-Host, der ein “echter” E-Mail Server ist, konfigurierst.

Ich empfehle dir eine Klasse wie PHPMailer zu nutzen und deine Mails per SMTP mit Authentifizierung über deinem E-Mail Anbieter zu versenden: http://phpmailer.worxware.com/?pg=examplebsmtp

so long,
p

Hi pmayer,

Vielen Dank für Deine Antwort. Im Logfile finden sich leider auch keine hilfreichen Hinweise. Starte ich das Skript mit php, so erhalte ich folgende Log-Einträge:

Feb 03 16:31:58 homegearPI sSMTP[15087]: Creating SSL connection to host
Feb 03 16:31:58 homegearPI sSMTP[15087]: SSL connection using ECDHE-RSA-AES256-GCM-SHA384
Feb 03 16:31:59 homegearPI sSMTP[15087]: Sent mail for valid@mailadress.net (221 gmx.com Service closing transmission channel) uid=0 username=homegear outbytes=505

Starte ich das Skript aus der Homegear-Konsole, so wird kein Log-Eintrag erzeugt.
Es liegt auch nicht daran, daß ich einen “echten” Mailserver benötige. Dann würde es ja auch nicht funktionieren, wenn ich das Skript über php pattlow.php starte. In diesem Fall funktioniert aber alles und die Mail kommt bei mir an.

Ich werde auf jeden Fall mal PHPMailer ausprobieren. Ich werde dann berichten, ob es geklappt hat.
Bis dann,
Alexander

Oh,

ich gebe zu, ich hatte ssmtp für einen Schreibfehler gehalten. Ssmtp kenne ich persönlich nicht.

So lange deine Dial-Up IP nicht auf einer Spamliste steht, wird das versenden funktionieren. Prüfen kannst du das zum Beispiel hier: http://www.dnsbl.info/
Auf Nummer sicher gehst du eben, wenn du den Weg über SMTP mit Auth bei deinem E-Mail Anbieter gehst.

Was du übrigens noch machen kannst, wäre in deiner php.ini mal ein error_log in eine Datei zu konfigurieren und dir diese anschauen.

Ist eigentlich sicher gestellt, dass homegear diese php.ini, in der du deine Einstellungen gemacht hast, nutzt? Sollte ja dann /etc/homegear/php.ini… Du kannst php mit -c mitteilen, welche php.ini genutzt werden soll.

@sathya, kannst du was dazu sagen, warum keine Meldungen im Log beim Ausführen über Homegear auftauchen?

Hi pmplayer,
Nochmals vielen Dank. Ich habe mittlerweile alles auf PHPMailer umgebaut. Ich habe einfach das “Simple Example” von https://github.com/PHPMailer/PHPMailer angepasst und so hat es auf Anhieb funktioniert.

Ich habe das alte Skript trotzdem noch einmal getestet. Mit
php -c /etc/homegear/php.ini test2.php
sollte es die php.ini verwenden, die auch von Homegear aus genutzt wird. Die Mail kam damit problemlos an. An der /etc/homegear/php.ini lag es also wohl nicht.

Auf jeden Fall ist es ein sehr sinnvollet Tipp, die Log-Meldungen für php einzuschalten. Ich habe also in /etc/homegear/php.ini die Zeile error_log = syslog eingefügt (Mein System läuft eigentlich mit Systemd, das sollte so aber funktionieren). Danach habe ich ein fehlerhaftes Skript einmal aus der Homegear-Konsole gestartet und einmal mit
php -c /etc/homegear/php.ini testfehler.php

Beim Start über die Homegear-Konsole gab es keinen Log-Eintrag und Homegear meldet: Exit code: 0
Beim der Ausführung direkt mit php bekomme ich die entsprechende Fehlermeldung auf der Konsole und folgenden Fehlereintrag im Journal:
Feb 12 17:35:14 homegearPI php[5939]: PHP Parse error: syntax error, unexpected ‘fehler’ (T_STRING) in /var/lib/homegear/scripts/testfehler.php on line 11

Vielleicht hilft das bei der Ursachenforschung weiter. Mein eigentliches Problem konnte ich jedenfalls mit PHPMailer lösen.
Bis dann,
Alexander

1 Like

Hallo @Nerdgear,

mich wundert, dass der Direktaufruf des Skriptes funktioniert hat, es über Homegear aber nicht geklappt hat. Müsste ich selbst debuggen.

Die PHP-Meldungen werden standardmäßig in /var/log/homegear/homegear-scriptengine.log und Fehler in /var/log/homegear/homegear-scriptengine.err geloggt. Ein Umleiten aufs syslog oder eine andere Logdatei ist also nicht erforderlich.

Viele Grüße

Sathya

1 Like