Inhaltsverzeichnis
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
<?php # Folgende Pakete müssen unter Debian Installiert sein # aptitude install apache2 php5-curl php5 php5-gd libphp-phpmailer #Aufruf Beispiel: http://<ip des servers>/mail/[email protected]&sub=Betreff&mes=text%20der%20gesendet%20werden%20soll error_reporting(E_ALL); if (isset($_GET["rec"])){ $rec = urldecode($_GET["rec"]); } else { $rec = "<[email protected]>"; } if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = "<default subject>"; } if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = "<default message text>"; } // Mail Parameter $smtp_host = "<mail.server.com>"; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = "<user>"; $smtp_pwd = "<password>"; $smtp_from = "<absender>@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 = "<html><body bgcolor=\"#ffffff\">\n"; $body .= "<p>".$mes."</p>\n"; $body .= "</body></html>\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 "<p><b>Message sent!</b></p><br>"; } } else { echo "Es muss der Empfänger und der betreff angegeben werden"; } ?>
Mail mit Bild einer IP Webcam
<?php # Folgende Pakete müssen unter Debian Installiert sein # aptitude install apache2 php5-curl php5 php5-gd libphp-phpmailer # Auch muss der Unterordner tmp existieren und für den user/gruppe www-data beschreibbar sein! # Nicht vergessen die Pfade / Zugangsdaten für die Kameras anzupassen error_reporting(E_ALL); if (isset($_GET["cam"])){ $cam = $_GET["cam"]; } else { $cam = "cam01"; } if (isset($_GET["rec"])){ $rec = urldecode($_GET["rec"]); } else { $rec = "<[email protected]>"; } if (isset($_GET["sub"])){ $sub = urldecode($_GET["sub"]); } else { $sub = "<default subject>"; } if (isset($_GET["mes"])){ $mes = urldecode($_GET["mes"]); } else { $mes = "<default message text>"; } #http://<ip des servers>/mail/cam_mail.php?cam=cam01|cam02&[email protected]&sub=Haus%20--%3E%20Klingel! # Voreinstellungen: // Name => URL mit Zugangsdaten der Kameras $URLS = array("cam01" => "http://<ip der webcam>/snapshot.cgi?user=<user>&pwd=<password>", "cam02" => "http://<ip der webcam>/snapshot.cgi?user=<user>&pwd=<password>"); // Name der Kamera Bilder $NAM = array("cam01" => "Eingang", "cam02" => "Keller"); $smtp_host = "<mail.server.com>"; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = "<user>"; $smtp_pwd = "<password>"; $smtp_from = "<absender>@domain.endung>"; $img_path = "../fotos/images/klingel-cam/"; function getImage($url, $fn, $cam){ #echo "url: $url<br>"; 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 "<br><img src=\"$fn\"><br>"; } if (strpos($cam, "|")){ $c = explode("|", $cam); foreach ($c as $key => $value) { #echo "images: tmp/".$value.".jpg<br>"; $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 = "<html><body bgcolor=\"#ffffff\">\n"; $body .= "<h2 style=\"color:black; font-family:sans-serif;\">".$mes."</h2>\n"; foreach ($images as $key => $img) { $body .= "<img alt=\"img-".$key."\" src=\"cid:img-".$key."\" alt=\"img".$key."\"/><br>"; } $body .= "</body></html>\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]."<br>"; } } 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 "<p><b>Message sent!</b></p><br>"; } ?>
Mail mit Bilder mehrerer Kameras
<?php ############### Voraussetzungen # Folgende Pakete müssen unter Debian Installiert sein # aptitude install php5-curl libphp-phpmailer # Auch muss der Unterordner tmp existieren und für den user/gruppe www-data beschreibbar sein! # Nicht vergessen die daten in den <spitzen Klammern> 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 = "<empfaenger>@<domain>.<endung>"; } 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://<ip>/<ordner>/cam_mail.php?cam=cam01|cam04&rec=<empfaenger>@<domain>.<endung>&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@<domain>.<endung>|".$rec; # Voreinstellungen: ############### Kameras # URL Beispiel einer Foscam Kamera #$CA["cam01"]["URL"] = "http://<ip der webcam>/snapshot.cgi?user=<user>&pwd=<password>"; #$CA["cam01"]["TITLE"] = "Beschreibung die ins Bild eingebettet wird"; # Erste Kamera $CA["cam01"]["URL"] = "<url>"; $CA["cam01"]["TITLE"] = "<Eingang>"; # Zweite Kamera #$CA["cam02"]["URL"] = "<url>"; #$CA["cam02"]["TITLE"] = "<Beschreibung>"; # Dritte Kamera #$CA["cam03"]["URL"] = "<url>"; #$CA["cam03"]["TITLE"] = "<Beschreibung>"; # Diese "Liste" kann "Unendlich" Verlängert werden solange der Name (in dem Beispiel oben cam01) Eindeutig ist! ############### Mailserver $smtp_host = "<mail.server.com>"; $smtp_port = "25"; $smtp_sec = "tls"; $smtp_user = "<user>"; $smtp_pwd = "<password>"; $smtp_from = "<absender>@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 "<br><img src=\"$fn\"><br>"; } 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 = "<html><body bgcolor=\"#ffffff\">\n"; $body .= "<h2 style=\"color:black; font-family:sans-serif;\">".$mes."</h2>\n"; foreach ($images as $key => $img) { $body .= "<img alt=\"img-".$key."\" src=\"cid:img-".$key."\" alt=\"img".$key."\"/><br>"; } $body .= "</body></html>\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 "<p><b>Message sent!</b></p><br>"; } ?>
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://<ip des rechners wo die php seiten liegen>/mail.php?rec=<mailbox>@<domain>.<endung>&sub=" + sub + "&mes=" + text +"'"; dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(url);
Mail mit Bild einer Webcam
string url="wget -q -O - 'http://<ip des rechners wo die php seiten liegen>/mail/cam_mail.php?cam=cam01|cam02&rec=<mailbox>@<domain>.<endung>&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 Gmail habe ich so dieses Beispiel gefunden.