Email mit SMTP_SendMailMediaEx kein Attachment

Wenn ich SMTP_SendMailMediaEx richtig verstehe kommt als letzter Parameter doch die ObjektId eines Media Elements hin. Ich möchte eine Email mit einem Bild, was in dem Media Element enthalten ist, verschicken.

Die Email kommt auch an, aber leider ohne Bild bzw. Anhang. Mache ich da irgendwas falsch bzw. ist da noch etwas zu beachten?

Hallo Fonzo,

ich mach das (eingekürzt) so:

	if (strpos( IPS_GetKernelDir(),":"))
	   {
			//echo "Win";
			$fileName = "L:/ServerFolders/Bilder/Cams/Torweg.jpg";
           }
	else
	   {
			//echo "Pi";
			$fileName = IPS_GetKernelDir()."cams/Torweg.jpg";
	   }

	$datum = date("Ymd_His", $timestamp);

	if (strpos(IPS_GetKernelDir(),":"))
	        {$Versender = "WHS";}
	else
		{$Versender = "Pi2";}

	SMTP_SendMailAttachment(26698 /*[E-Mail senden (SMTP)]*/ , $Versender." Torweg: ", $datum, $fileName);


Edit: Das Bild muss zum Zeitpunkt des Sendens (schon/noch) vorhanden sein :slight_smile:

Nun letzteres ist genau mein Problem das Bild existiert gar nicht auf der Festplatte sondern nur im Arbeitsspeicher ich kann es also nur per
SMTP_SendMailMedia
bzw.
IPS_GetMediaContent
holen. Ich dachte eigentlich das die obere Funktion genau das macht ohne das man noch etwas zwischenspeichern muss oder sehe ich das falsch?

Sollte genau so funktioniere wie im ersten Post beschrieben, genau deswegen gibt es diese Funktion ja.
Michael

Tja tut es aber irgendwie nicht, ist das dann ein Bug? Email kommt an aber ohne Anhang.

Wenn ich den Umweg gehe über


$image = base64_decode(IPS_GetMediaContent($MediaID));
$Lokale_BildDatei = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."pic.jpg";
file_put_contents($Lokale_BildDatei, $image);
$attimg = $Lokale_BildDatei;

$Betreff = "Betreff IPS";
$Message = "Test Message!";
SMTP_SendMailAttachment($emailid, $Betreff, $Message, $attimg);

kommt Email mit Anhang an, aber ist die Funktion oben nicht eigentlich dafür gedacht das ich nicht mehr den Weg gehen muss und zwischenspeichern?:confused:

Magst du mir mal ein var_dump(IPS_GetMedia($id)) auf deine Medien Datei machen? Die Funktion sollte eigentlich korrekt laufen- benötigt aber, dass ein MediaFile gesetzt ist mit dem korrekten Dateinamen. (Es geht quasi um die Dateierweiterung die wir fur den mime type brauchen)

paresy


array(8) {
  ["MediaID"]=>
  int(32669)
  ["MediaType"]=>
  int(1)
  ["MediaFile"]=>
  string(0) ""
  ["MediaUpdated"]=>
  int(1475316655)
  ["MediaIsCached"]=>
  bool(true)
  ["MediaCRC"]=>
  string(8) "C08FC394"
  ["MediaSize"]=>
  int(29157)
  ["MediaIsAvailable"]=>
  bool(true)
}

Das Media Element wurde mit


IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen

beschrieben.
Nun letzteres ist wohl genau das Problem es gibt keine physikalische Mediendatei, da die Grafik im Arbeitsspeicher ist und dazu müsste der IP Dienst ja beendet werden damit diese gespeichert wird. Also wie löst man das dann am besten?

An andere Stelle bestimme ich den Mime-Type so
Image Datei in externer Webseite anzeigen
geht bestimmt aber auch anders.

Du musst aber eine Datei angeben. Damit IPS beim Shutdown auch sichern kann.
Ich habe in vielen meiner Module SetCover oder SetImage Funktionen. Da kannst du sehen wie es funktioniert.
Michael

Wenn ich das richtig verstehe muss ich also das erste mal wenn es das Medien Objekt noch nicht gibt eine Datei physikalisch abspeichern und diese dann über IPS_SetMediaFile zuweisen. Wenn sich nun das Bild erneuert weise ich dann dem bestehenden Medienobjekt IPS_SetMediaContent den neuen Bildinhalt zu. Das File auf dem physikalischen Speicher wird dabei nur das aller erste mal beim neu anlegen geschrieben und dann jedes mal wenn der IP Symcon Dienst sich beendet. Ist das so richtig? Wäre vielleicht gut wenn man das noch irgendwie verständlich in der Dokumention ergänzen könnte.

Nein musst du nicht.
Ich sagte nur; du musst eine Datei angeben.
Das machst du mit IPS_SetMediaFile — IP-Symcon :: Automatisierungssoftware

Beispiel:


        $CoverID = @IPS_GetObjectIDByIdent('CoverIMG', $this->InstanceID);
        if ($CoverID === false)
        {
            $CoverID = IPS_CreateMedia(1);
            IPS_SetParent($CoverID, $this->InstanceID);
            IPS_SetIdent($CoverID, 'CoverIMG');
            IPS_SetName($CoverID, 'Cover');
            IPS_SetPosition($CoverID, 27);
            IPS_SetMediaCached($CoverID, true);
            $filename = "media" . DIRECTORY_SEPARATOR . "Cover_" . $this->InstanceID . ".png";
            IPS_SetMediaFile($CoverID, $filename, False);
        }

        // $CoverRAW enthält das Bild.

        IPS_SetMediaContent($CoverID, base64_encode($CoverRAW));

Michael

Super danke, habe ich gemacht nun funktioniert auch die Funktion und es kommt ein Attachement mit der Email an :).