[PHP] Verkeerde bijlage bij mail()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Topicstarter
Ik heb een mail-met-bijlage script geschreven, maar hij werkt niet goed. Ik krijg, in plaats van een door GD Lib gegenereerd plaatje, twee .txt bestanden genaamd Part 1.2 en Part 1.3. Ik heb echt geen idee hoe dit kan, dus mijn vraag of jullie zien waar het fout gaat ?

Heb het al op verschillende emailadressen geprobeerd, allemaal hetzelfde resultaat... Alle ($_POST) variabelen die in de code gebruikt worden bestaan ook

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
if (isset($_POST['email'])) {
    
    $boundary = strtoupper(md5(uniqid(time())));
    
    $headers  = "From: ".$_POST['eigen_naam']." <".$_POST['eigen_email']."> \r\n";
    $headers .= "MIME-version: 1.0\r\n";
    $headers .= "Content-Type: multipart/mixed;\r\n";
    $headers .= "--boundary=".$boundary;
    
    $body  = "This is a multi-part message in MIME format.\r\n";
    $body .= "\r\n";
    $body .= "--".$boundary."\r\n";
    $body .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
    $body .= "Content-Transfer-Encoding: 7bit\r\n";
    $body .= "\r\n";
    
    for ($i = 1; $i <= 3; $i++) {
        
        if (isset($_POST['ontvanger_naam'.$i]) && !empty($_POST['ontvanger_naam'.$i])) {
        
            $bericht = str_replace('{ontvanger}', $_POST['ontvanger_naam'.$i], $_POST['bericht']);
            $bericht = str_replace('{verzender}', $_POST['eigen_naam'], $bericht);
            
            $body .= $bericht."\r\n";
            $body .= "--".$boundary."\r\n";
            $body .= "Content-Type: image/jpeg; name=kaart1.jpg\r\n";
            $body .= "Content-disposition: attachment\r\n";
            $body .= "Content-Transfer-Encoding: base64\r\n";
            $body .= "\n";
            
            if ($open = fopen('kaarten/kaart1.jpg', 'r')) {
                
                $str = fread($open, filesize('kaarten/kaart1.jpg'));
                
                $body = chunk_split(base64_encode($str))."\r\n";
                
                fclose($open);
                
                $body = "--".$boundary."--\r\n";
            }
            
            if (mail($_POST['ontvanger_email'.$i], 'Je hebt een kerstkaart ontvangen', $body, $headers)) {
                
                echo 'Mail succesvol verzonden';
            }           
        }
    }
}


Alvast bedankt,

Scott

Acties:
  • 0 Henk 'm!

Verwijderd

Ik begrijp eigenlijk niet waarom dat bestand dan nog helemaal gecodeerd moet worden. Het bestand is toch goed om te verzenden? Maar goed het zal waarschijnlijk aan mij liggen, zoveel weet ik er niet vanaf.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Je hebt de output van je PHP script al eens bekeken? Ik gok dat je geen lege regel voor en na elke boundary hebt en een lege regel NA de base64 tekst.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Topicstarter
@ Ejay38: Tja, dat weet ik eigenlijk ook niet :P Ik heb en soort tutorial gevolgd, die zei dat het moest.. Maar dat ging om tekstbestanden denk ik, dit is een plaatje..

@ Creepy: Dus je bedoelt te zeggen dat er een regel leeg moet voor en na de boundary, en geen legeregel na de base64_encode ?

[ Voor 31% gewijzigd door Scott op 20-12-2004 16:31 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 20 december 2004 @ 16:26:
Ik begrijp eigenlijk niet waarom dat bestand dan nog helemaal gecodeerd moet worden. Het bestand is toch goed om te verzenden? Maar goed het zal waarschijnlijk aan mij liggen, zoveel weet ik er niet vanaf.
Je kan niet zomaar binaire data mee sturen in een e-mail. Een e-mail bestaat uit platte ascii, dus je zult je attachments moeten encoden (bijv. met base64).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Vergelijk de door jouw php code verstuurde e-mail eens met een door een e-mail programma verstuurde e-mail, via view source. Dan kan je zien of er verschil zit in enters / coderingen etc. etc. (Gebruik dan natuurlijk wel een miniscuul plaatje)

[ Voor 12% gewijzigd door djexplo op 20-12-2004 16:34 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Voorbeeld van script wat wel werkt, verschil met jouw'n script zijn b.v. de boundary's en de \r 's
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
   $picture = "spider.jpg";
   $type = "image/jpg";

   $picture_file = fopen ($picture, "r");

   $un_data = fread ($picture_file, filesize($picture));
   fclose ($picture_file);
   $encode_data = chunk_split (base64_encode($un_data));

   $header = "--Message-Boundary\n";
   $header .= "Content-type: text/plain; charset=US-ASCII\n";
   $header .= "Content-transfer-encoding: 7BIT\n";
   $header .= "Content-description: Mail message body\n\n";
 
   $body = $header;

   $body .= "Your text here HERE\n";
   $body .= "\n\n--Message-Boundary\n";
   $body .= "Content-type: $attach_type; name=\"$picture\"\n";
   $body .= "Content-Transfer-Encoding: BASE64\n";
   $body .= "Content-disposition: attachment; filename=\"$picture\"\n\n";
   $body .= "$encode_data\n";
   $body .= "--Message-Boundary--\n";

    mail("a@hotmail.com", "Your subject", $body, $headers);

[ Voor 39% gewijzigd door djexplo op 20-12-2004 17:11 . Reden: kleurtjes ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Topicstarter
djexplo schreef op maandag 20 december 2004 @ 16:33:
Vergelijk de door jouw php code verstuurde e-mail eens met een door een e-mail programma verstuurde e-mail, via view source. Dan kan je zien of er verschil zit in enters / coderingen etc. etc. (Gebruik dan natuurlijk wel een miniscuul plaatje)
Hé, das wel handig idd. Ik heb dat gedaan, mijn code daar aan aangepast, maar zonder succes.. Ik krijg nu het mailtje, zonder bijlage (terwijl er in Thuinderbird wél staat dat er een bijlage bij zit).. Als ik mn $header zoals-ie nu is ouput, staat er dit (heb de enocoded data maar ff ingekort naar '/9j//8='):


From: Scott
MIME-version: 1.0
Content-Type: multipart/mixed;
boundary="--2478571363B3A6B120266BC25575D37F"
This is a multi-part message in MIME format.
--2478571363B3A6B120266BC25575D37F
Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hoi, ff tekst in de mail hoor :P

--2478571363B3A6B120266BC25575D37F
Content-Type: image/jpeg; name="f1.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;filename="f1.jpg"

/9j//8=

--2478571363B3A6B120266BC25575D37F--

[ Voor 36% gewijzigd door Scott op 20-12-2004 17:37 ]


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Misschien moet je (Content-disposition: ) inline , wijziggen in: attachment

Verder zie ik geen fouten, of het e-mail programma moet hoofdletter gevoelig zijn ...

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Waarom gebruiken jullie niet gewoon phpmailer ? Script staat op sourceforge, even includen in je pagina, en je kunt, heel gemakkelijk, alles doen met je mail wat je wilt:
html/txt , bijlages, cc, dat soort dingen. Dat script heeft al heel wat bug fixes gehad die je anders zelf had moeten vinden. Het is afaik ook webserver onafhankelijk, je hoeft het alleen te includen. Kan met sendmail of rechtstreeks met een SMTP server praten, misschien ook wel met de mail functie van php.

Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Topicstarter
djexplo schreef op dinsdag 21 december 2004 @ 09:49:
Misschien moet je (Content-disposition: ) inline , wijziggen in: attachment

Verder zie ik geen fouten, of het e-mail programma moet hoofdletter gevoelig zijn ...
Nee, helaas, dat is het ook niet.. Wat ik ook zo raar vind, is dat de tekst die in de header staat, niet in de mail staat.. En dat er in Thunderbird vóór het mailsubject een paperclipje staat. Hij ziet dus wel een bijlage, maar kan hem verder niet openen (er wordt niks meegestuurd)

@ pierre-oord: Ik werk liever met mn eigen codes, maar toch bedankt :)

edit:

Ik dacht dat het misschien lag aan het feit dat het plaatje een .jpg is en de header image/jpeg is, maar dat is het ook niet, want als het een .gif is doet-ie het ook niet :'(

edit 2: De code die ik nu heb ook nog maar ff plaatsen, misschien dat daar nog iets verkeerd aan is...

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
if (isset($_POST['email'])) {
    
    $boundary = strtoupper(md5(uniqid(time())));
    
    $headers  = "From: ".$_POST['eigen_naam']." <".$_POST['eigen_email']."> \r\n";
    $headers .= "MIME-version: 1.0\r\n";
    $headers .= "Content-Type: multipart/mixed;\r\n ";
    $headers .= "boundary=\"--".$boundary."\"\r\n";
    $headers .= "This is a multi-part message in MIME format.\r\n";
    $headers .= "--".$boundary."\r\n";
    $headers .= "Content-Type: text/plain; charset=iso-8859-1; format=flowed\r\n";
    $headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    
    for ($i = 1; $i <= 3; $i++) {
        
        if (isset($_POST['ontvanger_naam'.$i]) && !empty($_POST['ontvanger_naam'.$i])) {
        
            $bericht = str_replace('{ontvanger}', $_POST['ontvanger_naam'.$i], $_POST['bericht']);
            $bericht = str_replace('{verzender}', $_POST['eigen_naam'], $bericht);
            
            $bericht = "Hoi, ff tekst in de mail hoor :P";
            
            $headers .= $bericht."\r\n\r\n";
            $headers .= "--".$boundary."\r\n";
            $headers .= "Content-Type: image/gif; name=\"delete.gif\"\r\n";
            $headers .= "Content-Transfer-Encoding: base64\r\n";
            $headers .= "Content-Disposition: attachment; filename=\"delete.gif\"\r\n";
            $headers .= "\n";
            
            if ($open = fopen('../../img/delete.gif', 'r')) {
                
                $str = fread($open, filesize('../../img/delete.gif'));
                
                $headers .= chunk_split(base64_encode($str))."\r\n";
                
                fclose($open);
                
                $headers .= "--".$boundary."--\r\n";
            }
            
            //echo '<pre>';
            //die($headers);
            
            if (mail($_POST['ontvanger_email'.$i], 'Je hebt een kerstkaart ontvangen', '', $headers)) {
                
                echo 'Mail succesvol verzonden';
            }           
        }
    }
}

[ Voor 68% gewijzigd door Scott op 21-12-2004 15:55 ]

Pagina: 1