PHP5+ mail

DexXxtrin

Erfahrenes Mitglied
Hallo zusammen

Ich habe das Problem auf einer Seite, dass keine Mails mehr versendet werden über php (läuft bei hoststar). Nun weiss ich nicht, ob da evtl was geändert hat mit den neuen Versionen.
Der Rückgabewert von mail(...) ist 1, somit sollte also alles in Ordnung sein.
Sieht jemand einen Fehler?


Danke und Gruss
DexXxtrin

PHP:
$mail = "example@test.com";
$message = "<html><head><title>test</title></head><body>....</body></html>";
$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$header .= "From: $sender_name <$mail_from>\r\n";
                                   
mail($mail,'Betreff',$message,$header);

und noch mit Anhang:
PHP:
$mail = "example@test.com";
$message = "<html><head><title>test</title></head><body>....</body></html>";
           
//Mail senden mit .csv als Anhang
$uid = md5(uniqid(time()));
$file_size = filesize($pfad);
$handle = fopen($pfad, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
       
//Header
$header = 'From:'.$name.'<'.$mail.">\r\n";
      
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$header .= "This is a multi-part message in MIME format.\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-type:text/html; charset=utf-8\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$header .= $message."\r\n\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: text/csv; name=\"".$pfad."\"\r\n"; // use diff. tyoes here
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$pfad."\"\r\n\r\n";
$header .= $content."\r\n\r\n";
$header .= "--".$uid."--";
     
mail($mail,'Test mit anhang', $message,$header);
 
Anstatt den Zeilenumbruch und Umbruch (…\r\n usw) manuell einzugeben, könntest du auch "PHP_EOL" nutzen, den dieser Bereich ist auf Linux, Windows und Macs unterschiedlich, das PHP_EOL trägt dann schon das richtige ein:

Bei mir in der Sendmail-Klasse ist es zb. so:

PHP:
            if ($this->type == 'text') {
                $subject = \strip_tags (\html_entity_decode ($this->subject));
                $message = \strip_tags (\orwHtmlEntityDecode ($this->message));
                $header = "From: " . $sendername . " <" . $sender . ">" . \PHP_EOL;
                $header .= "Reply-To: " . $sendername . " <" . $sender . ">" . \PHP_EOL;
                $header .= "X-Mailer: PHP v" . \PHP_VERSION . \PHP_EOL;
                $header .= 'Content-type: text/plain; charset=' . \orwSYSTEM_CHARSET . \PHP_EOL;
            } else {
                $header = "From: " . $sendername . " (" . $sender . ")" . \PHP_EOL;
                $header .= "Reply-To: " . $sendername . " <" . $sender . ">" . \PHP_EOL;
                $header .= "X-Mailer: PHP v" . \PHP_VERSION . \PHP_EOL;
                $header .= "MIME-Version: 1.0" . \PHP_EOL;
                $header .= 'Content-type: text/html; charset=' . \orwSYSTEM_CHARSET . \PHP_EOL;
            }
 
Zuletzt bearbeitet:
Besten Dank für deinen Tipp!
Ich habe das nun so angepasst. Doch leider löst dies das Problem noch nicht.
Die Mails werden nicht versendet. An was kann das liegen?
 
Hast du mal den Rückgabewert für die mail Function überprüft?

So in der Art:
PHP:
if(mail($mail,'Betreff',$message,$header)=== TRUE) {
   echo "E-Mail wurde versendet!";
} else {
   echo "E-Mail wurde nicht versendet!";
}

Dabei ist nur beachtet:
http://php.net/manual/de/function.mail.php hat gesagt.:
Gibt TRUE zurück, wenn die E-Mail erfolgreich für den Versand akzeptiert wurde, sonst FALSE.

Dass eine E-Mail für den Versand akzeptiert wurde, bedeutet nicht, dass sie auch wirklich den gewünschten Empfänger erreichen wird.

Es kann auch sein, dass die E-Mail vom Empfänger Mail-Server nicht akzeptiert wurde.

PS: Schau dir mal die Klasse PHPMailer an. Das ist eine sehr gute Klasse für den Mailversand.
 
Zuletzt bearbeitet:
Es gibt (gab?) auch Hoster, die einen Zusatz benötigen, bei Host Europe zb. war es (damals?) so, das wenn keine default-Mail in der Server/Webspace-Konfig angegeben wurde, du den Zusatz "-f" benötigst, ich kann dir aber nicht sagen, ob es heute noch immer so ist. Im schlimmsten Fall hilft dir aber auch das weiter: http://php.net/manual/de/function.mail.php
 
Besten Dank für Eure Hilfe!
Wir haben mit dem Hoster kontakt aufgenommen. Nun funktioniert der Mailversand wieder.
Anscheinend wurde wohl etwas an der Config geändert, was nun wieder richtig eingestellt wurde.
 
bofh1337 hat gesagt.:
Anstatt den Zeilenumbruch und Umbruch (…\r\n usw) manuell einzugeben, könntest du auch "PHP_EOL" nutzen, den dieser Bereich ist auf Linux, Windows und Macs unterschiedlich, das PHP_EOL trägt dann schon das richtige ein

Die E-Mail-Formate/-Protokolle interessieren sich nicht für Betriebssysteme. PHP_EOL ist an der Stelle falsch. Ein E-Mail-Software-Stack mag aus Kulanz auch andere Zeilenumbrüche akzeptieren, aber nach den Spezifikationen ist meines Wissens nur \r\n (= CRLF) korrekt.

Header fields are lines beginning with a field name, followed by a
colon (":"), followed by a field body, and terminated by CRLF.

- https://tools.ietf.org/html/rfc5322#section-2.2

Auch wegen so was ist der Hinweis zur Nutzung einer Mailer-Klasse, die sich um die Details kümmert, extrem sinnvoll.
 
Laut http://php.net/manual/en/function.mail.php ist es richtig, was ich gepostet habe
Unter Windows (DOS) ist ein EOL "\n\r" unter Linux ein "\n". PHP_EOL macht nichts anderes, als das EOL einzusetzen.

Mein Code stammt aus meiner Mailklasse (mail/smtp/sasl) Mails mit Anhang habe ich weggelassen, dafür gehen Text und HTML-Mails richtig raus
 
Also ich les was Anderes.
Code:
message
    Message to be sent.

    Each line should be separated with a CRLF (\r\n).
    Lines should not be larger than 70 characters.

Die Kommentare von Usern sind manchmal eine sehr nützliche Ergänzung zur Doku, oft aber einfach nur falsch.
 

Neue Beiträge

Zurück