Jnnbo: Swift Mailer

Hallo,

ich verschicke meine Mails mit "Swift Mailer" klappt sehr gut, allerdings möchte ich jetzt ein PDF mitschicken, auch dieses klappt, das Bild, welches darin eingebettet ist, wird leider in der PDF die ich in der Mail als Anhang mitschicke nicht angezeigt.

An was könnte das liegen?

Wenn ich die Mail anschaue, die ich auf dem Server speichere (eine Kopie) ist diese komischerweise vollständig.

In der Datei, in der mein PDF zusammen gestellt wird, binde ich das Logo so ein

<div style="margin-bottom:22px;"><img src="http://example.org/grafiken/logo.jpg"></div>

Mein PDF speichere ich wie folgt:

$content = ob_get_clean();

$pdf = new HTML2PDF('p','A4','de','UTF-8');
$pdf->writeHTML($content);

$pdf->Output('angebote/Angebot-'.$timestamp.'.pdf','F');
$content_PDF = $pdf->Output('', true);  

Ich nutze dazu html2pdf

Verschickt wird die Mail so

[.....]

$save = 'Angebot-'.$timestamp.'.pdf';		
		
$smtp = new Swift_SmtpTransport($data['smtp']['host'], $data['smtp']['port']);
		$smtp->setUsername($data['smtp']['username']);
		$smtp->setPassword($data['smtp']['password']);
			
		$mail = new Swift_Message($data['subject']);
		$mail->setBody($data['html'])
			->attach(Swift_Attachment::fromPath('http://example.org/angebote/'.$save))
			->setCharset($data['charset'])
			->setContentType("text/html")
			->setFrom($data['from']['email'], $data['from']['name'])
			->setTo($data['to']['email'], $data['to']['name']);      
			
		$swift = new Swift_Mailer($smtp);
		$swift->send($mail,$recipient);

Komischerweise bekomme ich auch diese Meldung angezeigt, wenn ich die PDF die sich im Anhang befindet öffne:

Alternativ-Text

Am Speicher kann es kaum liegen, hab 4 GB RAM und 320 GB freien Festplattenplatz die PDF ist 38kb groß.

akzeptierte Antworten

  1. Moin!

    <div style="margin-bottom:22px;"><img src="http://example.org/grafiken/logo.jpg"></div>
    

    Hast Du wirklich eine absolute URL oder ETWA eine relative?

    Jörg Reinholz

    1. Hallo Jörg,

      <div style="margin-bottom:22px;"><img src="http://example.org/grafiken/logo.jpg"></div>
      

      Hast Du wirklich eine absolute URL oder ETWA eine relative?

      Ich hab es genau so in meinem Script stehen. "example.org" tausche ich natürlich mit meiner richtigen URL aus.

  2. Hallo,

      	->setContentType("text/html")
    

    Wieso behauptest du es sei HTML, wenn du eigentlich PDF meinst?

    Gruß
    Kalk

    1. Hallo Tabellenkalk,

      ->setContentType("text/html") Wieso behauptest du es sei HTML, wenn du eigentlich PDF meinst?

      weil die Mail an sich eine HTML Mail ist, die PDF wird als Anhang mitgeschickt. Ich habe die Anleitung von der offiziellen Seite

      1. Hallo,

        Ich habe die Anleitung von der offiziellen Seite

        auf der ich folgendes finde:

        ->setContentType('application/pdf')

        liest du auch die Seiten, die du verlinkst?

        Gruß
        Kalk

        1. Hallo Tabellenkalk,

          liest du auch die Seiten, die du verlinkst?

          ich sehe direkt oben im ersten Abschnitt folgendes:

           // And optionally an alternative body
            ->addPart('<q>Here is the message itself</q>', 'text/html')
          
            // Optionally add any attachments
            ->attach(Swift_Attachment::fromPath('my-document.pdf'))
            ;
          

          ich nutze ja diese PDF die auf dem Server liegt als Anhang.

          1. Hallo,

            ich sehe direkt oben im ersten Abschnitt folgendes:

            Den mit dieser Überschrift:

            Quick Reference for Creating a Message

            Was meinst du wofür "Quick" steht, und warum die Seite nicht nur aus dem ersten Abschnitt besteht?

            Gruß
            Kalk

            1. Hallo Tabellenkalk,

              Was meinst du wofür "Quick" steht, und warum die Seite nicht nur aus dem ersten Abschnitt besteht?

              lese doch bitte was auf der Seite etwas weiter unten steht, das mit dem PDF was du angesprochen hast ist nur dann wichtig, wenn die PDF per Laufzeit direkt beim Versand erzeugt wird, was bei mir NICHT der Fall ist, da ich meine PDF mit html2pdf erzeuge. Ich hänge lediglich eine PDF als Anhang an eine HTML Mail dran.

              1. Hallo,

                lese doch bitte

                wenn, dann "lies doch bitte". Aber nö, ich arbeite nicht mit Swiftmailer und ich habe daher auch keinen Bedarf, mich da tiefer einzuarbeiten. Ich wollte nur mitteilen, dass ich da eine Diskrepanz sehe. Aber wenn du meinst, das hat nichts mit deinem Problem zutun, bitte, ich bin raus.

                Gruß
                Kalk

  3. Hi,

    ich verschicke meine Mails mit "Swift Mailer" klappt sehr gut, allerdings möchte ich jetzt ein PDF mitschicken, auch dieses klappt, das Bild, welches darin eingebettet ist, wird leider in der PDF die ich in der Mail als Anhang mitschicke nicht angezeigt.

    das erste, was mir einfällt: Lässt sich denn das PDF-Dokument "normal" anzeigen, also unabhängig vom Mail-Versand? Falls nicht, brauchen wir die Ursache gar nicht erst bei der Aufbereitung als e-Mail zu suchen, sondern einzig und allein beim Erzeugen des PDF-Dokuments.

    Wenn ich die Mail anschaue, die ich auf dem Server speichere (eine Kopie) ist diese komischerweise vollständig.

    Wieso "komischerweise"? Das sollte doch wohl so sein.

    In der Datei, in der mein PDF zusammen gestellt wird, binde ich das Logo so ein

    <div style="margin-bottom:22px;"><img src="http://example.org/grafiken/logo.jpg"></div>
    

    Nur mal so aus HTML-Gesichtspunkten gefragt: Wozu steckst du das Bild noch in einen div-Container?

    Mein PDF speichere ich wie folgt:

    $content = ob_get_clean();
    
    $pdf = new HTML2PDF('p','A4','de','UTF-8');
    $pdf->writeHTML($content);
    
    $pdf->Output('angebote/Angebot-'.$timestamp.'.pdf','F');
    $content_PDF = $pdf->Output('', true);  
    

    Ich nutze dazu html2pdf

    Ich kenne mich mit html2pdf nicht aus, aber ... siehe oben. Erst mal klären, in welchem Teil der Verarbeitung das Problem entsteht.

    Komischerweise bekomme ich auch diese Meldung angezeigt, wenn ich die PDF die sich im Anhang befindet öffne:

    Alternativ-Text

    Siehe oben. Versuche, das Problem zu isolieren.

    Am Speicher kann es kaum liegen, hab 4 GB RAM und 320 GB freien Festplattenplatz die PDF ist 38kb groß.

    Aber vielleicht zeigt irgendeine PDF-interne Struktur aufgrund eines Fehlers einen irrsinnig großen Datenblock an. Oder der Content-Length-Header in der Mailnachricht enthält einen unsinnigen Wert.
    Daher: Die zwei Schritte (PDF erzeugen, PDF versenden) zunächst trennen.

    So long,
     Martin

    1. Hallo Martin,

      das erste, was mir einfällt: Lässt sich denn das PDF-Dokument "normal" anzeigen, also unabhängig vom Mail-Versand? Falls nicht, brauchen wir die Ursache gar nicht erst bei der Aufbereitung als e-Mail zu suchen, sondern einzig und allein beim Erzeugen des PDF-Dokuments.

      ja, ich kann das PDF im Browser und auch auf dem Server (als Kopie) richtig anzeigen lassen. Alle Inhalte inkl. des Logos sind vorhanden.

      Wenn ich die Mail anschaue, die ich auf dem Server speichere (eine Kopie) ist diese komischerweise vollständig. Wieso "komischerweise"? Das sollte doch wohl so sein.

      Ich meinte nicht die Mail sondern das PDF.

      In der Datei, in der mein PDF zusammen gestellt wird, binde ich das Logo so ein

      <div style="margin-bottom:22px;"><img src="http://example.org/grafiken/logo.jpg"></div>
      

      Nur mal so aus HTML-Gesichtspunkten gefragt: Wozu steckst du das Bild noch in einen div-Container?

      Weil ich html2pdf nur mit DIVs stylen kann, alles andere wird nicht akzeptiert, was aber kein weiteres Problem ist, da dieses HTML Dokument niemand zu Gesicht bekommt.

  4. Moin,

    folgendes funktioniert mit allen Inhalten (Bilder & Texte):

    • PDF kann auf dem Server geöffnet werden
    • PDF wird nach dem generieren zum Download angeboten
    • PDF kann direkt geöffnet werden
    • PDF kann via direkt URL aufgerufen werden

    Wenn ich das PDF mit "Swift_Attachment::fromPath" verschicken und öffnen möchte, kommt folgende Meldung

    Alternativ-Text

    1. Moin,

      ok also liegt es nicht an meiner PDF Datei, wenn ich eine fremde PDF eintrage:

      ->attach(Swift_Attachment::fromPath('http://www.einfach-fuer-alle.de/download/pdf_barrierefrei.pdf'))
      

      bekomme ich die gleiche Fehlermeldung wie hier beschrieben

      1. Hallo,

        ok also liegt es nicht an meiner PDF Datei, wenn ich eine fremde PDF eintrage:

        ->attach(Swift_Attachment::fromPath('http://www.einfach-fuer-alle.de/download/pdf_barrierefrei.pdf'))
        

        bekomme ich die gleiche Fehlermeldung wie hier beschrieben

        dann zeig doch bitte mal den Mail-Quellcode, der beim Client ankommt, gern auch auf das Wesentliche gekürzt. Ich tippe darauf, dass entweder doch der falsche Content-Type angegeben ist, oder die Transfer-Codierung (vorzugsweise base64) vergessen wurde.

        So long,
         Martin

        1. Hallo Martin,

          dann zeig doch bitte mal den Mail-Quellcode, der beim Client ankommt, gern auch auf das Wesentliche gekürzt. Ich tippe darauf, dass entweder doch der falsche Content-Type angegeben ist, oder die Transfer-Codierung (vorzugsweise base64) vergessen wurde.

          hab jetzt alles aus meiner Datei geworfen nur den PDF Versand drin gelassen, dieser sieht wie folgt aus

          <?php
          require_once 'include/functions/uebersicht.php';
          require_once 'include/lib/html2pdf/html2pdf.class.php';
          require_once 'include/lib/Swift-5.0.3/lib/swift_required.php';
          
          $data = array();
          $data['smtp'] = array();
          $data['smtp']['host'] 		= $wes_smtp_host;
          $data['smtp']['port'] 		= $wes_smtp_port;
          $data['smtp']['username'] 	= $wes_smtp_username;
          $data['smtp']['password'] 	= $wes_smtp_password;
          			
          $zl = $wk->kd_vorname . " ". $wk->kd_name;	
          $lk = $wk->kd_email;
          						
          $data['from'] 		= array('name' => '', 'email' => '');
          $data['to'] 		= array('name' => $zl, 'email' => $lk);
          $data['charset'] 	= 'utf-8';
          			
          $data['subject']	= '';
          				
          $data['html'] = '<html></html>';
          
          $save = 'Angebot-'.$timestamp.'.pdf';		
          		
          $smtp = new Swift_SmtpTransport($data['smtp']['host'], $data['smtp']['port']);
          $smtp->setUsername($data['smtp']['username']);
          $smtp->setPassword($data['smtp']['password']);
          			
          $mail = new Swift_Message($data['subject']);
          $mail->setBody($data['html'])
          	->setCharset($data['charset'])
          	->setContentType("text/html")
          	->attach(Swift_Attachment::fromPath('http://www.einfach-fuer-alle.de/download/pdf_barrierefrei.pdf'))
          	->setFrom($data['from']['email'], $data['from']['name'])
          	->setTo($data['to']['email'], $data['to']['name']);      
          			
          $swift = new Swift_Mailer($smtp);
          $swift->send($mail,$recipient);
          ?>
          

          Und es kommt genau die gleiche Fehlermeldung, muss also in diesem Code Teil der Fehler sein.

          1. Hallo,

            hab jetzt alles aus meiner Datei geworfen nur den PDF Versand drin gelassen

            ja schön, aber ich fragte nicht aus Spaß nach dem "Mail-Quellcode, der beim Client ankommt", so dass man von dort aus rückwärts analysieren kann. Denn aus deinem PHP-Code kann man nur vermuten, was er als Ausgabe produziert.

            Ich finde es beispielsweise verdächtig, dass du ein Attachment anfügen willst, das seinerseits erst per HTTP geholt werden soll. Kommt der Swift-Mailer mit URL-Pfaden zurecht? Ich würde da eher lokale Dateisystem-Pfade erwarten.

            Und es kommt genau die gleiche Fehlermeldung, muss also in diesem Code Teil der Fehler sein.

            Genau. ;-)

            So long,
             Martin

          2. Hallo,

            es funktioniert. Es gibt wohl in der Download Version ein Problem mit dem "Base64ContentEncoder" wer eine PDF mitschicken möchte, muss dieses Update einspielen:

            https://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/Mime/ContentEncoder/Base64ContentEncoder.php#L34-L35

            Vielleicht sollte dieses auch im WIKI mit aufgenommen werden, da habe ich den Artikel über den Swift_Mailer gefunden.