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/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 = "<default@domain.com>"; }
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 = "<default@domain.com>"; }
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&rec=user@domain.com&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.