PHPMailer PDF verschicken

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHPMailer PDF verschicken

    HiHo,

    Für ein Projekt nutze ich PHPMailer und fdpf um PDF FIles als Anhang zu senden.
    Wie nicht anders zu erwarten spruckt fdpf mir nen Header error aus

    Warning: Cannot modify header information - headers already sent by (output started at /var/www/virtual/xxxxxxx/htdocs/theme/cache/%%FA^FA4^FA44DF90%%page_header.htm.php:9) in /var/www/virtual/xxx/htdocs/class/pdf/pdf_inc/fpdf.php on line 998
    FPDF error: Some data has already been output to browser, can't send PDF file


    Woran es liegt weiss ich, es darf vorher nix an den Browser gesendet werden aber genau dies muss das Script machen da er vorher den HTML Kopf sendet samt CSS.
    Nein, anders geht es nicht da sonst das Bestellformular aufgrund des Fehlenden Styles schrecklich aussieht.

    HIer die Datei, habt ihr evtl noch andere Lösungen?

    Quellcode

    1. <?PHP
    2. include('./include/init.php');
    3. global $Core, $Smarty, $lang;
    4. define('FPDF_FONTPATH', './class/pdf/pdf_inc/font/');
    5. include_once('./class/pdf/pdf_inc/fpdf.php');
    6. include_once('./class/pdf/pdf_inc/class_calculation_pdf.php');
    7. require('./class/mail/class.phpmailer.php');
    8. $pakage = trim(htmlspecialchars($_GET['pakage']));
    9. // Header laden
    10. $Core->page_header($lang['BUY'] . ' &bull; ' . $pakage);
    11. $message = '';
    12. // Absenden
    13. if (isset($_POST['send']))
    14. {
    15. $buy_date = $Core->userdate(time());
    16. $message = false;
    17. // Alle felder ausgefüllt?
    18. if ( !$_POST['name'] or !$_POST['adresse'] or !$_POST['plz'] or !$_POST['ort'] or !$_POST['phone'] or !$_POST['email'] )
    19. {
    20. $message .= 'Du hast nicht alle Felder ausgef&uuml;lt <br />';
    21. $fehler = true;
    22. }
    23. // Email gültig
    24. if ( !$Core->check_email($_POST['email']) )
    25. {
    26. $message .= 'Du hast eine Falsche Email Adresse angegeben <br />';
    27. $fehler = true;
    28. }
    29. // AGB Akzeptiert
    30. if ( !@$_POST['acept'] )
    31. {
    32. $message .= 'Sie müssen die AGBs akzeptieren. <br />';
    33. $fehler = true;
    34. }
    35. //Kein Fehler aufgetaucht?
    36. if ( !isset($fehler) )
    37. {
    38. // EIntragen der Kunden Daten
    39. $pdoparams = array(
    40. ':paket' => $_GET['pakage'],
    41. ':anrede' => $_POST['anrede'],
    42. ':name' => $_POST['name'],
    43. ':adresse' => $_POST['adresse'],
    44. ':ort' => $_POST['plz'] . ' ' . $_POST['ort'],
    45. ':phone' => $_POST['phone'],
    46. ':email' => $_POST['email'],
    47. );
    48. $sql = 'INSERT INTO ' . KUNDEN . '
    49. (paket, anrede, name, adresse, ort, phone, email)
    50. VALUES (:paket, :anrede, :name, :adresse, :ort, :phone, :email)';
    51. $stmt = MyDB::getInstance()->prepare($sql);
    52. $stmt->execute($pdoparams);
    53. // AUsgabe der letzten Kunden ID
    54. $Kunden_ID = MyDB::getInstance()->lastInsertId();
    55. $bodytext = $lang['BUY_EMAIL_TEXT'];
    56. $bodyhtml = $lang['BUY_EMAIL_TEXT'];
    57. /* -------------------------- */
    58. $pdf = new Calculation();
    59. // INI-Datei laden
    60. $pdf->global = parse_ini_file('./class/pdf/pdf_inc/pdf_config.ini',TRUE);
    61. // Grundeinstellungen
    62. $pdf->customer['adress'] = $_POST['name'].'\n'.$_POST['adresse'].'\n\n'.$_POST['plz'] . ' ' . $_POST['ort'];
    63. $pdf->calculation['date'] = $buy_date;
    64. $pdf->calculation['number'] = $Kunden_ID['id'];
    65. $pdf->calculation['subject'] = "Produkt Bestellung";
    66. $pdf->calculation['subject_info'] = "Produkt Bestellung";
    67. // Grundeinstellungen,Layout setzen
    68. $pdf->CalculationInitRender();
    69. // Project-Daten einlesen
    70. include('./class/pdf/pdf_inc/project.inc');
    71. // Zahlungsziel, AGB, Endsumme etc. setzen
    72. $pdf->CalculationEnd();
    73. $pdf_doc = $pdf->Output('', 'S');
    74. // Email senden
    75. $mail = new PHPMailer();
    76. $mail->From = $Core->config['email'];
    77. $mail->FromName = 'xxxx';
    78. $mail->Subject = 'xxxx Bestellung des Paketes ' . $_GET['pakage'];
    79. $mail->AltBody = $bodytext;
    80. $mail->MsgHTML($bodyhtml);
    81. $mail->AddAddress( $_POST['email'] );
    82. // PDF Anhang mitsenden
    83. $mail->AddStringAttachment($pdf_doc, 'pdf_doc.pdf', '', 'application/pdf');
    84. $mail->Send();
    85. $message = 'Danke für ihre Bestellungen. In wenigen Minuten sollten sie eine Email mit weiteren Informationen verhalten.';
    86. }
    87. }
    88. $agb_link = '<a href="agb.php">'.$lang['AGB'].'</a>';
    89. $Smarty->assign(array(
    90. 'PAKAGE_VERSION_BUY' => $lang['PAKAGE'] . ' ' . $pakage . ' ' . $lang['BUY'],
    91. 'PAKAGE' => $pakage,
    92. 'RP-M' => (@$_GET['pakage'] == 'rp-m')? true : false,
    93. 'RP-L' => (@$_GET['pakage'] == 'rp-l')? true : false,
    94. 'AGB_ACEPT' => sprintf($lang['AGB_ACEPT'], $agb_link),
    95. 'MESSAGE' => $message,
    96. ));
    97. $Smarty->display('buy.htm');
    98. // Footer laden
    99. $Core->page_footer();
    100. ?>
    Alles anzeigen
  • HiHo,

    Die Funktion ob PDF an den Browser geschickt wird oder net nicht ist im Grunde oben schon geschrieben.

    Quellcode

    1. $pdf_doc = $pdf->Output('', 'S');
    2. $mail->AddStringAttachment($pdf_doc, 'pdf_doc.pdf', '', 'application/pdf');


    Die erste Zeile speichert das Dokument in der $pdf_doc und in der 2 wird es versendet.

    hier aber die fpdf.php wo alles generiert wird, evtl liegt es ja auch daran an Zeile 998
    Dateien
    • fpdf.zip

      (10,23 kB, 343 mal heruntergeladen, zuletzt: )
  • HiHo,

    EInmal nutze ich ne weiter klasse für die position der texte im pdf
    Datei ist im Anhang

    Ansonsten kann ich dir noch die init.php anbieten, in dieser werden alle Klassen der Seite geladen und die Core, dir für den Header und Footer der Seite zuständig ist.

    init.php

    Quellcode

    1. <?PHP
    2. // Fehlerreport von E_NOTICE deaktivieren
    3. error_reporting(E_ALL);
    4. $time = round(microtime(), 3);
    5. // UTF8 erzwingen
    6. @setlocale(LC_CTYPE, 'de_DE.utf8', 'de_DE.UTF-8', 'en_US.utf8', 'en_US.UTF-8', 'en_GB.utf8', 'en_GB.UTF-8', 'de_AT.utf8', 'de_AT.UTF-8', 'de_CH.utf8', 'de_CH.UTF-8');
    7. if( function_exists('mb_internal_encoding') )
    8. {
    9. mb_internal_encoding('utf-8');
    10. }
    11. header('Content-type: text/html; charset=utf-8');
    12. foreach ($_POST as $key => $value)
    13. {
    14. $value = strip_tags ($value);
    15. $value = htmlspecialchars ($value);
    16. $_POST[$key] = $value;
    17. }
    18. foreach ($_GET as $key => $value)
    19. {
    20. $value = strip_tags ($value);
    21. $value = htmlspecialchars ($value);
    22. $_GET[$key] = $value;
    23. }
    24. require('./class/engine/Smarty.class.php');
    25. require('./include/config.php');
    26. require('./include/constants.php');
    27. require('./class/core_class.php');
    28. require('./class/db_class.php');
    29. require('./class/mail_class.php');
    30. require('./class/kunde_class.php');
    31. $Smarty = new Smarty();
    32. $Core = new Core();
    33. $Kunde = new KUNDE();
    34. global $Core, $Smarty, $Kunde;
    35. // Prüfen ob Online oder Offline
    36. // und ausgabe des Nicks
    37. if ($Kunde->chkonline() == false )
    38. {
    39. }
    40. else
    41. {
    42. $user_cookie = $_COOKIE['rootpoint'];
    43. $pdoparams = array(
    44. ':cookie_key' => $user_cookie,
    45. );
    46. $sql = "SELECT * FROM
    47. " . KUNDEN . "
    48. WHERE cookie_key = :cookie_key";
    49. $stmt = MyDB::getInstance()->prepare($sql);
    50. $stmt->execute($pdoparams);
    51. $userdata = $stmt->fetch();
    52. }
    53. ?>
    Alles anzeigen


    core.php

    Quellcode

    1. <?PHP
    2. class Core
    3. {
    4. public $config = array();
    5. // Laden aller Einstellungen die immer verfügbar sind
    6. public function __construct()
    7. {
    8. global $Core, $Smarty, $lang;
    9. $sql = "SELECT * FROM " . CONFIG;
    10. $stmt = MyDB::getInstance()->prepare($sql);
    11. $stmt->execute();
    12. while ($row = $stmt->fetch())
    13. {
    14. $this->config[$row['name']] = $row['value'];
    15. }
    16. require('./lang/de/lang_global.php');
    17. }
    18. /**
    19. * Email Adresse prüfen
    20. *
    21. * @param $email String Email Adresse
    22. * @access public
    23. */
    24. public function check_email($email)
    25. {
    26. global $Core, $Smarty;
    27. if (!preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email))
    28. {
    29. return false;
    30. }
    31. else
    32. {
    33. return true;
    34. }
    35. }
    36. /**
    37. * Timestamp umwandeln
    38. *
    39. * @param $date int timestamp
    40. * @access public
    41. */
    42. public function userdate($date)
    43. {
    44. $date = date("d.m.Y",$date);
    45. return $date;
    46. }
    47. /**
    48. * time() Umwandeln
    49. *
    50. * @param $var Wers aus der Datenbank bzw Formular
    51. * @access public
    52. */
    53. public function usertime($var)
    54. {
    55. @$var = date("d.m.Y - H:i",$var);
    56. return $var;
    57. }
    58. /**
    59. * GetICQStatus() ICQ Status ermitteln
    60. *
    61. * @param $uin INT ICQ ID
    62. * @access public
    63. */
    64. public function GetICQStatus($uin)
    65. {
    66. if(!is_numeric($uin)) return false;
    67. $fp = @fsockopen('status.icq.com', 80, $errno, $errstr, 5);
    68. if(is_resource($fp))
    69. {
    70. stream_set_timeout($fp,3);
    71. $request = "HEAD /online.gif?icq=".$uin."&img=5 HTTP/1.1\r\n"."Host: status.icq.com\r\n"."Connection: close\r\n\r\n";
    72. fputs($fp, $request);
    73. do
    74. {
    75. $response = fgets($fp, 25);
    76. }
    77. while(!feof($fp) && !stristr($response, 'Location'));
    78. fclose($fp);
    79. if(strstr($response, 'online1')) return 'online';
    80. if(strstr($response, 'online0')) return 'offline';
    81. if(strstr($response, 'online2')) return 'offline';
    82. }
    83. else
    84. {
    85. return 'offline';
    86. }
    87. }
    88. /**
    89. * Ausgabe des Headers
    90. *
    91. * @param $title String Titel der aufgerufenen Seite
    92. * @access public
    93. */
    94. public function page_header($title)
    95. {
    96. global $Core, $Smarty, $lang, $Kunde;
    97. // Cache aktiv?
    98. $Smarty->caching = $this->config['cache'];
    99. $Smarty->assign(array(
    100. 'PAGE_HEADER' => $this->config['sitename'] . ' &bull; ' . $this->config['description'] . ' &bull; ' . $title,
    101. 'LANG' => $lang,
    102. 'YESNO' => array('1' => $lang['YES'], '0' => $lang['NO']),
    103. 'EMAIL' => $this->config['email'],
    104. 'USER_LOGGED_IN' => !$Kunde->chkonline(),
    105. ));
    106. $Smarty->display('page_header.htm');
    107. }
    108. /**
    109. * Ausgabe des Footers
    110. *
    111. * @access public
    112. */
    113. public function page_footer()
    114. {
    115. global $Core, $Smarty;
    116. $sql = "SELECT * FROM " . NEWS;
    117. $stmt = MyDB::getInstance()->prepare($sql);
    118. $stmt->execute();
    119. while ($row = $stmt->fetch())
    120. {
    121. $row['date'] = $this->userdate($row['date']);
    122. $news[] = $row;
    123. }
    124. $time2 = round(microtime(), 3);
    125. $Smarty->assign(array(
    126. 'GEN_TIME' => $time2 - @$time,
    127. 'NEWS' => $news,
    128. 'ICQ_STATUS' => $this->GetICQStatus(),
    129. 'ICQ_NR' => $this->config['icq'],
    130. ));
    131. $Smarty->display('page_footer.htm');
    132. }
    133. }
    134. ?>
    Alles anzeigen


    Ich denke aber immernoch das es an fpdf.php selber liegt. Zeile 998 wie in der Fehlermeldung.
    Diese Funktion ist für die Ausgabe des PDF zuständig

    Quellcode

    1. function Output($file='',$download=false)
    2. {
    3. //Output PDF to file or browser
    4. global $HTTP_ENV_VARS;
    5. if($this->state<3)
    6. $this->Close();
    7. if($file=='')
    8. {
    9. //Send to browser
    10. Header('Content-Type: application/pdf');
    11. if(headers_sent())
    12. $this->Error('Some data has already been output to browser, can\'t send PDF file');
    13. Header('Content-Length: '.strlen($this->buffer));
    14. Header('Content-disposition: inline; filename=doc.pdf');
    15. echo $this->buffer;
    16. }
    17. else
    18. {
    19. if($download)
    20. {
    21. //Download file
    22. if(isset($HTTP_ENV_VARS['HTTP_USER_AGENT']) and strpos($HTTP_ENV_VARS['HTTP_USER_AGENT'],'MSIE 5.5'))
    23. Header('Content-Type: application/dummy');
    24. else
    25. Header('Content-Type: application/octet-stream');
    26. if(headers_sent())
    27. $this->Error('Some data has already been output to browser, can\'t send PDF file');
    28. Header('Content-Length: '.strlen($this->buffer));
    29. Header('Content-disposition: attachment; filename='.$file);
    30. echo $this->buffer;
    31. }
    32. else
    33. {
    34. //Save file locally
    35. $f=fopen($file,'wb');
    36. if(!$f)
    37. $this->Error('Unable to create output file: '.$file);
    38. fwrite($f,$this->buffer,strlen($this->buffer));
    39. fclose($f);
    40. }
    41. }
    42. }
    Alles anzeigen
    Dateien
  • hm... hab mir jetzt nicht alles durchgeschaut aber versuch mal statt

    Quellcode

    1. $pdf_doc = $pdf->Output('', 'S');


    Quellcode

    1. $pdf_doc = $pdf->Output('irgendwas', 'S');


    Der name-Parameter wird zwar ignoriert, wenn S gewählt ist, aber es darf wohl nicht der leere String sein.

    Benutzt du ne alte Version von fpdf? In der aktuellen sieht die Output-Funktion nämlich anders aus, und ist von dem Problem wohl nicht betroffen.
  • ich kann nur sagen, dass die betreffende Funktion in der Version, die ich gerade runtergeladen hab völlig anders aussieht:

    Quellcode

    1. function Output($name='', $dest='')
    2. {
    3. //Output PDF to some destination
    4. if($this->state<3)
    5. $this->Close();
    6. $dest=strtoupper($dest);
    7. if($dest=='')
    8. {
    9. if($name=='')
    10. {
    11. $name='doc.pdf';
    12. $dest='I';
    13. }
    14. else
    15. $dest='F';
    16. }
    17. switch($dest)
    18. usw...
    Alles anzeigen


    Die von dir gepostete Version erwartet als zweiten Parameter ja nichtmal nen String, sondern nur ein boolean. Mehr kann ich dazu auch nicht sagen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rondrer ()