E-Mail versenden mit PHP (nur auf Linux)

edit | delete

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 />
&copy; 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 = [
        '&auml;' => 'ae', '&Auml;' => 'Ae',
        '&uuml;' => 'ue', '&Uuml;' => 'Ue',
        '&ouml;' => 'oe', '&Ouml;' => 'Oe', '&szlig;' => '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()