E-Mail versenden mit PHP (nur auf Linux)
Autor: Ralf v.d.Mark, Ingmar Pforr
eingetragen: Freitag, 17. Dezember 2010 um 14:27 Uhr (50/2010 Kalenderwoche)
geändert: Mittwoch, 29. März 2023 um 14:14 Uhr (13/2023 Kalenderwoche)
Keywords: email mailen postfix sendmail fparameter MessageID bereinigeMailHeader
Kategorien: PHP,
Text:
E-Mails mit PHP senden (ist auf Windows eingeschränkt).
Man kann den kompletten Quellcode als Datei "sendEmail.php" speichern und sofort benutzen.
Zu dem 5. Paramter in PHP mail(), dem f-Paramter (kleines f!) ist
folgendes zu lesen:
https://www.postfix.org/sendmail.1.html
-f /sender/
Set the envelope sender address. This is the
address where delivery problems are sent to. With
Postfix versions before 2.1, theErrors-To: message
header overrides the error return address.
Bei "Return-Path" sollte der gleiche Wert wie bei f-Parameter eingetragen sein.
Quellcode:
<?php declare(strict_types=1);
/**
* Diese Datei versendet E-Mails beim Aufruf
*
* PHP version 8
*
* @name Datei: _emailSenden_einfach.php
* @author Ralf von der Mark <ralf@website-vdm.de>, www.WebSite-vdM.de
* @copyright 2023, Ralf von der Mark
* @version 29.03.2023, GIT: No
*/
$date_time = date('d.m.Y') . ' um ' . date('H:i') . ' Uhr';// Datum mit Uhr
//$email_betreff = '...; // Betreff der E-Mail
//$email_nachricht = '...';// Nachricht in der E-Mail
if (empty($email_betreff)) {
$email_betreff = 'Automatische Mail vom ' . $date_time; // Betreff der E-Mail falls leer
}
if (empty($email_nachricht)) {
$email_nachricht = 'Kein Nachrichtentext angegeben!'; // Nachricht der E-Mail falls leer
}
$arrayEmailEmpfaengerStandard = [
//An mich wird immer eine E-Mail geschickt!
'Ralf.vonderMark@ble.de' => 'Ralf in der BLE',
'Ralf@Vondy.de' => 'Vondy'
];
if (!empty($arrayEmailEmpfaengr)
&& is_array($arrayEmailEmpfaengr)
&& count($arrayEmailEmpfaengr) > 0) {
$arrayEmailEmpfaengr = array_merge($arrayEmailEmpfaengerStandard, $arrayEmailEmpfaengr);
} else {
$arrayEmailEmpfaengr = $arrayEmailEmpfaengerStandard;
}//ENDE: else ==> if()
$emailFParameter = 'noreply@vondy.de';
if (empty($sendhtmlemail)) {
// wenn nichts angegeben, wird eine E-Mail im Text-Format gesendet.
$sendhtmlemail = 'txt'; // Content-Type ==> 'html' oder 'txt' moeglich,
}//ENDE: if (empty($sendhtmlemail))
//To kommt aus Array, daher wird nicht mehr benutzt!
//$email_to = 'info@techdox.website-vdm.de'; // Empfaenger jetzt per Array
$email_from_name = 'Ralf v. d. Mark (Webmaster)'; // Absender-Name
$email_from_mail = 'webmaster@website-vdm.de'; // Absender-E-Mail
$email_to_cc = ''; // CC
$email_to_bcc = 'webmaster@website-vdm.de';// BCC
$email_nachr_ende_txt = '
========================================================
Diese E-Mail wurde am ' . $date_time . ' Uhr versendet.
(c) 2000-' . date('Y') . ', Ralf v. d. Mark (http://www.WebSite-vdM.de)';
// Hinweis-Nachrichten-Text wird immer unten angehangen.
$email_nachr_ende_html = '
<hr />
<smal style="color:#990000;">
Diese E-Mail wurde am ' . $date_time . ' versendet.
<br />
© 2000-' . date('Y') . ', Ralf v. d. Mark '
. '(<a href="http://www.WebSite-vdM.de">http://www.WebSite-vdM.de</a>)
</smal>
</body>
</html>';
// Hinweis-Nachrichten-Text wird immer unten angehangen.
/** Der REMOTE_HOST ist selten bis gar nich gesetzt,
* da dies Performance benoetigt, kann man den Host
* aber wie folgt ermitteln: */
if (empty($REMOTE_ADDR)) {
$wert_remote_addr = $_SERVER['REMOTE_ADDR'];
} else {
$wert_remote_addr = $REMOTE_ADDR;
}
$remotehost = gethostbyaddr($wert_remote_addr);
$headers = [
'From' => $email_from_name . ' <' . $email_from_mail . '>',
'Reply-To' => $email_from_name . ' <' . $email_from_mail . '> ',
'Return-Path' => $email_from_name . ' <' . $email_from_mail . '> ',
//'Return-Path' => $emailFParameter,
'Cc' => (!empty($email_to_cc) ? $email_to_cc : ''),
'Bcc' => (!empty($email_to_bcc) ? $email_to_bcc : ''),
'Message-ID' => '<TechDox' . generiereMailMessageID4ralf($emailFParameter) . '>',
'X-Mailer' => 'PHP/' . phpversion(),
'X-Sender-IP' => $remotehost,
'Content-Type' => (!empty($sendhtmlemail) && $sendhtmlemail === 'html' ?
'text/html' : 'text/plain') . '; charset=utf-8',
'Content-Transfer-Encoding' => '8bit '
];
//echo '<pre><h1>Debug-Ausgabe</h1>'.print_r($headers, true).'</pre>';exit('<br>STOPP!');
foreach ($arrayEmailEmpfaengr as $emailAdresse => $empfaengrName) {
$emailToAdress = $empfaengrName . ' <' . $emailAdresse . '>';
//wenn die Variable '$sendhtmlemail = html' vorhanden, sende HTML-Mail
if (!empty($sendhtmlemail) && $sendhtmlemail === 'html') {
$email_nachricht_fertig = str_replace(['</body>', '</html>'], '', $email_nachricht);
$email_nachricht_fertig = $email_nachricht_fertig . $email_nachr_ende_html;
}//ENDE: if(!empty($sendhtmlemail) && $sendhtmlemail == 'html')
//wenn die Variable '$sendhtmlemail' nicht kommt, sende Text-Mail
else {
$email_nachricht_fertig = $email_nachricht . $email_nachr_ende_txt;
$email_nachricht_fertig = wordwrap($email_nachricht_fertig, 70);// Falls eine Zeile der
// Nachricht mehr als 70 Zeichen enthoelten koennte, sollte wordwrap() benutzt werden!
}//ENDE: else ==> if(!empty($sendhtmlemail) && $sendhtmlemail == 'html')
mail($emailToAdress,
bereinigeEMailHeader($email_betreff),
$email_nachricht_fertig,
$headers,
'-f' . $emailFParameter);
}//ENDE: foreach ($arrayEmailEmpfaengr as $emailAdresse => $empfaengrName)
/**
* Erstellt eine eindeutige Message-ID fuer jede E-Mail!
*
* @param string $eMailFParameter (Absender oder F-E-Mail)
*
* @return string (fertige E-Mail-Message-ID)
*/
function generiereMailMessageID4ralf($eMailFParameter = 'noreply@ble.de')
{
if (empty($REMOTE_ADDR)) {
$wert_remote_addr = $_SERVER['REMOTE_ADDR'];
} else {
$wert_remote_addr = $REMOTE_ADDR;
}
return md5(uniqid(microtime(), true)) . 'vdM'
. (!empty($eMailFParameter) ?
$eMailFParameter : '@' . $wert_remote_addr);
}//ENDE function generiereMailMessageID4rms(...)
/** Ersetzt Zeichen die z. B. im Mailheader (Betreff, Empfaenger)
* zu problemen fuehren koennten.
*
* @param string $zumReinigen
*/
function bereinigeEMailHeader($zumReinigen)
{
$normaleChars = [
'ä' => 'ae', 'Ä' => 'Ae',
'ü' => 'ue', 'Ü' => 'Ue',
'ö' => 'oe', 'Ö' => 'Oe', 'ß' => 'ss',
'Š' => 'S', 'š' => 's', 'Ð' => 'Dj', 'Ž' => 'Z', 'ž' => 'z',
'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'Ae',
'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O',
'Õ' => 'O', 'Ö' => 'Oe', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U',
'Û' => 'U', 'Ü' => 'Ue', 'ü' => 'ue', 'Ý' => 'Y', 'Þ' => 'B',
'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',
'ä' => 'ae', 'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e',
'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i',
'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o',
'ô' => 'o', 'õ' => 'o', 'ö' => 'oe', 'ø' => 'o', 'ù' => 'u',
'î' => 'i', 'ú' => 'u', 'û' => 'u', 'ý' => 'y',
'þ' => 'b', 'ÿ' => 'y', 'ƒ' => 'f', '€' => 'EURO'
];
$rueckgabe = strtr($zumReinigen, $normaleChars);
//$rueckgabe = utf8_encode($rueckgabe);//manchmal muss man Dinge 2x machen
return strtr($rueckgabe, $normaleChars);
}//ENDE function bereinigeEMailHeader()