Email mit Anhang
Andi
- php
Hallo!
Ich versuche verzweifelt eine Email mit Anhang zu versenden.
Aber er schickt mir immer nur einen Teil der Datei mit.
Hier mein Quellcode:
$mail_header = "";
$boundary = strtoupper(md5(uniqid(time())));
/* Beginne den Mail-Header mit MIME-Mail-Header */
$mail_header .= "MIME-Version: 1.0\r\n";
$mail_header .= "Content-Type: multipart/mixed; boundary="$boundary";\r\n";
/* Hier faengt der normale Mail-Text an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: text/plain;\r\n";
$mail_header .= "Content-Transfer-Encoding: 8bit\r\n";
$mail_header .= "<hmtl><body>Das ist eine Email mit Anhang</body></html>\r\n";
/* Hier faengt der Datei-Anhang an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: image/jpeg; name="test.jpg";\r\n";
$mail_header .= "Content-Transfer-Encoding: base64\r\n";
$mail_header .= "Content-Disposition: attachment\r\n";
$file = "../upload/08D28658793748CDBD1F3FC930FE14BB/2F4901007EA6369B474AAF177C147B6F/5BAE12FDB6AAB5DE6BE0AD6BCB75114E_TN.jpg";
$handle = fopen($file, "r");
$attach_content = fread($handle, filesize($file));
fclose($handle);
$reply = chunk_split(base64_encode($attach_content));
$mail_header .= $reply."\r\n";
/* Gibt das Ende der eMail aus */
$mail_header .= "--$boundary--\r\n";
return mail("KARL@spam.de","Ja hallo","",$mail_header);
Weiß nicht weiter.
Danke im voraus!
Grüße
Andi
Hallo!
Wie groß ist denn die Datei?
Wenn das Attachment geschickt wird, aber nur teilweise ankommt, dann wird das Problem wohl irgendwo in der Server-Konfiguration liegen. Es könnte eine Begrenzung der Anhang-Größe geben.
Gruß
Matthias
Hello Andi,
$reply = chunk_split(base64_encode($attach_content));
Da steckt der Fehler. Chunk_Split() hat als Default-Linebreak das "\r\n". Das ist aber leider bei base64-teilen falsch. Diese benötigen nur "\n". Geht aus irgendeinder RFC hervor. Ich kanns mir aber immer nicht merken.
also $reply = chunk_split(base64_encode($attach_content),76,"\n");
sollte Dur helfen. Mach mal Piep, wenn es geklappt hat.
http://de.php.net/manual/en/function.chunk-split.php
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Das mit dem chunk_split hat nichts genutzt, er schikt mir immer noch nur Teile der Datei mit.
Grüße
Andi
Hello,
Das mit dem chunk_split hat nichts genutzt, er schikt mir immer noch nur Teile der Datei mit.
Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?
/* Beginne den Mail-Header mit MIME-Mail-Header */
$mail_header .= "MIME-Version: 1.0\r\n";
$mail_header .= "Content-Type: multipart/mixed; boundary="$boundary";\r\n\r\n"; #### hier Fehler
$mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
$mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";
/* Hier faengt der normale Mail-Text an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: text/plain;\r\n";
$mail_header .= "Content-Transfer-Encoding: 8bit\r\n";
$mail_header .= "<hmtl><body>Das ist eine Email mit Anhang</body></html>\r\n";
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?
/* Beginne den Mail-Header mit MIME-Mail-Header */
$mail_header .= "MIME-Version: 1.0\r\n";
$mail_header .= "Content-Type: multipart/mixed; boundary="$boundary";\r\n\r\n"; #### hier Fehler$mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
$mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";
Verstehe nicht ganz, wo die Leerzeile fehlt?
Grüße
Andi
Hello,
Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?
/* Beginne den Mail-Header mit MIME-Mail-Header */
$mail_header .= "MIME-Version: 1.0\r\n";
$mail_header .= "Content-Type: multipart/mixed; boundary="$boundary";\r\n\r\n"; #### hier Fehler$mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
$mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";Verstehe nicht ganz, wo die Leerzeile fehlt?
Na jetzt nicht mehr. Ich habe sie doch eingefügt.
Lass Dir mal die Variable $mail_header nach der Generierung ausgeben
echo "<pre>";
echo $mail_header;
echo "</pre>";
Dann sieht man besser, woran es liegt.
Und poste das Ergebnis mal hier, aber bitte ohne das gesamte Bild. ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Also hier die Header:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Das ist eine Email mit Anhang
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
<Hier das Bild>
--A9D3E097D0F4704F56D6CFD0733891A3--
Grüße
Andi
Hello,
Also hier die Header:
Nee, das sind nicht nur die Hewader, sondern das ist die ganze email (natürlich gekürzt), bestehend aus Mailheader und Mailbody. Dass das alles in $mail_header steht, ist reine Benennungssache.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Das ist eine Email mit Anhang
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
<Hier das Bild>
--A9D3E097D0F4704F56D6CFD0733891A3--
Aber ich vermute noch zwei andere Fehler. Erstmal den einen:
Versendest Du dioe email mit der mail()-Funktion?
Dann lass auf jeden Fall die Variable für Text leer. Das Problem hatte ich auch, dass PHP das nicht sortiert bekommen hat. Falls das immer noch nicht fruchtet, habe ich aber noch eine Idee.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Versende die Email mit der Mail Funktion:
return mail("andreas.heinisch@idealnet.com","Ja hallo","",<Hier kommen die Header>);
Und das sind die Header:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Das ist eine Email mit Anhang
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
<Hier das Bild>
--A9D3E097D0F4704F56D6CFD0733891A3--
Grüße
Andi
Hello,
Hallo!
Versende die Email mit der Mail Funktion:
Ja sorry das hatte ich inzwischen schon bemerkt ;-)
Und das sind die Header:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3"; ###hiernach \r\n
--A9D3E097D0F4704F56D6CFD0733891A3 ## dies ist schon der Mailbody
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Das ist eine Email mit Anhang
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
<Hier das Bild>
--A9D3E097D0F4704F56D6CFD0733891A3--
Und zwischen Header und Body muss immer eine Leerzeile stehen. Hinter einem Content steht (bei mir) auch immer eine. Woher soll der Mailserver sonst wissen, wo z.B. ein base64-Block zuende ist. Ob er das nur an der Boundary erkannen kann, bezweifle ich.
Eddi hat es wohl auch so beschrieben, also rein mit den Leerzeilen. Die kosten ja nix.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom!
Danke für dein Hilfe es funktioniert jetzt!
Grüße
Andi
Hallo!
Und zwischen Header und Body muss immer eine Leerzeile stehen.
Absolut richtig er muß ausdrücklich auch mit \r\n gemacht werden, sonnst nimmt es nicht jeder Client wahr.
Gruß aus Berlin!
eddi
Hallo!
Was aber jetzt nicht mehr funktioniert ist das er mir das HTML nicht interpretiert also nur den Text ausgibt.
Ich drehe langsam durch
Grüße
Andi
Hallo!
Was aber jetzt nicht mehr funktioniert ist das er mir das HTML nicht interpretiert also nur den Text ausgibt.
Ich drehe langsam durch
Grüße
Andi
Fehler von mir. Geht doch.
Grüße und Danke
Andi
Hello,
Aber ich vermute noch zwei andere Fehler. Erstmal den einen:
Versendest Du dioe email mit der mail()-Funktion?Dann lass auf jeden Fall die Variable für Text leer. Das Problem hatte ich auch, dass PHP das nicht sortiert bekommen hat. Falls das immer noch nicht fruchtet, habe ich aber noch eine Idee.
Entschuldige, es war ja im OP zu sehen, wie Du das macht. Dann also das letzte Geschoss auf den Fehler, nicht ganz wissenschaftlich abgesichert, aber mein Mailprogramm funktioniert so und Deins sieht gleich genauso aus. Also:
Vor und nach jeder Boundary auch eine Leerzeile einfügen. Dann erst den Content des Abschnittes. Es handelt sich ja quasi um Subbodies.
Dieser Test kostet Dich nur einen weiteren Versuch und dann gehen mir sowieso auch die Ratschläge aus.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Es funktioniert jetzt!
Danke für deine Mühe.
Grüße
Andi
Hello,
Es funktioniert jetzt!
Danke für deine Mühe.
Bitte. Aber probier ruhig nochmal aus, wie sich das System verhält, wenn Du beim base64-Block "\r\n" statt "\n" benutzt. Meins will dann nicht mehr.
das MIME-Mailformat ist ein rekursives Format. Daher nehme ich an, dass das mit den Leerzeilen NACH dem Sub-Content auch richtig ist, davor auf alle Fälle.
http://netzmafia.de/rfc/rfc/rfc2822.txt
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Also hier die Header:
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="A9D3E097D0F4704F56D6CFD0733891A3";
(nächste Zeileund \t davor da die Zeile über 75 Zeichen gorß ist)
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
hier sollte \r\n\r\n
Das ist eine Email mit Anhang
hier sollte \r\n\r\n
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
hier sollte \r\n\r\n
<Hier das Bild>
Ist es den im Format base64?
--A9D3E097D0F4704F56D6CFD0733891A3--
Grüße
Andi
Gruß aus Berlin!
eddi
Hallo!
Habe es so probiert und es funktioniert:
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="A9D3E097D0F4704F56D6CFD0733891A3";
(nächste Zeileund \t davor da die Zeile über 75 Zeichen gorß ist)--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
hier sollte \r\n\r\n
Das ist eine Email mit Anhang
hier sollte \r\n\r\n
--A9D3E097D0F4704F56D6CFD0733891A3
Content-Type: image/jpeg; name="test.jpg";
Content-Transfer-Encoding: base64
Content-Disposition: attachment
hier sollte \r\n\r\n
<Hier das Bild>
Ist es den im Format base64?
--A9D3E097D0F4704F56D6CFD0733891A3--
Grüße
Andi
Hallo!
Habe es so probiert und es funktioniert:
Das Problem kenne ich noch seit meinem allerersten Newletter-script ;)
Gruß aus Berlin!
eddi
Hallo Tom!
Es fetzt immer noch nicht.
Grüße
Andi