[PHP] Emailform met bijlage werkt niet

Pagina: 1
Acties:
  • 163 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ik heb een emailformulier waar een bijlage meegestuurd kan worden.
Het bestand word echter niet goed gelezen. Hetzelfde script gebruik ik ook bij een andere hoster en daar werkt het wel.

Weet iemand hoe dit kan?

Wanneer ik dit script test, krijg ik als bijlage een text bestand met het volgende daarin:
Content-Type: application/octet-stream; name=logo.gif
Content-Transfer-Encoding: base64
Content-disposition: attachment

R0lGODlhNgEyALMAAKwAHv3...

/8CgcEgsGo/IpHLJbDqf0Kh0Sq...

DQSCBA0OBQgBe4ptAQsECp...

Aq2kBAILCMAIBQahCgK3yFcL...enz.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//geneer boundary
DEFINE('bound',md5(uniqid(time())));
//check request method

    if($_SERVER['REQUEST_METHOD'] == 'POST'){
                  //if file upload send with email as mixed
         if(!empty($_FILES['file']['name']))
         {
            //check filesize
             if($_FILES['file']['size'] < 1024*50)
             {
                  $headers = "From: $email\r\n";
                   $headers .= "MIME-Version: 1.0\r\n";
                   //email bestaat uit meerdere  bestanden dus vertel wat de scheidings teken is en dat het een multipart is
                   $headers .= "Content-Type: multipart/mixed; boundary=\"".bound."\"\r\n";
                   //we zenden een attachment mee
                   $headers .= "Content-Disposition:  attachment\r\n";
                   //readfile
                   $fp = fopen($_FILES['file']['tmp_name'],'r');
                   $bestand = fread($fp,$_FILES['file']['size']);
                   fclose($fp);
                   //create body
                   //generenen een body. Dit is een multi part gezeik
                   $body.= "This is a multi-part message in MIME format.\r\n";
                   $body.= "\r\n";
                //boundary
                $body.= "--".bound."\r\n";
                //content type + charater set (iso in dit geval)
                $body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
                //codering (7 bit)
                $body.= "Content-Transfer-Encoding: 7bit\r\n";
                $body.= "\r\n";
                //het bericht
$body .="Betreft: Bericht via de website\r\n";
$body .="Naam: $naam\n";
$body .="Adres: $adres\n";
$body .="Postcode: $postcode\n";
$body .="Woonplaats: $plaats\n";
$body .="Email: $email\n";
$body .="Tel: $telefoon\n";
$body .="Opmerking: $opmerking\n";
//boundary
                $body.= "--".bound."\r\n";
                $body .= "Content-Type: application/octet-stream; name=".$_FILES['file']['name']."\r\n";
                //codering
                $body .= "Content-Transfer-Encoding: base64\r\n";
                //als bijlage toegevoegd
                $body.= "Content-disposition: attachment\r\n";
                $body .= "\n";
                //de inhoud van het bestand
                $body .= chunk_split(base64_encode($bestand )) . "\r\n";
                mail($ontvanger2,$onderwerp2,$body,$headers);
                echo "Bedankt voor uw email.<br />Wij nemen zo spoedig mogelijk contact met u op.";
            }
            else
            {
                 echo 'De bestandsgrootte van uw pbijlage is te groot.<br />Probeert u het nogmaals met een kleiner bestandsformaat.';
             }
        }

[ Voor 4% gewijzigd door RobIII op 13-02-2007 01:04 . Reden: even wat layout vern**kende crap weggehaald ;) ]


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
2 dingen
1) waarom gebruik je \n en \r\n in de body van de mail door elkaar?
2) waar is de "end" boundary? (--$bound--)

Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
De end boundary staat hier:
$body .="Opmerking: $opmerking\n";
//boundary
$body.= "--".bound."\r\n";

Het /n en /r/n verhaal heb ik aangepast,

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Matthijs1982 schreef op maandag 12 februari 2007 @ 22:17:
De end boundary staat hier:
$body .="Opmerking: $opmerking\n";
//boundary
$body.= "--".bound."\r\n";

Het /n en /r/n verhaal heb ik aangepast,
dat is niet de end boundary.

stel in de header definieer je $boundary als "mijn-boundary" dan ziet de body structuur er zo uit:
code:
1
2
3
4
5
6
7
8
--mijnboundary\r\n
<mime header 1>\r\n\r\n
deel 1
\r\n
--mijnboundary\r\n
<mime header 2>\r\n\r\n
deel2\r\n
--mijnboundary--\r\n   <----- end boundary


Oh, en mischien overbodig, maar met de body bedoel ik alles na de rfc822 header. De mime headers zijn dus onderdeel van de body.

[ Voor 11% gewijzigd door stekkel op 12-02-2007 22:24 ]


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ik heb nu een boundary hier toegevoegd, maar krijg nu twee text bestanden bij mijn email.
Een met de bovenstaande melding en een met mijn email.

Verder staat er in de email zelf dit:
Content-Type: text/plain; charset=iso-8859-1

Content-Transfer-Encoding: 7bit

PHP:
1
2
3
4
5
6
7
8
                //boundary
                $body.= "--".bound."\r\n";
                //content type + charater set (iso in dit geval)
                $body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
                //codering (7 bit)
                $body.= "Content-Transfer-Encoding: 7bit\r\n";
                $body.= "--".bound."\r\n";
                //het bericht

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

1. Wil je graag precies weten hoe een mailtje in elkaar moet steken. Hobby verder.
2. Wil je op een makkelijke en nette manier mail versturen? -> http://www.phpguru.org/static/mime.mail.html (voorbeelden bijgesloten)

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Matthijs1982 schreef op maandag 12 februari 2007 @ 22:36:
Ik heb nu een boundary hier toegevoegd, maar krijg nu twee text bestanden bij mijn email.
Een met de bovenstaande melding en een met mijn email.

Verder staat er in de email zelf dit:
Content-Type: text/plain; charset=iso-8859-1

Content-Transfer-Encoding: 7bit

PHP:
1
2
3
4
5
6
7
8
                //boundary
                $body.= "--".bound."\r\n";
                //content type + charater set (iso in dit geval)
                $body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
                //codering (7 bit)
                $body.= "Content-Transfer-Encoding: 7bit\r\n";
                $body.= "--".bound."\r\n";
                //het bericht
das dus niet goed.
Met deel 1 en deel 2 bedoelde ik "het bericht" of de attachment.
Je hebt nog steeds geen end boundary toegevoegd en je hebt een boundary na de mime header toegevoegd wat er voor zorgt dat je nu 2 bijlagen hebt.

edit:

Als je voor optie 1 gaat van brakkie dan zul je toch echt de relevante rfc's (rfc2822, rfc2045-2049) moeten lezen. Daar staat precies in hoe mail werkt.
Zo niet, stoppen met pielen en voor optie 2 gaan. Er is namelijk niks slechters dan mail dat geen standaarden volgt.

[ Voor 12% gewijzigd door stekkel op 12-02-2007 22:52 ]


Acties:
  • 0 Henk 'm!

  • Upsal
  • Registratie: Mei 2005
  • Laatst online: 27-08-2024
Gezien de complexiteit van je code is het misschien handig om bestaande klasses te gebruiken zoals PHPMailer.
Tevens zou je je testcase kunnen versimpelen door gebruik te maken van een bestand dat al reeds op de server staat, i.p.v. een geupload bestand.

[ Voor 32% gewijzigd door Upsal op 12-02-2007 22:54 ]


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Dit script werkt wel bij mijn provider, maar niet bij de provider waar ik deze website neer zet.
Ik denk dat het dus aan de instellingen van php ligt bij die provider dat het niet werkt.
Heeft iemand misschien een idee hoe dit kan?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Matthijs1982 schreef op dinsdag 13 februari 2007 @ 00:13:
Heeft iemand misschien een idee hoe dit kan?
Heel veel mensen hebben een idee hoe dat kan ;)
Dit is echt al 1001 keer aan de orde geweest, je maakt me niet wijs dat je daar niets tussen kunt vinden.

Daarnaast kun je eens in de mail logs spitten, controleren of je email voldoet aan de voorgenoemde RFC's (zo te zien niet) en kijken wat voor antwoord je van de SMTP server krijgt (als mail bijv. niet aan komt).

Het probleem zit 'm in je end-boundary, welke dient te eindigen op "--jeboundary--". Daar ben je al op gewezen en dat is ook te vinden in de RFC's.
From: Nathaniel Borenstein <nsb@bellcore.com>
To: Ned Freed <ned@innosoft.com>
Date: Sun, 21 Mar 1993 23:56:48 -0800 (PST)
Subject: Sample message
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="simple boundary"

This is the preamble. It is to be ignored, though it
is a handy place for composition agents to include an
explanatory note to non-MIME conformant readers.

--simple boundary

This is implicitly typed plain US-ASCII text.
It does NOT end with a linebreak.

--simple boundary--

This is the epilogue. It is also to be ignored.
Overigens is het in PRG niet de bedoeling dat we support gaan zitten geven op scripts van derden. Dan hebben we liever dat je even contact op neemt met de maker ;)

[ Voor 74% gewijzigd door RobIII op 13-02-2007 01:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1