HomeMatic Servicemeldung per Mail versenden

Hallo zusammen,

ich habe mir hier aus dem Forum das Skript zum auslesen der HomeMatic Meldungen installiert und das funktioniert auch zuverlässig wenn ich es im Webfront in eine HTML Box packe.

Ich möchte das ganze jetzt aber mit dem E-Mail Modul versenden, dann sieht das ganze aber so aus wie im Bild gezeigt.
Klar da fehlt jetzt der <html> Tag aber ich habe keine Ahnung wo ich den einfügen muss damit mein Mail Programm die Tabelle anzeigt.

Vielleicht könnt ihr ja helfen.

Hier das Skript:

<?
//Erstellt eine Variable die im WebFront alle ServiceMeldungen anzeigt. Einfach in ein Skript kopieren und ausführen.

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//Installer
if ($IPS_SENDER == "Execute")
{
  IPS_SetHidden($IPS_SELF, true);
  IPS_SetName($IPS_SELF, "Auslese-Skript");
  $parentObject = IPS_GetObject($parentID);
  if ($parentObject['ObjectType'] !== 1)
  {
      $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
      IPS_SetParent($instanceID, $parentID);
      $parentID = $instanceID;
      IPS_SetParent($IPS_SELF, $parentID);
      IPS_SetName($instanceID, "Servicemeldungen");
  }
  IPS_SetScriptTimer($IPS_SELF, 300);
}

$texte = Array(
  "CONFIG_PENDING"=>"Konfigurationsdaten stehen zur Übertragung an",
  "LOWBAT"=>"Batterieladezustand gering",
  "STICKY_UNREACH"=>"Gerätekommunikation war gestört",
  "UNREACH"=>"Gerätekommunikation aktuell gestört"
);

$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
$str .= "<tr><td><b>Gerätname</b></td><td><b>GeräteID</b></td><td><b>Meldung</b></td></tr>";

$ids = IPS_GetInstanceListByModuleID("{A151ECE9-D733-4FB9-AA15-7F7DD10C58AF}");
if(sizeof($ids) == 0)
  die("Keine HomeMatic Socket Instanz gefunden!");

$msgs = HM_ReadServiceMessages($ids[0]);
if($msgs === false)
 die("Verbindung zur CCU fehlgeschlagen");

if(sizeof($msgs) == 0)
   $str .= "<tr><td colspan=3><br/>Keine Servicemeldungen!</td></tr>";

foreach($msgs as $msg)
{
  if(array_key_exists($msg['Message'], $texte)) {
    $text = $texte[$msg['Message']];
  } else {
    $text = $msg['Message'];
  }

  $id = GetInstanceIDFromHMID($msg['Address']);
  if(IPS_InstanceExists($id)) {
     $name = IPS_GetLocation($id);
  } else {
     $name = "Gerät nicht in IP-Symcon eingerichtet";
  }

  $str .= "<tr><td>".$name."</td><td>".$msg['Address']."</td><td>".$text."</td></tr>";
}
$str .= "</table>";

$vid = CreateVariableByName($parentID, "Meldungen", 3);
IPS_SetIcon($vid, "Information");
IPS_SetVariableCustomProfile($vid, "~HTMLBox");
SetValue($vid, $str);

function GetInstanceIDFromHMID($sid)
{
 $ids = IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}");
 foreach($ids as $id)
 {
   $a = explode(":", HM_GetAddress($id));
   $b = explode(":", $sid);
   if($a[0] == $b[0])
   {
     return $id;
   }
 }
 return 0;
}

function CreateVariableByName($id, $name, $type)
{
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false)
  {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  }
  return $vid;
}

?>

Das ist das Mail versand Modul:

<?
// ++++++++++++++++ Konfig ++++++++++++++++++++++++++++++++

$zustand = GetValue(41454 /*[Keller\Netzwerk und Systeme\System-intern\Servicemeldungen\Meldungen]*/ );
$uhrzeit = date("H:i.s");
$sendmail = 54301 /*[Skripte\E-Mail System versand\E-Mail senden]*/;
$mailsubject = "IP-Symcon - HM-Systemstatus !";
$mailcontend = "Der HomeMatic Systemstatus: $zustand"  ;

// +++++++++++++++++Konfig Ende ++++++++++++++

SMTP_SendMail($sendmail, $mailsubject, $mailcontend);
?>

und so sieht der Mail Inhalt aus:

Da Du eine HTML-Mail versenden möchtest muß der Content auch HTML sein.

Packe den Content in einen korrektes HTML

<html><body>

Dein Mailinhalt

</body></html>

Ich denke sonst interpretiert dein Mailclient die Tabelle einfach als Text und zeigt diesen auch so an.

Hallo Gemeinde,

ich steh vor dem gleichen Problem. Egal was ich machen will, die Mail wird nicht als HTML Mail erkannt. Die suchfunktion habe ich auch bereits bemüht und habe gefunden, dass ich $headers = "Content-type: text/html
"; einfügen muss, nur wo genau?

Wenn ich es in die SendMail funktion einbaue bekomme ich eine Meldung, dass zu viele Parameter übergeben werden:

SMTP_SendMail($sendmail, $mailsubject, $mailcontend, $headers);

Also an welchem Punkt muss ich IPS SendMail nun sagen, dass er eine HTML Mail verschicken soll.

Grüße

Hi,

gibt es hierzu schon ein Update?

Welche Zeile des Mail-Versende-Scriptes muss man wie verändern, dass eine HTML-Mail rausgeht?

Gruß

Jimmy

Ich entwickle selbst Anwendungen, die E-Mails versenden. Deshalb weiß ich, dass man den Text nicht so beeinflussen kann, dass er von einem Mail Programm als HTML erkannt wird. Dazu müssen die Mail-Header angepasst werden, was aber über die vorhandenen SMTP Befehle allerdings nicht möglich ist.

Wenn es also nicht irgend wann eine extra Funktion für HTML Mails gibt, wird man da eventuell auf externe Programme zurückgreifen müssen, welche HTML versenden können.

Ich werde mir mal anschauen, wie aufwendig das ist, selbst ein kleines Tool zu schreiben, welches dann die Mail als HTML versendet.

Moin!

Ich versende HTML Mails aus IPS ganz einfach mit „PHPMailer“ :slight_smile:
>> PHPMailer/PHPMailer · GitHub

Grüße,
Chri

Richtig! Ich vergesse immer wieder dass Symcon auf PHP basiert…

Dann hier mal ne kurze Zusammenfassung wie man das ganze zum laufen bekommt:

  1. PHPMailer vom obigen Link als ZIP herunterladen und in ein beliebiges Verzeichnis entpacken.
  2. Die Dateien class.phpmailer.php, class.pop3.php, class.smtp.php und PHPMailerAutoload.php in das Skript Verzeichnis von Symcon kopieren (c:\IP-Symcon\scripts)
  3. Im Sende-Skript folgenden Code verwenden:
<?
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();

//SMTP Logging aktivieren
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 0;
$mail->Debugoutput = 'html';


$mail->Host = "SMTP-Server-Adresse";
$mail->Port = 25;
$mail->SMTPAuth = true;
$mail->Username = "Benutzername";
$mail->Password = "Kennwort";
$mail->setFrom('Absende-Adresse', 'Absende-Name');
$mail->addAddress('Empfänger-Adresse', 'Empfänger-Name');
$mail->Subject = 'Betreff der E-Mail';

$mail->msgHTML("<b>Dies ist eine HTML-Nachricht</b>");
$mail->AltBody = 'Dies ist der reine Text falls der Mail-Client kein HTML kann';

//Optional eine Datei anhängen
//$mail->addAttachment('Dateipfad');

//Nachricht senden und Ergebnis auswerten
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
?>

Ich habe das ganze mal als eine ZIP Datei zusammen gestellt.

Einfach den Inhalt der Zip-Datei in das script Verzeichnis entpacken und man kann in den ereignissen, wo man bisher SMTP_SendMail verwendet hat, folgenden Skript verwenden:


require "C:\IP-Symcon\scripts\HTMLMailer.php";
HTMLMailer_SendMail($_IPS['TARGET'], "Betreff", "HTML-Text");

Die Funktion HTMLMailer_SendMail ließt die E-Mail Einstellungen wie die SMTP_SendMail funktion aus dem angegebenen Objekt aus.

Wenn SSL zum versenden verwendet werden soll, muss noch in der php.ini der Eintrag

extension=php_openssl.dll

eingefügt und die Datei phph_openssl.dll hinzugefügt werden.

PHPMailerAutoload.zip (41.5 KB)

Kleine Ergänzung/Korrektur:

require "C:\IP-Symcon\scripts\HTMLMailer.php"; 

Hier reicht:

require "HTMLMailer.php"; 

Und wenn man SSL verwenden möchte, dann reicht nicht die Änderung in der INI, sondern man muss die OpenSSL 0.9.8 Dateien verwenden. Also die Dateien im IP-Sycom Ordner ersetzen durch diese aus dem Download hier >> http://www.ip-symcon.de/files/service/OpenSSL-0.9.8.zip

Grüße,
Chris

Ich werd mich mal ransetzen. Danke für die Hilfestellungen.

Gruß

Jimmy

require „HTMLMailer.php“; hat bei mir zwar in einem Skript, aber nicht direkt als code in einem Ereignis funktioniert.
Deshalb hatte ich den vollständigen Pfad angegeben.

Das mit dem OpenSSL ist ein guter Hinweis. Ich wusste zwar, dass dies benötigt wird, aber da ich es selbst nicht benötige (eigener Mail-Server intern) hab ich nicht weiter danach geschaut.

Hi,

habe das Script nun angepasst und die Dateien in die entsprechenden Ordner kopiert. Aber anscheinend findet es meine SMTP-Instanz nicht. Was muss ich anpassen?

In deinem Fall:
Ersetze in Zeile 13 $_IPS(„TARGET“) durch $sendmail

Original:
Das Skript muss sich in einem Ereignis befinden, welches sich wiederum in der SMTP Instanz befindet.

Alternative 1
Alternativ kann man $_IPS(„TARGET“) in Zeile 13 durch die Objekt ID der SMTP Instanz ersetzen.

Alternative 2
Wenn es sich um einen Skript handelt, der als Skript unterhalb der SMTP Instanz ist, kann man $_IPS(„TARGET“) in Zeile 13 durch IPS_GetParent($_IPS(„SELF“)) ersetzen.

Super, hat geklappt.

Danke.

Gruß Jimmy

Moin,
ich hole hier den Thread mal wieder hoch.
Ich konnte mit Hilfe der vorhergehenden Posts HTML Emails versenden, allerdings nur ohne SSL.
Ich habe eine SMTP Instanz mit SSL , Test Mails gehen raus, alles gut.
Versende ich jedoch mit dem Befehl HTMLMailer_SendMail wird keine Mail gesendet und auch kein Fehler generiert. Auch im Debug des SMTP kommt nichts an.

Weiß jemand ob und wo hier noch Parameter fehlen könnten??

Vielen Dank!

VG
jloose