Linuchs: `mail` funktioniert nicht immer

Moin,

ich versende automatische Mails, aber mit den Daten mancher Mitglieder wird FALSE zurückgegeben und ich kann nicht erkennen, was an diesen Daten falsch sein soll.

function mail_an_empfaenger( $subject, $arr, $mail_e ) {

echo htmlspecialchars( $mail_e )."<br>";
  $mail_header = "MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Kalender remso <osmer.kh@osmer.de>
Return-Path: <osmer.kh@osmer.de>
";
  $mail_subject = "|| " . $subject;

  $mail_body  = '';
  foreach( $arr as $zeile ) {
    $mail_body   .=  $zeile."\n";
  }

  mb_language ( 'uni' );  // UTF-8
//$result = mb_send_mail( $mail_e, $mail_subject, $mail_body, $mail_header );  // TRUE oder FALSE
  $result = mail( addslashes($mail_e), $mail_subject, $mail_body, $mail_header );  // TRUE oder FALSE

echo "<pre>";
echo "header=[".htmlspecialchars($mail_header)."]\nsubject=[".htmlspecialchars($mail_subject)."]\nmail_e=[".htmlspecialchars($mail_e)."]\nresult=[". (($result) ? "TRUE" : "FALSE" )."]\n";
//var_dump($arr);
echo "</pre>";

  return $result;
}

angezeigt wird:

"Akkordeonclub BLau-Weiß Bensheim e. V. VIP=1219" <XXX@YYY.de>, osmer.kh@osmer.de

header=[MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Kalender remso <osmer.kh@osmer.de>
Return-Path: <osmer.kh@osmer.de>
]
subject=[|| remso - euer Mitgliedskalender ist leer - Akkordeonclub BLau-Weiß Bensheim e. V.]
mail_e=["Akkordeonclub BLau-Weiß Bensheim e. V. VIP=1219" <XXX@YYY.de>, osmer.kh@osmer.de]
result=[FALSE]

Kann man mail befragen, warum nicht gesendet wird?

Gruß, Linuchs

  1. Tach!

    Kann man mail befragen, warum nicht gesendet wird?

    Wenn in den üblichen PHP-Fehlermeldungstext-Quellen (error_reorting, error_log, $php_errormsg) nichts zu finden ist, dann kannst du nur dem Sever in die Logs schauen. mail() hat jedenfalls kein Pendant zu DBMS-APIs, wo man sich den Wortlaut extra über eine Funktion/Eigenschaft besorgen muss.

    dedlfix.

  2. Hallo,

    "Akkordeonclub BLau-Weiß Bensheim e. V. VIP=1219" <XXX@YYY.de>, osmer.kh@osmer.de
    
    header=[MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    From: Kalender remso <osmer.kh@osmer.de>
    Return-Path: <osmer.kh@osmer.de>
    ]
    subject=[|| remso - euer Mitgliedskalender ist leer - Akkordeonclub BLau-Weiß Bensheim e. V.]
    mail_e=["Akkordeonclub BLau-Weiß Bensheim e. V. VIP=1219" <XXX@YYY.de>, osmer.kh@osmer.de]
    result=[FALSE]
    

    Kann man mail befragen, warum nicht gesendet wird?

    ist mir nicht bekannt. Aber du hast sowohl im Betreff als auch im mail_e, was vermutlich der Empfänger (also eigentlich To:) sein soll, Zeichen außerhalb des ASCII-Bereichs. Die sind in Mail-Headern nicht erlaubt; in dem Fall muss der Wert des Headers entweder base64 oder Quoted-Printable codiert werden (und noch irgendein Präfix kriegen). Schau mal die imap_-Funktionen von PHP durch, IIRC gibt es da eine, die diese Codierung für dich erledigen kann.

    Ergänzung: Meine Erinnerung lag falsch. Es ist keine der imap-Funktionen, sondern mb_encode_mimeheader().

    Schönes Wochenende,
     Martin

    --
    Ein Tag, an dem du nicht wenigstens einmal gelacht hast, ist ein verlorener Tag.
  3. Hallo

    Kann man mail befragen, warum nicht gesendet wird?

    Nein, schon alleine deswegen, weil mit mail keine E-Mails versendet werden. Sie werden nur an den in der php.ini hinterlegten Mechanismus für das Versenden von E-Mails übergeben. Der nämliche Mechanismus versendet die E-Mails tatsächlich, womit mail aber nichts mehr zu tun hat.

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
  4. Moin,

    danke an den Tipp von Der Martin. ERst jetzt sehe ich den Link für die Codierung, werde ich heute testen ...


    der Grund sind Nicht-ASCII Zeichen, in meinem Fall Umlaute und das ß.

    Mail funktioniert, wenn ich sie ersetze:

      $arr_search   = array( "Ä",   "ä",  "Ö",  "ö",  "Ü",  "ü",  "ß"  );
      $arr_replace  = array( "AE",  "ae", "OE", "oe", "UE", "ue", "ss" );
    
    //$mail_to      = '=?UTF-8?B?'.base64_encode($mail_e).'?=';
    //$mail_to      = '=?UTF-8?q?' . quoted_printable_encode($mail_e) . '?=';
      $mail_to      = str_replace( $arr_search, $arr_replace, $mail_e);
    
    //$mail_subject = "=?UTF-8?B?".base64_encode("|| ".$subject).'?=';
    //$mail_subject = '=?UTF-8?q?' . quoted_printable_encode($subject) . '?='; // stackoverflow.com
      $mail_subject = "|| ".str_replace( $arr_search, $arr_replace, $subject);
    

    Aber eigentlich sollten Umlaute zulässig sein, Die auskommentierten Zeilen führen ebenso zu FALSE beim Kommando mail

    Wie werden Umlaute richtig verschlüsselt? Demnächst kommen womöglich skandinavische Spezialzeichen.

    1. Wie werden Umlaute richtig verschlüsselt?

      Gar nicht. Der String wird codiert:

      (Eigentlich hattest Du die Antwort schon!)

      <?php
      $subject = '|| remso - euer Mitgliedskalender ist leer - Akkordeonclub BLau-Weiß Bensheim e. V.';
      echo 'Original:' . PHP_EOL;
      echo $subject . PHP_EOL . PHP_EOL;
      
      
      mb_language( 'uni' );
      $subject_encoded = mb_encode_mimeheader( $subject );
      echo 'Codiert:' . PHP_EOL;
      echo $subject_encoded . PHP_EOL . PHP_EOL;
      echo mb_decode_mimeheader( $subject_encoded ). PHP_EOL;
      
      Original:
      || remso - euer Mitgliedskalender ist leer - Akkordeonclub BLau-Weiß Bensheim e. V.
      
      Codiert:
      || remso - euer Mitgliedskalender ist leer - Akkordeonclub
       =?UTF-8?B?QkxhdS1XZWnDnyBCZW5zaGVpbSBlLiBWLg==?=
      
      || remso - euer Mitgliedskalender ist leer - Akkordeonclub BLau-Weiß Bensheim e. V.
      
      1. Der String wird codiert:

        Habe ich ein Verständnis-Problem?

        mb_encode_mimeheader — Encode string for MIME header

          $mail_header = "MIME-Version: 1.0
        Content-Type: text/plain; charset=UTF-8
        Content-Transfer-Encoding: 8bit
        From: Kalender remso <osmer.kh@osmer.de>
        Return-Path: <osmer.kh@osmer.de>
        ";
        

        Was sollte da codiert werden?

        Mein Problem liegt bei mail_to und mail_subject

        1. Hallo Linuchs,

          Was sollte da codiert werden?

          Der To-Header und der Subject-Header.

          Mein Problem liegt bei mail_to und mail_subject

          … was Header sind 😉

          LG,
          CK

          1. Hallo,

            Was sollte da codiert werden?

            Der To-Header und der Subject-Header.

            ja, und zwar nur die Werte der einzelnen Header, nicht der fertig zusammengebaute String mit mehreren Headern.

            Mein Problem liegt bei mail_to und mail_subject

            … was Header sind 😉

            *g*

            Ciao,
             Martin

            --
            Ein Tag, an dem du nicht wenigstens einmal gelacht hast, ist ein verlorener Tag.
        2. Tach!

          Der String wird codiert:

          Habe ich ein Verständnis-Problem?

          Im Prinzip ist eine Verschlüsslung eine Kodierung. Der Unterschied ist, dass als Kodierung üblicherweise das bezeichnet wird, bei dem der Algorithmus bekannt ist und kein individueller Schlüssel verwendet wird, den der Empfänger zum Dekodieren benötigt.

          Ein String besteht erstmal abstrakt gesehen nur aus Zeichen. Die physikalische Repräsentation benötigt eine bestimmte Kodierung, die angibt, welche Bytes und Bitmuster für welches Zeichen stehen.

          Aber eigentlich sollten Umlaute zulässig sein,

          Ja, man muss sie nur richtig kodieren. Dafür ist als erstes eine Zeichenkodierung zuständig, zum Beispiel UTF-8. Bei Mail kommt noch hinzu, dass da nur 7-Bit in den Headerzeilen erlaubt sind, und die 8 Bit verwendenden Kodierungen in eine 7-Bit-Form umkodiert werden müssen. Dafür gibts die beiden Verfahren Base64 und Quoted Printable. Eins davon musst du wählen. Quoted Printable ist lesbarer, weil nur die 8-Bit-Zeichen umkodiert werden, bei Base64 wird der gesamte String umkodiert.

          dedlfix.

        3. Was sollte da codiert werden?

          Der Value. Oder jeder Teil des Values welcher Zeichen außerhalb Ascii enthalten könnte. Wenn der Key (z.B. 'From') Zeichen außerhalb Ascii enthält ist das grundsätzlich daneben.

          <?php
          $mail_header = [
          'From: ' . mb_encode_mimeheader( 'G. Gößebrecht') . ' <goeszebrecht@example.com>',
          'Return-Path: ' . mb_encode_mimeheader( 'G. Gößebrecht <goeszebrecht@example.com>')
          ];
          
          $mail_header = implode( "\r\n", $mail_header );
          
          print_r($mail_header);
          
          From: G. =?UTF-8?B?R8O2w59lYnJlY2h0?= <goeszebrecht@example.com>
          Return-Path: G. =?UTF-8?B?R8O2w59lYnJlY2h0IDxnb2VzemVicmVjaHRAZXhhbXBsZS5jb20+?=
          
        4. Habe ich ein Verständnis-Problem?

          CK hat damit recht, dass to und subject ebenfalls in die Mailheader eingebaut werden.

          Deinem Verständnis-Problem kannst Du weitgehend abhelfen indem Du Dir auch mal den Quelltext ankommender Mails interessiert ansiehst.