ShellMailer

Der ShellMailer ist ein PHP-Script, mit dessen Hilfe per CLI / Script-Dateien E-Mails inkl. Anhang versendet werden können.

Bei Bedarf wird ein Log-File geschrieben und versendete E-Mails lokal als HTML-Datei abgelegt.

Hinweis: Das Script ist nicht dafür gedacht SPAM o.ä. zu verbreiten.

Lege dir eine neue PHP-Datei für das Script an. Bspw. per Terminal mit folgenden Befehl:

sudo nano /pfad/zu/shell_mailer.php

Füge das u.s. Script ein, passe es mit deinen Angaben an und speichere die Datei dann per STRG + O, schließe sie per STRG + X.

Das Script muss nun noch ausführbar gemacht werden:

sudo chmod 775 /pfad/zu/shell_mailer.php

Aufruf des PHP-Scripts per CLI / innerhalb eines Shell-Scripts:

sudo php /pfad/zu/shell_mailer.php "AN@MAIL.TLD" "VON_NAME" "VON@MAIL.TLD" "BETREFF_ZEILE" "TEXTINHALT" "PFAD_ZUM_ANHANG1, PFAD_ZUM_ANHANG2"

Anzeige

Das Script

<?php
	/* 
	 * ShellMailer_PHP
	 * 
	 * @AUTOR: Sascha Syring
	 * @WEBSEITE: www.sascha-syring.net
	 * @VERSION: 1.0_RD09112022
	 *  
	 * Ein einfaches, anpassbares PHP-Script welches über die CLI / Kommandozeile ausgeführt wird 
	 * und Mails versendet. - PHP und somit ein Webserver müssen installiert und eingerichtet sein.
	 * 
	 * Zudem muss auf dem System sendmail konfiguriert und für PHP eingerichtet sein. Eine Anleitung 
	 * hierfür ist hier zu finden: https://www.sascha-syring.net/den-pi-einrichten/e-mails-versenden-mit-msmtp/
	 * 
	 * Aufruf: sudo php /pfad/zu/shell_mailer.php "AN@MAIL.TLD" "VON_NAME" "VON@MAIL.TLD" "BETREFF_ZEILE" "TEXTINHALT" "ANHANG1, ANHANG2"
	 * Optionale Parameter (müssen mindestens leer ("") übergeben werden):
	 * - VON_NAME
	 * - VON@MAIL.TLD
	 * - ANHANG
	 * 
	 * Die E-Mail wird im HTML-Format versendet und unterstützt den "Darkmode" auf kompatiblen Endgeräten
	 * 
	 * 
	 * */
	
	// allgemeine Variablen

	$var_an = $argv[1];
	$var_von_name = $argv[2];
	$var_von_mail = $argv[3];
	$var_betreff = $argv[4];
	$var_text = $argv[5];
	$var_anhang_pfad = $argv[6];
	
	$var_default_from_name = "STANDARD_ABSENDERNAME";  // Standard Absendername
	$var_default_from_mail = "STANDARD_ABSENDERMAIL";  // Standard Absender-Email
	
	$use_logfile = 1;  // 1 = Logfile schreiben, 0 = kein Logfile schreiben
	$use_mailarchive = 1;  // 1 = gesendete E-Mails archivieren, 0 = gesendete E-Mails nicht archivieren
	$var_logfile_dir = "/var/log/shell_mailer";  // Verzeichnis für Logilfe und Mail-Archiv
	$var_logfile_path = $var_logfile_dir."/shell_mailer.log";  // Pfad zum Logfile für versendete Mails
	
	$use_mail_header_image = 1;  // 1 = Header-Bild anzeigen, 0 = kein Header-Bild anzeigen
	$var_mail_header_image = "PFAD_ZUM_HEADERBILD";  // Bild für den Header der E-Mail
	
	if($var_anhang_pfad != "")
	{
		if(strpos($var_anhang_pfad, ",") !== false){
			$var_anhang_pfad = explode(",", $var_anhang_pfad);
			$var_anhang_pfad = array_map("trim", $var_anhang_pfad);
		}
      
		if(!is_array($var_anhang_pfad)) {
			$var_anhang_pfad = array($var_anhang_pfad);
		}   
      
		$attachments = array();
		foreach($var_anhang_pfad AS $key => $val) {
			if(is_int($key)) {
				$datei = $val;
				$name = basename($datei);
			} else {
				$datei = $key;
				$name = basename($val);
			}
        
			$size = filesize($datei);
			$data = file_get_contents($datei);
			$type = mime_content_type($datei);
        
			$attachments[] = array("name"=>$name, "size"=>$size, "type"=>$type, "data"=>$data);
		}
	}
	
	if ( !is_dir($var_logfile_dir) ) 
	{
		mkdir($var_logfile_dir, 0755);
		mkdir($var_logfile_dir."/mails", 0755);
	}
	elseif ( !is_dir($var_logfile_dir."/mails") ) 
	{
		mkdir($var_logfile_dir."/mails", 0755);
	}
	
	// Mail aufbauen
	$message = "
	<html>
		<head>
			<meta name='color-scheme' content='light dark'>
			<meta name='supported-color-schemes' content='light dark'>
		</head>
		<body>
			<div style='max-width:800px'>";
	
	if ($use_mail_header_image == 1){
	$message .= "
				<img src='$var_mail_header_image' width='100%'>
				";
	}
	
	$message .= "
				<p>$var_text</p>
			</div>
		</body>
	</html>
	";
	
	$mime_boundary = "--".md5(uniqid(time()));
	
	if($var_von_name == "")
	{
		$var_von_name = $var_default_from_name;
	}
	if($var_von_mail == "")
	{
		$var_von_mail = $var_default_from_mail;
	}
	
	$header = "From: $var_von_name <$var_von_mail>\r\n";
	$header .= "Reply-To: $var_von_mail\r\n";
	$header .= "MIME-Version: 1.0\r\n";
	$header .= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"; charset=utf-8\r\n";
    $header .= "Content-Transfer-Encoding: 8bit\r\n";
	$header .= "X-Mailer: ShellMailer_PHP @ PHP " . phpversion(). "\r\n";
    $header .= "This is a MIME encoded message.\r\n";

	$content = "--" . $mime_boundary . "\r\n";
    $content .= "Content-Type: text/html; charset=utf-8\r\n";
    $content .= "Content-Transfer-Encoding: 8bit\r\n";
    $content .= $message."\r\n";
   
    // Anhänge verarbeiten
    if($var_anhang_pfad != ""){
		foreach($attachments AS $dat) {
			$data = chunk_split(base64_encode($dat['data']));
            $content.= "--".$mime_boundary."\r\n";
            $content.= "Content-Disposition: attachment;\r\n";
            $content.= "\tfilename=\"".$dat['name']."\";\r\n";
            $content.= "Content-Length: .".$dat['size'].";\r\n";
            $content.= "Content-Type: ".$dat['type']."; name=\"".$dat['name']."\"\r\n";
            $content.= "Content-Transfer-Encoding: base64\r\n\r\n";
            $content.= $data."\r\n";
		}
    }   
	$content .= "--".$mime_boundary."--";
	// Mail versenden
	if(mail($var_an, $var_betreff, $content, $header))
	{
		if($use_logfile == 1)
		{
			// Logfile schreiben
			$var_log_infos = array("\n### E-MAIL -- START -- STATUS: OK ###\n", 
				"ID: $mime_boundary", 
				"Datum: ".date("d.m.Y H:i:s"), 
				"An: $var_an", 
				"Von: $var_von_mail", 
				"Betreff: $var_betreff", 
				"Text: $var_text\n", 
				"### E-MAIL -- ENDE ###");
			$var_log_entry = implode("\n", $var_log_infos);
			$var_logfile=fopen($var_logfile_path,"a");
			fputs($var_logfile,$var_log_entry."\n");
			fclose($var_logfile);
		}
			
		if($use_mailarchive == 1)
		{	
			// Mail als HTML-Version lokal ablegen
			$var_mail_infos = "<p><b>Von: </b>".$var_von_name." (".$var_von_mail.")</br>
				<b>An: </b>$var_an</br>
				<b>Datum: </b>".date("d.m.Y H:i:s")."</br></br>
				<b>Betreff: </b>$var_betreff</p><hr>";
			
			$var_mailfile = fopen($var_logfile_dir."/mails/".$mime_boundary.".html", "a");
			fputs($var_mailfile,"<font style='font-family: arial;'>".$var_mail_infos.$content."</font>");
			fclose($var_mailfile);
		}
	}
	else
	{
		if($use_logfile == 1)
		{
			// Logfile schreiben
			$error = error_get_last();
			$var_log_infos = array("\n### E-MAIL -- START -- STATUS: FAIL ###\n", 
				"ID: $mime_boundary", 
				"Datum: ".date("d.m.Y H:i:s"), 
				"An: $var_an", 
				"Von: $var_von_mail", 
				"Betreff: $var_betreff", 
				"Text: $var_text\n",
				"Fehler: ".$error["message"]."\n",
				"### E-MAIL -- ENDE ###");
			$var_log_entry = implode("\n", $var_log_infos);
			$var_logfile=fopen($var_logfile_path,"a");
			fputs($var_logfile,$var_log_entry."\n");
			fclose($var_logfile);
		}
	}
?>

Anzeige

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.