Php mail csatolmány újra!

Php mail csatolmány újra!
2010-12-20T00:28:25+01:00
2010-12-20T20:09:00+01:00
2022-11-20T06:05:39+01:00
ivanyi.almos
Üdv!

Tudom, hogy már volt ilyesmiről szó, de mégis...
Php-val szeretnék levelet küldözni. A koncepció az, hogy a júzer kiválaszt magának néhány fájlt (checkbox-szal listából), majd az(oka)t el tudja küldeni a saját e-mail címére. (Ez a metódus fontos, a szimpla letöltés sajna nem jó).
Bármilyen fajta fájl lehet, tehát már ezen megbukom, hogy mihez mit kell írni Content-Type-nak? Nincs valami univerzális?

Másik, hogy sokat-sokat kísérletezgettem több oldalról összeszedett "ezatuti" megoldásokkal, de a testreszabáskor mindig volt valami gebasz, vagy egy-két e-mail címre nem érkezett meg, stb... (pl freemail)

Az alábbi kóddal küldött e-mail mindig megérkezik:

<?php //define the receiver of the email $to = 'youraddress@example.com'; //define the subject of the email $subject = 'Test email'; //define the message to be sent. Each line should be separated with \n $message = "Hello World!\n\nThis is my first mail."; //define the headers we want passed. Note that they are separated with \r\n $headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com"; //send the email $mail_sent = @mail( $to, $subject, $message, $headers ); //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" echo $mail_sent ? "Mail sent" : "Mail failed"; ?>

De ehhez hogyan tudnék csatolmány(oka)t hozzáfűzni, pláne, ha nem tudom a fájltípusát? Semmi csillivilliség nem kell, csak a csatolmány megérkezése a fontos...

Segítsetek lécc, a google-től már kifolyik a szemem...

szerk: csak annyit még, ha esetleg volna valaki annyira drága, hogy kész kódot ír, kérem, kommentelje, hogy mi mit jelent... Vagy írja meg, hogy hol lehet utánanézni mindennek, ami a mail()-lal és teljeskörű paraméterezésével kapcsolatos...

Bocs a nagy lámaságért.
Mutasd a teljes hozzászólást!
Köszi a további válaszokat.

Nemtom, hogy működhet, de tény, hogy van egy mime_content_type() php függvény. Mondjuk tény, hogy nem működik nálam, "File or path not found 'fajlelerisiut'" warningot ad vissza... Ezt mondjuk nem értem. Ez a függvény a magic.mime fájlból bányászná ki, hogy melyik kiterjesztéshez milyen content-type dukál. Csak ménemmegy?

Mondjuk per pill nem is érdekes, mert végül rájöttem, hogy egyszerűbb a kijelölt fájlokat egy zipbe berámolva elküldeni, így elég csak ahhoz írni a content-type-ot :)

Na és kit illet a pont??? A szkript íróját, vagy aki linkelte?
Mutasd a teljes hozzászólást!

  • Kösz a választ.

    Ezt is nézegettem már. Most kipróbáltam, hogy kiszedtem belőle a képek felsorolását, fájltípus-kezeléseket, beírtam content-type-nak, hogy text/plain, oszt most így megy. Csak fogalmam sincs, hogy mitől.
    :)

    <?php $EmailToName="Hufnáger Pista"; $EmailToEmail="xxxxxxxxxx@indamail.hu"; $EmailFromName="xxxxxxxxxx"; $EmailFromEmail="xxxxxxxxxx@gmail.com"; $EmailTargy="Micu féle levelezés"; $cegDomain="www.xxxxxxxxxx.hu"; $fajlok = array( "letoltesek/faer.wsg", "letoltesek/htre.wsg", "letoltesek/poiz.wsg", "letoltesek/nemmult.jpg", ); //---separator & boundary: $separator = "\n"; list($x, $y) = explode(" ", microtime()); $boundary = "boundary--".$y.substr($x, 2); //---fejrészek létrehozása: $EmailFejlec = ""; $EmailFejlec .= "MIME-Version: 1.0".$separator; $EmailFejlec .= "Content-type: multipart/mixed; boundary="".$boundary.""".$separator; $EmailFejlec .= "From: ".$EmailFromName." <".$EmailFromEmail.">".$separator.$separator; //---Üzenet megnyitása: $boundary = "--".$boundary; $EmailUzenet = ""; //---Szövegrész az üzenetben: $EmailUzenet .= $boundary.$separator."Content-Type: text/html; charset=iso-8859-2".$separator.$separator; $EmailUzenet .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">".$separator; $EmailUzenet .= "<html>".$separator; $EmailUzenet .= "<body>Mellékelek".$separator; $EmailUzenet .= "</body>".$separator; $EmailUzenet .= "</html>".$separator.$separator; //---Filerészek az üzenetben: foreach ($fajlok as $fajl) { $EmailUzenet .= $boundary.$separator; $EmailUzenet .= "Content-Type: text/plain".$separator; $EmailUzenet .= "Content-Transfer-Encoding: base64".$separator; $EmailUzenet .= "Content-Disposition: attachment; filename="".$fajl.""".$separator.$separator; $f = fopen($fajl, "r"); $x = fread($f, filesize($fajl)); fclose($f); $EmailUzenet .= chunk_split(base64_encode($x)).$separator.$separator; } //---címzett: $EmailCimzett = $EmailToName." <".$EmailToEmail.">"; //---mail elküldése: if (mail($EmailCimzett, $EmailTargy, $EmailUzenet, $EmailFejlec)) { echo "OK"; } else { echo "nem"; }; ?>

    A $boundary micsoda, mire köll?
    Mutasd a teljes hozzászólást!
  • A boundary azért kell, hogy az egyes blokkokat (egyes fájlok, levél és fájlok) elválassza egymástól.
    ---
    Aztán te rosszat szedtél ki a kódból:

    Az enyémben van egy ilyen:
    $kepek[0]["file"] = "megjegyzesek.txt"; $kepek[1]["file"] = "program.zip"; $kepek[2]["file"] = "elonezet.jpg";
    Ami helyére kell betenni a tied:
    $kepek[0]["file"] = "letoltesek/faer.wsg"; $kepek[1]["file"] = "letoltesek/htre.wsg"; $kepek[2]["file"] = "letoltesek/poiz.wsg"; $kepek[3]["file"] = "letoltesek/nemmult.jpg";

    És meég egy változtatás kell, mert a "wsg" kiterjesztés nincs alistámban, így kell egy
    case "wsg": $kepek[$i]["type"] = "?????/?????; name="".$kepek[$i]["name"]."""; break;
    Ahol a ?????/????? részt ki kellene töltened valamivel.
    Hogy mivel azt keresgélheted akár itt vagy küldheted
    $kepek[$i]["type"] = "application/octet-stream";
    ággal (akkor nincs teendőd)

    A lényeg, hogy a elején a címzésben változtathatsz, és a switch blokkot max bővítsd!
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ!

    Nem értem, mi a különbség a te $kepek tömböd és az én $fajlok tömböm között azon kívül, hogy a tied több dimenziós és minden elemhez tartozik egy fájlnév, type és size.
    Gyakorlati különbség van, ha minden fájlt "Content-Type=application/octet-stream" fejléccel akarok küldeni? Azt vettem ki az írásodból, hogy az mindenre megfelel... Lehet, hogy rosszul értettem.
    Ha jól látom, a fájlok csatolásánál a különbség csak annyi, hogy én foreach() -et használtam, és ugye nincs hozzárendelve dinamikusan a content-type és a méret a fájlnévhez... Valamint, hogy Content-ID nálam nem szerepel, ezt nem tudtam, hogy micsoda.
    A content-type-ról: Ha nem tudom, hogy milyen kiterjesztésű fájlt fog küldeni a júzer, akkor írjak egy switchet, amiben minden lehetséges verzió benne van? Nincs olyan függvény, ami megmondja? Próbálkoztam mime_content_type()-pal, de valami gáz volt vele...
    Mutasd a teljes hozzászólást!
  • Ha a feltöltött adat nem mondja meg (és nem nagyon szoktak ilyesmire infót tartalmazni), hogy mi a mime típusa, akkor szerinted hogyan várható el egy függvénytől az, hogy a világ összes file típusának mime típusát felismerje a tartalom alapján?

    Gyakorlati különbség van, ha minden fájlt "Content-Type=application/octet-stream" fejléccel akarok küldeni? Azt vettem ki az írásodból, hogy az mindenre megfelel... Lehet, hogy rosszul értettem.


    Ha a levelező kliens a mime típus alapján próbálja meg kitalálni, hogy mi is az illető csatolmány, akkor octet-stream-nál nem fogja tudni megfelelően társítani a file-t. Vírusírtók is használják ezt az infót. De technológiaiag nincs nagy jelentősége.

    A content-id-t meg ne hagyd le, anélkül ne igazán fog működni a dolog!
    Mutasd a teljes hozzászólást!
  • Küldheted mindegyiket ugyan azzal ("application/octet-stream") csak akkor a levelezőprogramok kérdése, hogy hogyan értelmezik.

    Ezért javasoltam, hogy tedd bele switch-elve.

    Ha a "type"-ot nem akarod használni (vagy közvetlenül állítod be), akkor persze elég az egy dimenziós tömb.

    De ha így megy, akkor csak a "
    A $boundary micsoda, mire köll?"
    válaszomat vedd figyelembe

    A Content-ID nálad azért nem érdekes, mert ezzel a módszerrel akár a levélbe is bele lehet ágyazni képeket
    <img src="cid:******">
    és akkor azonnal megjelenik a címzettnél
    Mutasd a teljes hozzászólást!
  • Köszi a további válaszokat.

    Nemtom, hogy működhet, de tény, hogy van egy mime_content_type() php függvény. Mondjuk tény, hogy nem működik nálam, "File or path not found 'fajlelerisiut'" warningot ad vissza... Ezt mondjuk nem értem. Ez a függvény a magic.mime fájlból bányászná ki, hogy melyik kiterjesztéshez milyen content-type dukál. Csak ménemmegy?

    Mondjuk per pill nem is érdekes, mert végül rájöttem, hogy egyszerűbb a kijelölt fájlokat egy zipbe berámolva elküldeni, így elég csak ahhoz írni a content-type-ot :)

    Na és kit illet a pont??? A szkript íróját, vagy aki linkelte?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd