Danny: PHP Mail: Anhang mehrmal in der Mail

Hallo zusammen,

ich versende eine email in einer PHP-Schleife mit einem Dateianhang (PDF).
Diese email kommt auch beim den Empfängern an, aber der Dateianhang ist in jeder email (unregelmässig) verteilt.
Mal ist das PDF einmal angehangen, in manchen emails auch zweimal oder noch öfter. Manchmal ist die email auch noch als Anhang im Textformat in der Anlage...

Hier mal das wesentliche Script:

  
$dateiname = "Musteranhang.pdf";  
$pdf->Output($dateiname);  
  
$mail_from = 'Mustermann <Mustermann@Mustermann.com>';  
$mail_subject = "Mustermann";  
  
// Boundary (E-Mail-Abschnitte trennen)  
$semi_rand = md5(time());  
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";  
  
$mail_header = "From: Mustermann <Mustermann@Mustermann.com>\r\n";  
$mail_header .= "MIME-Version: 1.0" . "\r\n";  
$mail_header .= "Content-Type: multipart/mixed;\n";  
$mail_header .= " boundary=\"{$mime_boundary}\"";  
  
  
$file = fopen("$dateiname",'rb');  
$data = fread($file,filesize("$dateiname"));  
fclose($file);  
  
// Kodieren der Daten in MIME base64  
$data = chunk_split(base64_encode($data));  
  
  
//MESSAGE FÜR EMPFÄNGER  
//#######################################################  
$message .= "--{$mime_boundary}\n" .  
"Content-Type:text/plain\n" .  
"Content-Transfer-Encoding: 8bit\n\n";  
  
$message .= "\nHallo Herr Mustermann\n\n";  
$message .= "Text zum lesen.\n\n";  
  
$message .= "--{$mime_boundary}\n" .  
"Content-Type: application/pdf;\n" .  
" name=\"Musteranhang.pdf\"\n" .  
"Content-Transfer-Encoding: base64\n\n" .  
$data . "\n\n";  
  
  
  
//Mail  
mail($empfang, $mail_subject, $message, $mail_header);  
  
echo "Mail ist unterwegs<br>";  

  1. Hallo,

    ich versende eine email in einer PHP-Schleife mit einem Dateianhang (PDF).
    Diese email kommt auch beim den Empfängern an, aber der Dateianhang ist in jeder email (unregelmässig) verteilt.
    Mal ist das PDF einmal angehangen, in manchen emails auch zweimal oder noch öfter. Manchmal ist die email auch noch als Anhang im Textformat in der Anlage...

    diese Beschreibung kommt mir schon mal sehr verdächtig vor - irgendwas, das im einen Moment korrekt funktioniert und dann wieder nicht, ohne dass am Code was geändert wurde ...

    $dateiname = "Musteranhang.pdf";
    $pdf->Output($dateiname);

    Was macht diese Funktion?

    $mail_header = "From: Mustermann Mustermann@Mustermann.com\r\n";
    $mail_header .= "MIME-Version: 1.0" . "\r\n";
    $mail_header .= "Content-Type: multipart/mixed;\n";
    $mail_header .= " boundary="{$mime_boundary}"";

    Du solltest dich entscheiden: Entweder verwende \r\n, oder nur \n - aber bitte konsequent. Wenn das Script auf einem Windows-basierten Host läuft, solltest du *immer* \r\n nutzen, bei Unix-artigen Systemen ist häufig nur \n angesagt und das Hinzufügen eines \r führt zu falschen Ergebnissen.

    $file = fopen("$dateiname",'rb');
    $data = fread($file,filesize("$dateiname"));
    fclose($file);

    Wozu bettest du die Variable, die den Dateinamen enthält, nochmal in einen String ein? Das ist Unsinn, solange man sie nicht mit anderen Ausgaben kombiniert.

    //MESSAGE FÜR EMPFÄNGER
    //#######################################################
    $message .= "--{$mime_boundary}\n" .
    "Content-Type:text/plain\n" .
    "Content-Transfer-Encoding: 8bit\n\n";

    Aha, hier verwendest du wieder nur \n.

    Warum das Ergebnis von Ma(i)l zu Ma(i)l unterschiedlich ausfällt, ist anhand dieser Codeauszüge aber auch noch nicht erklärbar.

    So long,
     Martin

    --
    Moskito, ergo summ.
    1. Hallo,

      ich versende eine email in einer PHP-Schleife mit einem Dateianhang (PDF).
      Diese email kommt auch beim den Empfängern an, aber der Dateianhang ist in jeder email (unregelmässig) verteilt.
      Mal ist das PDF einmal angehangen, in manchen emails auch zweimal oder noch öfter. Manchmal ist die email auch noch als Anhang im Textformat in der Anlage...

      diese Beschreibung kommt mir schon mal sehr verdächtig vor - irgendwas, das im einen Moment korrekt funktioniert und dann wieder nicht, ohne dass am Code was geändert wurde ...

      So sieht es leider aus.

      $dateiname = "Musteranhang.pdf";
      $pdf->Output($dateiname);

      Was macht diese Funktion?

      Im Script wird vorher ein PDF generiert. Dieses wird hier gespeichert und liegt auf dem Server.

      $mail_header = "From: Mustermann Mustermann@Mustermann.com\r\n";
      $mail_header .= "MIME-Version: 1.0" . "\r\n";
      $mail_header .= "Content-Type: multipart/mixed;\n";
      $mail_header .= " boundary="{$mime_boundary}"";

      Du solltest dich entscheiden: Entweder verwende \r\n, oder nur \n - aber bitte konsequent. Wenn das Script auf einem Windows-basierten Host läuft, solltest du *immer* \r\n nutzen, bei Unix-artigen Systemen ist häufig nur \n angesagt und das Hinzufügen eines \r führt zu falschen Ergebnissen.

      $file = fopen("$dateiname",'rb');
      $data = fread($file,filesize("$dateiname"));
      fclose($file);

      Wozu bettest du die Variable, die den Dateinamen enthält, nochmal in einen String ein? Das ist Unsinn, solange man sie nicht mit anderen Ausgaben kombiniert.

      //MESSAGE FÜR EMPFÄNGER
      //#######################################################
      $message .= "--{$mime_boundary}\n" .
      "Content-Type:text/plain\n" .
      "Content-Transfer-Encoding: 8bit\n\n";

      Aha, hier verwendest du wieder nur \n.

      Warum das Ergebnis von Ma(i)l zu Ma(i)l unterschiedlich ausfällt, ist anhand dieser Codeauszüge aber auch noch nicht erklärbar.

      Die \r habe ich entfernt. Leider besteht der Fehler noch immer...

      So long,
      Martin

  2. Moin!

    ich versende eine email in einer PHP-Schleife mit einem Dateianhang (PDF).

    Leider zeigst du die Schleife nicht.

    //MESSAGE FÜR EMPFÄNGER
    //#######################################################
    $message .= "--{$mime_boundary}\n" .
    "Content-Type:text/plain\n" .
    "Content-Transfer-Encoding: 8bit\n\n";

    Nirgendwo vorher wird $message mal vernünftig initialisiert. D.h. wenn dein Code diese Message in einer Schleife zusammenbaut, wird die Message bei jedem Schleifendurchgang immer länger. Zwar wird jeweils ein neuer Mime-Trenner generiert, aber vermutlich reagieren manche Mailclients darauf fehlerkorrigierend (zeigen lieber die Extra-Attachments an), während andere sich standardkonformer verhalten (ignorieren den restlichen Text, der nicht zum ersten Mime-Part passt).

    - Sven Rautenberg

    1. Moin!

      ich versende eine email in einer PHP-Schleife mit einem Dateianhang (PDF).

      Leider zeigst du die Schleife nicht.

      //MESSAGE FÜR EMPFÄNGER
      //#######################################################
      $message .= "--{$mime_boundary}\n" .
      "Content-Type:text/plain\n" .
      "Content-Transfer-Encoding: 8bit\n\n";

      Nirgendwo vorher wird $message mal vernünftig initialisiert. D.h. wenn dein Code diese Message in einer Schleife zusammenbaut, wird die Message bei jedem Schleifendurchgang immer länger. Zwar wird jeweils ein neuer Mime-Trenner generiert, aber vermutlich reagieren manche Mailclients darauf fehlerkorrigierend (zeigen lieber die Extra-Attachments an), während andere sich standardkonformer verhalten (ignorieren den restlichen Text, der nicht zum ersten Mime-Part passt).

      • Sven Rautenberg

      Hallo Sven,
      die Schleife ist eine Datenbanausgabe. Die $message besteht aus einzelenen Variablen dieser Ausgabe.
      Ich habe das Script jetzt mal auf einen anderen Server getestet-mit Erfolg => dort funktioniert es! Leider muss es auf meinem anderen Server laufen...

      1. Fehlalarm-auch auf dem anderen Server klappt es nicht!

        1. Hi!

          Fehlalarm-auch auf dem anderen Server klappt es nicht!

          Sven hat Dir schon die Arbeit fast in Gänze abgenommen - magst Du nun bitte auch etwas mitarbeiten und den ganzen relevanten Code posten, damit Svens Vermutung[*] entweder bestätigt werden kann, oder ein anderer Ggrund gefunden werden kann?

          Hast Du Svens Tipp beachtet, dass [code=php]$message[/code] nicht mit einem vernünftigen Wert initialisiert wird?

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          1. Hi!

            Fehlalarm-auch auf dem anderen Server klappt es nicht!

            Sven hat Dir schon die Arbeit fast in Gänze abgenommen - magst Du nun bitte auch etwas mitarbeiten und den ganzen relevanten Code posten, damit Svens Vermutung[*] entweder bestätigt werden kann, oder ein anderer Ggrund gefunden werden kann?

            on:PP
            Sorry-sitze aber nicht immer vor meinem Rechner weil ich zwischenzeitlich arbeiten muss.

            Hast Du Svens Tipp beachtet, dass $message nicht mit einem vernünftigen Wert initialisiert wird?

            Nein, diesen Tipp habe ich nicht beachtet weil nicht verstanden.
            Habe das ganze jetzt neu auf einem weiteren Server installiert und dort funktioniert es fehlerfrei.
            Liegt wohl an Servereinstellungen-welchen auch immer.

            off:PP

            1. Hi,

              Hast Du Svens Tipp beachtet, dass $message nicht mit einem vernünftigen Wert initialisiert wird?
              Nein, diesen Tipp habe ich nicht beachtet weil nicht verstanden.

              Und dann hältst du ignorieren für das beste - anstatt vielleicht mal nachzufragen ...?

              Habe das ganze jetzt neu auf einem weiteren Server installiert und dort funktioniert es fehlerfrei.

              Wir warten dann mal.

              MfG ChrisB

              --
              Light travels faster than sound - that's why most people appear bright until you hear them speak.
            2. Hi!

              Fehlalarm-auch auf dem anderen Server klappt es nicht!

              Sven hat Dir schon die Arbeit fast in Gänze abgenommen - magst Du nun bitte auch etwas mitarbeiten und den ganzen relevanten Code posten, damit Svens Vermutung[*] entweder bestätigt werden kann, oder ein anderer Ggrund gefunden werden kann?

              Wenn Du sinnvoll zitierst, brauchst Du oft ein '@person' nicht;)

              Sorry-sitze aber nicht immer vor meinem Rechner weil ich zwischenzeitlich arbeiten muss.

              Du denkst, wir sitzen hier 24/7 vorm Schirm, oder was?
              Auch wir arbeiten alle - ich meistens nicht am Rechner.

              Hast Du Svens Tipp beachtet, dass $message nicht mit einem vernünftigen Wert initialisiert wird?
              Nein, diesen Tipp habe ich nicht beachtet weil nicht verstanden.

              Och Männo: dann frag doch nach!
              Dies ist wirklich die große Stärke dieses Forums: wenn Du nachfragst und sagst, du hast etwas nicht verstanden, obwohl du darüber nachgedacht hast, dann hilft man Dir hier. Das sind oft ganz verschiedene Leute - weil wir eben auch nicht alle zur gleichen Zeit hier ins Forum schauen - aber Dir wird geholfen, *wenn* Du das willst und _SELF mitmachst_.

              Habe das ganze jetzt neu auf einem weiteren Server installiert und dort funktioniert es fehlerfrei.

              Liegt wohl an Servereinstellungen-welchen auch immer.

              Genau so weit, warst Du in diesem Thread schon ein mal - ich wette Du liegst wieder daneben, ich denke Sven liegt mit seinen Tipps genau richtig - das ist nämlich:

              1. das Nächstliegende
              2. hat er meistens (fachlich) recht

              Außerdem willst Du doch verstehen und nicht nur testen, oder? Das sinnfreie Testen und auf Wunder hoffen dauert länger - trust me!

              off:PP

              --
              "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Moin!

        Hallo Sven,
        die Schleife ist eine Datenbanausgabe. Die $message besteht aus einzelenen Variablen dieser Ausgabe.

        Leider zeigst du die Schleife nicht. Die ist aber essentiell, um dein Problem zu analysieren.

        Und selbst wenn ich einfach mal annehme, dass diese Schleife einfach für jeden Datenbankeintrag deinen gezeigten Code ausführt, dann lande ich genau bei meiner Annahme: $message wird nicht explizit für jede Mail bei Null begonnen (also als leerer String), sondern es wird immer nur (von einem unbekannten Startzustand, der vielleicht vor Beginn der Schleife definiert wird - oder auch nicht) drangehängt.

        - Sven Rautenberg