Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Word Dokument erstellen und versenden, Fehler

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Word Dokument erstellen und versenden, Fehler

    Guten Tag

    Is mein erster Beitrag im Forum deshalb erstmal mal Hallo an Hallo
    Zu Vorwarnung, ich bin blutiger Anfänger

    Erstmal zur Problemstellung:
    Auf einer Kontakt-Seite habe ich mehrere Textfelder, die der Nutzer ausfüllen und dann abschicken kann. Es dreht sich um eine Auftragsanfrage.

    Die Daten werden per PHP aus den Feldern geholt und in die Mail geschrieben
    --> Funktioniert

    Die Daten werden ebenfalls in ein vorgefertigtes Word-Doc geschrieben und ersetzen dort die Platzhalter. Anschließend wird das Doc unter neuem Namen auf dem Server gespeichert.
    --> Funktioniert

    Am Ende wird dir Mail an mich versandt mit den jeweiligen Angaben die der Nutzer gemacht hat und dem Word-Doc als Anhang.
    --> Funktioniert

    Hab vieles bisher hingekriegt, jetzt kommt aber der Teil wo ich verzweifle...

    Problem:
    Wenn ich das Doc in der Mail öffnen will kommt folgende Meldung:

    "Leider kann Anhang.docx nicht geöffnet werden, da der Inhalt Probleme verursacht".

    Option Wiederherstellen gewählt:
    Fehlermeldung:
    "Diese Datei kann in Microsoft Office nicht geöffnet werden, weil Teile fehlen oder ungültig sind"

    Wenn ich die Datei aber über den FTP Server nach drücken des "Sende" Buttons auf meinen PC ziehe und öffne ist Sie genau wie Sie sein sollte.
    Ausgefüllt und in der gewünschten Formatierung...

    Hier mein PHP Code:

    Code:
    include 'config.php';
    
    error_reporting (E_ALL ^ E_NOTICE);
    
    $post = (!empty($_POST)) ? true : false;
    $error = '';
    $lokalitäten_text = array();
    
    if($post)
    {
    
    
            // Textfelder werden ausgelesen
    	$firma = stripslashes($_POST['firma']);
    	$name_vorname = stripslashes($_POST['name_vorname']);
    	$street = stripslashes($_POST['street']);
    	$plz = stripslashes($_POST['plz']);
    	$telefon = stripslashes($_POST['telefon']);
    	$mobil = stripslashes($_POST['mobil']);
    	$vort = stripslashes($_POST['vort']);
    	$date = stripslashes($_POST['date']);
    	$time = stripslashes($_POST['time']);
    	$motto = stripslashes($_POST['motto']);
    	$visitors = stripslashes($_POST['besucher']);
    	$mail = trim($_POST['mail']);
    	$subject = "Auftragsanfrage";
    	$sonst = stripslashes($_POST['sonst']);
    
    	echo $sonst;
    
            // Checkboxen werden ausgelesen
    	if (isset($_POST['halle'])) {
    		$ch1 = $_POST['halle'];
    		if ($ch1 === 'halle') {
    			array_push($lokalitäten_text, "Halle");
    		}
    	}
    	if (isset($_POST['zelt'])) {
    		$ch2 = $_POST['zelt'];
    		if ($ch2 === 'zelt') {
    			array_push($lokalitäten_text, "Zelt");
    		}
    	}
    	if (isset($_POST['kneipe'])) {
    		$ch3 = $_POST['kneipe'];
    		if ($ch3 === 'kneipe') {
    			array_push($lokalitäten_text, "Wirtschaft");
    		}
    	}
    	if (isset($_POST['sonst'])) {
    		$ch4 = $_POST['sonst'];
    		if ($ch4 === 'sonst') {
    			array_push($lokalitäten_text, "Sonstiges");
    		}
    	}
    
           // Umlaute werden ersetzt zwecks Darstellung in der Mail
    	$ersetzen = array( 'ä' => 'ae', 'Ä' => 'Ae', 'ö' => 'oe',  'Ö' => 'Oe', 'ü' => 'ue',  'Ü' => 'Ue', 'ß' => 'ss');
    	$firma = strtr($firma, $ersetzen );
    	$name_vorname = strtr($name_vorname, $ersetzen );
    	$street = strtr($street, $ersetzen );
    	$plz = strtr($plz, $ersetzen );
    	$vort = strtr($vort, $ersetzen );
    	$motto = strtr($motto, $ersetzen );
    
            // Komma getrennter String wird erstellt
    	$lokalitäten_string = join(', ', $lokalitäten_text);
    
    	// Radiobuttons werden ausgelesen
    	$one_way = $_POST['one-way'];
    	$alter_ab = $_POST['alter_ab'];
    
            // E-Mail wird erstellt
    	if(!$error){
    
                    // Vor der Mail wird noch das Word-Doc erstellt (siehe Funktion unten)
    		foo_doc($firma, $name_vorname, $street, $plz, $telefon, $mobil, $mail, $vort, $date, $time, $motto, $visitors, $lokalitäten_string, $one_way, $alter_ab, $sonst);
    		sleep(5);
     
                    // E-Mail Text
    		$text = "Anfrage von $name_vorname
    
    		Firma: \t \t \t \t $firma
    		Name, Vorname: \t \t $name_vorname
    		Strasse: \t \t \t $street
    		PLZ: \t \t \t \t $plz
    		Telefon: \t \t \t $telefon
    		Mobil: \t \t \t \t $mobil
    		Mail: \t \t \t \t $mail
    		Veranstaltungsort: \t \t $vort
    		Veranstaltungsdatum: \t \t $date
    		Einlass ab: \t \t \t $time Uhr
    
    		Motto der Veranstaltung: \t $motto
    		Kalkulierte Besucheranzahl: \t $visitors
    
    		Lokalitäten: \t \t \t $lokalitäten_string
    
    		One-Way: \t \t \t $one_way
    		Einlass ab: \t \t \t $alter_ab Jahren";
    
    		$to = WEBMASTER_EMAIL;
    		$from = $mail;
    		$message = $text;
    
                    // Mail wird erstellt und verschickt mit eben erstelltem Doc als Anhang
    		$file = 'Anhang.docx';
    		ini_set('track_errors', 'On');
    
    		$mime_boundary = "<<<:" . md5(uniqid(mt_rand(), 1));
    		$data = chunk_split(base64_encode(file_get_contents($file)));
    		$header = "To: ".$to."\r\n";
    		$header.= "From: ".$from."\r\n";
    		$header.= "MIME-Version: 1.0\r\n";
    		$header.= "Content-Type: multipart/mixed;\r\n";
    		$header.= " boundary=\"".$mime_boundary."\"\r\n";
    
    		$content = "This is a multi-part message in MIME format.\r\n\r\n";
    		$content.= "--".$mime_boundary."\r\n";
    		$content.= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
    		$content.= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    		$content.= $message."\r\n";
    		$content.= "--".$mime_boundary."\r\n";
    		$content.= "Content-Disposition: attachment;\r\n";
    		$content.= "Content-Type: Application/Octet-Stream; name=\"".$file."\"\r\n";
    		$content.= "Content-Transfer-Encoding: base64\r\n\r\n";
    		$content.= $data."\r\n";
    		$content.= "--boundary--" . $mime_boundary . "\r\n";
    		if(@mail($to, $subject, $content, $header))
    		{
    			return TRUE;
    		}
    		echo "Fehler: " . $php_errormsg;
    		return FALSE;
    
    	}
    }
    
    // Funktion um das Word Dokument zu erstellen
    function foo_doc($firma, $name_vorname, $street, $plz, $telefon, $mobil, $mail, $vort, $date, $time, $motto, $visitors, $lokalitäten_string, $one_way, $alter_ab, $sonst) {
    	require_once 'PHPWord.php';
    
            // Vordefiniertes Word-Doc wird geladen, dann die Platzhalter ersetzt und anschließend als neues Doc abgespeichert.
    	$PHPWord = new PHPWord();
    	$document = $PHPWord->loadTemplate("Auftragsanfrage.docx"); 
    
    		// after open you can change values inside doc (but every item to change in the original docs must to be ${ITEM_TO_CHANGE}) with this command: 
    
    		//Kontaktinformationen
    	$document->setValue("Firma","$firma"); 
    	$document->setValue("Herrlich","$name_vorname");
    	$document->setValue("Straße", "$street");
    	$document->setValue("PLZ", "$plz");
    	$document->setValue("Telefon", "$telefon");
    	$document->setValue("Mobil", "$mobil");
    	$document->setValue("Mail", "$mail");
    
    		// Veranstaltungsdaten
    	$document->setValue("VOrt", "$vort");
    	$document->setValue("VDate", "$date");
    	$document->setValue("VTime", "$time");
    	$document->setValue("VMotto", "$motto");
    	$document->setValue("VBesucher", "$visitors");
    
    		//Spezielle Informationen
    	$document->setValue("Lokal", "$lokalitäten_string");
    	$document->setValue("OneWay", "$one_way");
    	$document->setValue("EinlassJahren", "$alter_ab");		
    	$document->setValue("Sonstiges", "$sonst");
    
    		// to Save new File : 
    	$document->save("Anfrage.docx"); 
    }
    
    ?>
    Der Code an sich funktioniert, nur das Dokument weist beim anhängen Fehler auf, kann über den FTP-Server aber normal geöffnet werden...

    Kann mir da jmd helfen?

    Danke vorab und viele Grüße
    Kellrkind


  • #2
    Da dein Worddokument ja richtig erstellt wird, ist das Problem vermutlich beim Versand der Anlage mit mail() zu suchen.

    Die Lösung:
    Bitte nicht mail() benutzen, sondern eine ordentliche Mail-Klasse (phpmailer / swiftmail).

    Du läufst sonst immer den Problemen hinterher:
    - dass deine Email erst gar nicht gesendet wird
    - deine Email-Header NICHT RFC konform sind und die mail von einem der Zwischensysteme deshalb nicht weiterbefördert wird
    - am Zielsystem abgelehnt wird
    - Inhalte/Umlaute falsch dargestellt werden.
    und und ...

    Mail() ist tot, es lebe mail()

    LG jspit
    PHP-Klassen auf github

    Kommentar


    • #3
      Ergänzend: http://php-de.github.io/jumpto/mail-class/
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Danke euch beiden!

        Habe das jetzt mal mit Swiftmailer umgebaut,
        wird bisher nur noch keine Mail verschickt obwohl die Daten stimmen.

        Aber denk das finde ich i-wie selber raus

        Viele Grüße
        Kellrkind

        Kommentar

        Lädt...
        X