14 berichten aan het bekijken - 1 tot 14 (van in totaal 14)
  • Q:
    Bijdrager
    Ruben

    PHP mail script encode GIF niet correct, JPG weer wel…

    Beste OMT-ers. Waarschijnlijk kan ik deze vraag beter neerleggen op een specifiek PHP forum, maar ik hou er niet zo van om ergens een account aan te maken om eenmalig een vraag neer te leggen en aangezien ik hier al bijna 10 jaar lid ben probeer ik het eerst maar eens bij de specialisten op OMT.;-)

    Ik heb een script op mijn server staan dat iedere 24 uur (middels een cron-job) de Garfield cartoon van die dag van ucomics.com plukt, het opslaat in een folder op mijn server en per e-mail naar mij toe stuurt.

    De Garfield cartoons zijn op werkdagen en zaterdag in GIF formaat en op zondag in JPG formaat. Mijn simpele script maakt dat onderscheid ook op basis van weekdag en de betreffende plaatjes worden ook allemaal correct opgeslagen op de server.

    In de mail gaat het echter steevast mis met de GIF plaatjes terwijl JPG gewoon goed binnen komt. Een mail met een JPG bijlage (op zondag) komt gewoon zo binnen…

    …maar een GIF wordt niet als afbeelding gezien maar gewoon als ruwe data (lijkt het) in de e-mail gepropt…

    Ik kan echt niet vinden waar het verschil nu precies zit. Het zal ongetwijfeld met het content-type te maken hebben, maar volgens diverse bronnen is “image/gif” gewoon correct.

    Wie oh wie heeft meer kennis van PHP, mime-types e.d. om mijn script te debuggen? Uiteraard staan in het script op mijn server gewoon mijn werkelijke e-mail adressen.

    <br />
    <?php</p>
    <p>// GARFIELD CARTOON RIPPER<br />
    $year2=date("y");<br />
    $year4=date("Y");<br />
    $month=date("m");<br />
    $day=date("d");<br />
    $weekday=date("w");<br />
    $type="gif";<br />
    if ($weekday==0) $type="jpg";<br />
    $filename="ga$year2$month$day.$type";<br />
    $source = "http://images.ucomics.com/comics/ga/$year4/$filename";<br />
    $destination = "data/media/garfield/$year4/$filename";<br />
    $data = file_get_contents($source);<br />
    $file = fopen($destination, "w+");<br />
    fputs($file, $data);<br />
    fclose($file);</p>
    <p>$to = '[email protected]'; // receipient adress<br />
    $subject = $filename;<br />
    $random_hash = md5(date('r', time()));<br />
    $headers = "From: [email protected]\r\nReply-To: [email protected]";<br />
    $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";<br />
    $attachment = chunk_split(base64_encode(file_get_contents("data/media/garfield/$year4/$filename")));<br />
    ob_start(); //Turn on output buffering<br />
    ?><br />
    --PHP-mixed-<?php echo $random_hash; ?><br />
    Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"</p>
    <p>--PHP-alt-<?php echo $random_hash; ?><br />
    Content-Type: text/plain; charset="iso-8859-1"<br />
    Content-Transfer-Encoding: 7bit</p>
    <p>This is plain text.</p>
    <p>--PHP-alt-<?php echo $random_hash; ?><br />
    Content-Type: text/html; charset="iso-8859-1"<br />
    Content-Transfer-Encoding: 7bit</p>
    <p><p>This is <b>HTML</b></p></p>
    <p>--PHP-alt-<?php echo $random_hash; ?>--</p>
    <p>--PHP-mixed-<?php echo $random_hash; ?><br />
    Content-Type: image/<? echo $type; ?> name="<?php echo $filename; ?>"<br />
    Content-Transfer-Encoding: base64<br />
    Content-Disposition: attachment </p>
    <p><?php echo $attachment; ?><br />
    --PHP-mixed-<?php echo $random_hash; ?>--</p>
    <p><?php<br />
    $message = ob_get_clean();<br />
    //send the email<br />
    $mail_sent = @mail( $to, $subject, $message, $headers );<br />
    // echo $mail_sent ? "Mail sent" : "Mail failed"; </p>
    <p>?><br />
     
    Bijdrager
    Buzzin Hornet

    Idee: maar er altijd een JPG van:

    $im = imagecreatefromstring($data);
    imagejpeg($im, $destination);

    Daarna kun je ook die fopen, fwrite en fclose weghalen. In principe lees je de ruwe data in en schrijf je deze weg als JPG.

    Bijdrager
    Ruben

    Bedankt voor de suggestie Buzzin Hornet. Hoewel het op het eerste gezicht sowieso een slimme optie zou lijken om gewoon één formaat aan te houden wil ik eigenlijk niet van het GIF formaat afstappen alleen maar omdat een script hier niet goed mee lijkt te werken. Ik wil gewoon het formaat aanhouden zoals ze origineel worden aangeleverd.

    De JPG versie van een cartoon kost namelijk meer ruimte dan de GIF versie van dezelfde cartoon in dezelfde kwaliteit. Nu lijken die paar bytes misschien niet zo belangrijk, maar ik heb op deze manier ALLE Garfield cartoons sinds 1978, dat zijn er intussen meer dan 12.500. Deze passen in het huidige formaat nog steeds makkelijk samen op één CD, in JPG formaat niet meer.

    Op mijn server wordt alles gewoon goed opgeslagen, het is gewoon ergens iets in de manier waarop de GIF in een mail wordt ge-encode. De reden waarom de zondag-cartoon in JPG wordt aangeboden heeft waarschijnlijk te maken met de grootte van de cartoon (in aantal pixels). Door de week en zaterdag is de cartoon één strook van 3 kadertjes, op zondag is deze groter (zoals in het screenshot-voorbeeld). Waarschijnlijk wordt op dat punt JPG weer beter i.v.m. bestandsgrootte.

    Bijdrager
    Dr. Maddox

    Quote van het web die ik tegenkwam:

    GIF support was removed from the GD library in Version 1.6, and added back in Version 2.0.28. This function is not available between these versions.

    Geen idee of je er wijzer van wordt. Zo niet dan mag je deze post negeren.

    Bijdrager
    Ruben

    Ik geloof niet dat ik gebruik maak van de GD library in dit script.;-) Het script download een gif/jpg van een server naar mijn server en encode dit vervolgens om het per mail als bijlage te kunnen versturen. Maar bedankt voor het meedenken.:-)

    Bijdrager
    Dr. Maddox

    Ach ja!:lol:

    Bijdrager
    Buzzin Hornet

    Heb je dan al gekeken om gebruik te maken van de phpmailer class. Deze heeft ingebouwde functies om dit voor elkaar te krijgen.

    Bijdrager
    Ruben

    Om eerlijk te zijn heb ik nooit begrepen (lees: de moeite genomen uit te zoeken) hoe ik classes moet gebruiken in PHP. Maar wellicht is het wel een keer de moeite waard. Liefst wil ik gewoon alles in 1 script/bestand houden. Kan dat met classes ook, of moet je die weer aanroepen en eindig je met een aantal verschillende losse bestanden op je server?

    Ik kom bij zoekacties wel regelmatig classes tegen, maar er staat nooit bij hoe je die moet gebruiken of aanroepen en dan hoeft het voor mij al niet meer. Ik geef toe; ik ben lui als iets niet goed duidelijk wordt gemaakt of van zichzelf duidelijk is.;-)

    Bijdrager
    Buzzin Hornet

    Je include die class en daarmee de functionaliteit van dat andere bestand. Daarna voer je commandos uit binnen je eigen script. Dit soort classes zijn vaak zo uitgebreid dat het zonde is om zelf nog een keer het wiel uit te vinden.

    Bijdrager
    Ruben

    Includen lukt nog wel.;-) Ik stop nu ook regelmatig mijn eigen functions in een apart bestandje dat ik vervolgens middels een include toevoeg in de scripts die het nodig hebben. Als ik het goed begrijp is een class dus feitelijk hetzelfde met een ander naampje.

    Ga er hoe dan ook maar eens naar kijken, opnieuw het wiel uitvinden is inderdaad zonde van de tijd. Bedankt voor de tip.

    Bijdrager
    Tim95

    Misschien dit stukje tussen quotes, als ik mij niet vergis geeft date geen INT value terug. Heb je overigens al gekeken naar de ruwe versie van de mail? Dan kun je de headers zien en kijken of het klopt.

    Van

    <br />
    if ($weekday==0) $type="jpg";<br />
     

    Naar

    <br />
    if ($weekday=="0") $type="jpg";<br />
     
    Bijdrager
    Ruben

    Hey Tim, bedankt voor het meedenken, maar dat deel van het script gaat wel goed. Op basis van die vergelijking worden de bestandjes namelijk van uComics geplukt en op mijn server gekopieerd en dat gaat op zich goed. Ik ontvang te hele week GIF bestandjes en op zondagen JPG.

    Aangezien er vandaag toch geen ruk te doen is op het werk denk ik dat ik zo maar eens met die phpmailer class.:-)

    Bijdrager
    Tim95

    Ah, ik zie het, had dat over het hoofd gezien. Wat je ook kunt doen als je je liever niet aan PHPmailer waagt is met HTML werken en het plaatje gewoon via een IMG tag linken naar de server locatie.

    Bijdrager
    Ruben

    Ja, die optie had ik inderdaad ook overwogen, maar het is mijn uiteindelijke bedoeling (zodra alles werkt) om de mail te laten versturen naar mijn Facebook account om op die manier iedere dag automatisch de Garfield cartoon op mijn tijdlijn te plaatsen. En dat werkt helaas alleen als de afbeelding daadwerkelijk als attachment verstuurd wordt.

14 berichten aan het bekijken - 1 tot 14 (van in totaal 14)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.