====== Email mit PHP Versenden ===== Den PHP Code unten einfach markieren / kopieren und in eine datei einfügen ===== Installation ===== Ihr benötigt folgende Pakete auf eurem Linux System, falls ihr die eine oder andere schon Installiert habt wird diese nicht erneut installiert: aptitude install apache2 php5-curl php5 php5-gd libphp-phpmailer Dann erstellt im Standard webroot Verzeichniss am besten einen Unterordner mail mit: mkdir /var/www/mail Und in diesem Ordner Erstellt ihr die Dateien mit dem Inhalt wie folgt: ==== Nur Mail ==== /mail/mail.php?rec=user@domain.endung&sub=Betreff&mes=text%20der%20gesendet%20werden%20soll error_reporting(E_ALL); if (isset($_GET["rec"])){ $rec = urldecode($_GET["rec"]); } else { $rec = ""; } if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = ""; } if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = ""; } // Mail Parameter $smtp_host = ""; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = ""; $smtp_pwd = ""; $smtp_from = "@domain.endung>"; if (strlen($rec) > 0 and strlen($sub) > 0 or strlen($rec) > 0 and strlen($mes) > 0) { require_once("libphp-phpmailer/class.phpmailer.php"); $body = "\n"; $body .= "

".$mes."

\n"; $body .= "\n"; $mail = new PHPMailer(true); $body = $body; # $body = eregi_replace("[\]",'',$body); $body = preg_replace('/ \ /','',$body); $mail->IsSMTP(); $mail->Host = $smtp_host; $mail->Port = $smtp_port; $mail->SMTPSecure = $smtp_sec; $mail->Username = $smtp_user; $mail->Password = $smtp_pwd; $mail->SetFrom($smtp_from, ''); $mail->AddReplyTo($smtp_from); $mail->Subject = $sub; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML($body); $mail->AddAddress($rec); if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "

Message sent!


"; } } else { echo "Es muss der Empfänger und der betreff angegeben werden"; } ?>
==== Mail mit Bild einer IP Webcam ==== "; } if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = ""; } if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = ""; } #http:///mail/cam_mail.php?cam=cam01|cam02&rec=user@domain.com&sub=Haus%20--%3E%20Klingel! # Voreinstellungen: // Name => URL mit Zugangsdaten der Kameras $URLS = array("cam01" => "http:///snapshot.cgi?user=&pwd=", "cam02" => "http:///snapshot.cgi?user=&pwd="); // Name der Kamera Bilder $NAM = array("cam01" => "Eingang", "cam02" => "Keller"); $smtp_host = ""; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = ""; $smtp_pwd = ""; $smtp_from = "@domain.endung>"; $img_path = "../fotos/images/klingel-cam/"; function getImage($url, $fn, $cam){ #echo "url: $url
"; Global $NAM; $error = false; // Zeitstempel: $title = $NAM[$cam]; #$titel; //"Eingang Rechts"; // Der einzustempelnde Bild-Titel date_default_timezone_set('Europe/Vienna'); $dateformat = "d.m.Y, H:i:s "; // Datums-/Uhrzeitformat nach http://de2.php.net/manual/de/function.date.php $titleFont = "ARIALNB.TTF"; // Leer lassen, wenn die Font-Datei nicht existiert. $titleSize = 15; // Schriftgröße des Titels $titlePositionX = 2; // In Prozent der Bildbreite von links $titlePositionY = 97; // In Prozent der Bildhöhe von oben $dateFont = "ARIALNB.TTF"; // arialbd.ttf Leer lassen, wenn die Font-Datei nicht existiert wichtig z.B. aus windows Font Verzeichnis auf den Server kopieren. $dateSize = 15; // Schriftgröße des Datums $datePositionX = 65; // In Prozent der Bildhöhe von links $datePositionY = 97; // In Prozent der Bildhöhe von oben $fontColor['r'] = "255"; // Rotanteil der Schriftfarbe $fontColor['g'] = "255"; // Grünanteil der Schriftfarbe $fontColor['b'] = "100"; // Blauteil der Schriftfarbe // Weitere Parameter: $imgwidth = "640"; // Breite des Bildes in Pixel (für Fehlerseite) $imgheight = "480"; // Höhe des Bildes in Pixel (für Fehlerseite) $errorText = "Die Webseite bitte neu laden oder die Cam ist aus."; // Fehlertext $errorTextPositionX = 4; // In Prozent von links $errorTextPositionY = 95; // In Prozent von oben $errorBackgroundColor['r'] = "0"; // Rotanteil der Hintergrundfarbe bei Fehlerbild $errorBackgroundColor['g'] = "0"; // Grünanteil der Hintergrundfarbe bei Fehlerbild $errorBackgroundColor['b'] = "0"; // Blauteil der Hintergrundfarbe bei Fehlerbild # Programmteil: // erzeuge einen neuen cURL-Handle $ch = curl_init(); // setze die URL und andere Optionen curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); #curl_setopt($ch, CURLOPT_USERPWD, $credentials); curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); #curl_setopt($ch, CURLOPT_REFERER, $referer); // Hole die Daten von der URL: $imgStream = curl_exec($ch); // Schließe den cURL-Handle und gebe die Systemresourcen frei curl_close($ch); if (($title) or ($dateformat)) { // Wenn Titel oder Datum gewünscht, diese ins Bild stempeln: $image = @ImageCreateFromString($imgStream); if ($image) { $drawColor = ImageColorAllocate($image, $fontColor['r'], $fontColor['g'], $fontColor['b']); if ($title) { if ($titleFont) { ImageTTFText($image, $titleSize, 0, $imgwidth * $titlePositionX / 100, $imgheight * $titlePositionY / 100, $drawColor, $titleFont, $title); } else { ImageString($image, 4, $imgwidth * $titlePositionX / 100, $imgheight * $titlePositionY / 100, $title, $drawColor); } } if ($dateformat) { if ($dateFont) { ImageTTFText($image, $dateSize, 0, $imgwidth * $datePositionX / 100, $imgheight * $datePositionY / 100, $drawColor, $dateFont, date($dateformat)); } else { ImageString($image, 4, $imgwidth * $datePositionX / 100, $imgheight * $datePositionY / 100, date($dateformat), $drawColor); } } } else { $error = true; } if ($error) { $image = imageCreate($imgwidth, $imgheight); $background_color = ImageColorAllocate($image, $errorBackgroundColor['r'], $errorBackgroundColor['g'], $errorBackgroundColor['b']); $drawColor = ImageColorAllocate($image, $fontColor['r'], $fontColor['g'], $fontColor['b']); if ($dateFont) { ImageTTFText($image, $dateSize, 0, $imgwidth * $errorTextPositionX / 100, $imgheight * $errorTextPositionY / 100, $drawColor, $dateFont, $errorText); } else { ImageString($image, 4, $imgwidth * $errorTextPositionX / 100, $imgheight * $errorTextPositionY / 100, $errorText, $drawColor); } } // Ausgabe des Bildes: imagejpeg($image, $fn, 85); } else { // Weder Titel noch Datum - Bild direkt ausgeben if (strlen($fn) > 0 ){ imagejpeg($imgStream, $fn, 85); } else { echo $imgStream; } } echo "

"; } if (strpos($cam, "|")){ $c = explode("|", $cam); foreach ($c as $key => $value) { #echo "images: tmp/".$value.".jpg
"; $images[$value] = "tmp/".$value.".jpg"; getImage($URLS[$value], "tmp/".$value.".jpg", $value); $date = new DateTime(); # Uncomment to copy Images with Timestamp in Name to Images share for later review... #copy("tmp/".$value.".jpg", "../fotos/images/klingel-cam/".$date->format('Ymd_His')."_".$value.".jpg"); } } else { $images[$cam] = "tmp/".$cam.".jpg"; getImage($URLS[$cam], "tmp/".$cam.".jpg", $cam); # Uncomment to copy Images with Timestamp in Name to Images share for later review... #copy("tmp/".$cam.".jpg", "../fotos/images/klingel-cam/".$date->format('Ymd_His')."_".$cam.".jpg"); } # Now send Mail with pictures require_once("libphp-phpmailer/class.phpmailer.php"); $body = "\n"; $body .= "

".$mes."

\n"; foreach ($images as $key => $img) { $body .= "\"img-".$key."\"
"; } $body .= "\n"; $mail = new PHPMailer(true); $body = $body; #$body = eregi_replace("[\]",'',$body); $body = preg_replace('/ \ /','',$body); $mail->IsSMTP(); $mail->Host = $smtp_host; $mail->Port = $smtp_port; $mail->SMTPSecure = $smtp_sec; $mail->Username = $smtp_user; $mail->Password = $smtp_pwd; $mail->SetFrom($smtp_from, ''); $mail->AddReplyTo($smtp_from); $mail->Subject = $sub; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML($body); $mail->AddAddress($rec); if(isset($reco)){ for ($i = 1; $i < count($reco); $i++){ $mail->AddAddress($reco[$i], ""); #echo "Add additional Mail rec: ".$reco[$i]."
"; } } foreach ($images as $key => $img) { $mail->AddEmbeddedImage($img,"img-".$key,$key.".jpg", 'base64', 'image/jpeg'); } if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "

Message sent!


"; } ?>
==== Mail mit Bilder mehrerer Kameras ==== anzupassen! # Error Reporting zu debug zwecken altivieren #error_reporting(E_ALL); # Hier werden die Übergabe Parameter gesetzt und falls diese nicht übergeben wurden mit einem Standard Wert belegt! if (isset($_GET["cam"])){ $cam = $_GET["cam"]; } else { $cam = "cam01"; } if (isset($_GET["rec"])){ $rec = urldecode($_GET["rec"]); } else { $rec = "@."; } if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = "Haus Kameras"; } if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = "Hier die Aktuellen Bilder"; } #Test Aufruf #http:////cam_mail.php?cam=cam01|cam04&rec=@.&sub=Haus%20--%3E%20Klingel! # Wenn das Mail an einen Weiteren Empfaenger Zusätzlich gesendet werden soll, die Mail Adresse in der nächsten Zeile anpassen und aktivieren durch löschen des # Zeichens am Anfang! # $rec = "haus@.|".$rec; # Voreinstellungen: ############### Kameras # URL Beispiel einer Foscam Kamera #$CA["cam01"]["URL"] = "http:///snapshot.cgi?user=&pwd="; #$CA["cam01"]["TITLE"] = "Beschreibung die ins Bild eingebettet wird"; # Erste Kamera $CA["cam01"]["URL"] = ""; $CA["cam01"]["TITLE"] = ""; # Zweite Kamera #$CA["cam02"]["URL"] = ""; #$CA["cam02"]["TITLE"] = ""; # Dritte Kamera #$CA["cam03"]["URL"] = ""; #$CA["cam03"]["TITLE"] = ""; # Diese "Liste" kann "Unendlich" Verlängert werden solange der Name (in dem Beispiel oben cam01) Eindeutig ist! ############### Mailserver $smtp_host = ""; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = ""; $smtp_pwd = ""; $smtp_from = "@domain.endung>"; ############### Lokale Speicherung # Wenn die Bild(er) auch Lokal gespeichert werden sollten dann $save_local auf true stellen und einen Relativen Pfad von diesem Script aus angeben wo die Bilder abgelegt werden können --> Ordner erstellen und Rechte für den Benutzer www-data setzen! $save_local = true; # Relativer Pfad $img_path = "../fotos/images/klingel-cam/"; # oder Absoluter Pfad #$img_path = "./var/www/fotos/images/klingel-cam/"; ############################## KEINE ANPASSUNGEN AB HIER NOETIG ############### if (strpos($rec, "|") > 0){ $reco = explode("|", $rec); } else { $reco[0] = $rec; } function getImage($url, $fn, $cam, $title){ Global $NAM; $error = false; // Zeitstempel: date_default_timezone_set('Europe/Vienna'); $dateformat = "d.m.Y, H:i:s "; // Datums-/Uhrzeitformat nach http://de2.php.net/manual/de/function.date.php $titleFont = "ARIALNB.TTF"; // Leer lassen, wenn die Font-Datei nicht existiert. $titleSize = 15; // Schriftgröße des Titels $titlePositionX = 2; // In Prozent der Bildbreite von links $titlePositionY = 97; // In Prozent der Bildhöhe von oben $dateFont = "ARIALNB.TTF"; // arialbd.ttf Leer lassen, wenn die Font-Datei nicht existiert wichtig z.B. aus windows Font Verzeichnis auf den Server kopieren. $dateSize = 15; // Schriftgröße des Datums $datePositionX = 65; // In Prozent der Bildhöhe von links $datePositionY = 97; // In Prozent der Bildhöhe von oben $fontColor['r'] = "255"; // Rotanteil der Schriftfarbe $fontColor['g'] = "255"; // Grünanteil der Schriftfarbe $fontColor['b'] = "100"; // Blauteil der Schriftfarbe // Weitere Parameter: $errorText = "Die Webseite bitte neu laden oder die Cam ist aus."; // Fehlertext $errorTextPositionX = 4; // In Prozent von links $errorTextPositionY = 95; // In Prozent von oben $errorBackgroundColor['r'] = "0"; // Rotanteil der Hintergrundfarbe bei Fehlerbild $errorBackgroundColor['g'] = "0"; // Grünanteil der Hintergrundfarbe bei Fehlerbild $errorBackgroundColor['b'] = "0"; // Blauteil der Hintergrundfarbe bei Fehlerbild # Programmteil: # erzeuge einen neuen cURL-Handle $ch = curl_init(); # setze die URL und andere Optionen curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); # Hole die Daten von der URL: $imgStream = curl_exec($ch); # Schließe den cURL-Handle und gebe die Systemresourcen frei curl_close($ch); if (($title) or ($dateformat)) { # Wenn Titel oder Datum gewünscht, diese ins Bild stempeln: $image = @ImageCreateFromString($imgStream); # Ausgabe des Bildes: imagejpeg($image, $fn, 85); $size = getimagesize($fn); $imgwidth = $size[0]; $imgheight = $size[1]; if ($image) { $drawColor = ImageColorAllocate($image, $fontColor['r'], $fontColor['g'], $fontColor['b']); if ($title) { if ($titleFont) { ImageTTFText($image, $titleSize, 0, $imgwidth * $titlePositionX / 100, $imgheight * $titlePositionY / 100, $drawColor, $titleFont, $title); } else { ImageString($image, 4, $imgwidth * $titlePositionX / 100, $imgheight * $titlePositionY / 100, $title, $drawColor); } } if ($dateformat) { if ($dateFont) { ImageTTFText($image, $dateSize, 0, $imgwidth * $datePositionX / 100, $imgheight * $datePositionY / 100, $drawColor, $dateFont, date($dateformat)); } else { ImageString($image, 4, $imgwidth * $datePositionX / 100, $imgheight * $datePositionY / 100, date($dateformat), $drawColor); } } } else { $error = true; } if ($error) { $image = imageCreate($imgwidth, $imgheight); $background_color = ImageColorAllocate($image, $errorBackgroundColor['r'], $errorBackgroundColor['g'], $errorBackgroundColor['b']); $drawColor = ImageColorAllocate($image, $fontColor['r'], $fontColor['g'], $fontColor['b']); if ($dateFont) { ImageTTFText($image, $dateSize, 0, $imgwidth * $errorTextPositionX / 100, $imgheight * $errorTextPositionY / 100, $drawColor, $dateFont, $errorText); } else { ImageString($image, 4, $imgwidth * $errorTextPositionX / 100, $imgheight * $errorTextPositionY / 100, $errorText, $drawColor); } } imagejpeg($image, $fn, 85); } else { # Weder Titel noch Datum - Bild direkt ausgeben if (strlen($fn) > 0 ){ imagejpeg($imgStream, $fn, 85); } else { echo $imgStream; } } echo "

"; } if (strpos($cam, "|")){ $c = explode("|", $cam); $date = new DateTime(); $dd = $date->format('Ymd_His'); foreach ($c as $key => $value) { $images[$value] = "tmp/".$value.".jpg"; getImage($CA[$value]["URL"], "tmp/".$value.".jpg", $value, $CA[$value]["TITLE"]); if ($save_local){ #Copy Images with Timestamp in Name to Images share... copy("tmp/".$value.".jpg", $img_path.$dd."_".$value.".jpg"); } } } else { $images[$cam] = "tmp/".$cam.".jpg"; getImage($URLS[$cam], "tmp/".$cam.".jpg", $cam); } require_once("libphp-phpmailer/class.phpmailer.php"); $body = "\n"; $body .= "

".$mes."

\n"; foreach ($images as $key => $img) { $body .= "\"img-".$key."\"
"; } $body .= "\n"; $mail = new PHPMailer(true); $body = $body; $body = preg_replace('/ \ /','',$body); $mail->IsSMTP(); $mail->Host = $smtp_host; $mail->Port = $smtp_port; $mail->SMTPSecure = $smtp_sec; $mail->Username = $smtp_user; $mail->Password = $smtp_pwd; $mail->SetFrom($smtp_from, ''); $mail->AddReplyTo($smtp_from); $mail->Subject = $sub; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML($body); for ($i = 0; $i < count($reco); $i++){ $mail->AddAddress($reco[$i], ""); } foreach ($images as $key => $img) { $mail->AddEmbeddedImage($img,"img-".$key,$key.".jpg", 'base64', 'image/jpeg'); } if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "

Message sent!


"; } ?>
===== Verwendung mit einem CCU / LXCCU Programm ===== Es muss das CUxD Addon installiert und ein System Exec Gerät angelegt sein, dann könnt ihr in euren Scripts mails senden indem ihr folgende Zeilen einfügt: ==== Nur Mail ==== var sub = "Betreff"; var text = "Text"; string url="wget -q -O - 'http:///mail.php?rec=@.&sub=" + sub + "&mes=" + text +"'"; dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(url); ==== Mail mit Bild einer Webcam ==== string url="wget -q -O - 'http:///mail/cam_mail.php?cam=cam01|cam02&rec=@.&sub=Haus%20--%3E%20Klingel!'"; dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(url); ==== Troubleshooting ==== Wenn es Probleme beim senden mit diversen Providern gibt einfach im Internet nach: phpmailer provider für [[http://phpmailer.worxware.com/?pg=examplebgmail|Gmail]] habe ich so dieses Beispiel gefunden.