Dilettáns vagyok, de megtalált a feladat: HTML form-ból kell mailt küldenem. A netről összeollóztam mindenféle mintapéldák alapján, de a mail üres attachmenttel érkezik.
Úgy gondolpm, hogy a path nincsen rendben, de csak tippelek, nem értek a témához- Mit cseszek el?
<?php
$email_to = "xxx@gmail.com";
$email_subject = "subject";
$email_from = 'From: '.$_POST['name_field'].'<'.$_POST['from_field'].'>';
$email_message = $_POST['message_field'];
$filename = $_POST['file_field'];
$file = './'.$filename;
$content = file_get_contents( $_POST['file_field']);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$header = $email_from."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$nmessage = "--".$uid."\r\n";
$nmessage .= "Content-type:text/plain; charset=UTF-8\r\n";
$nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$nmessage .= $email_message."\r\n\r\n";
$nmessage .= "--".$uid."\r\n";
$nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
$nmessage .= "Content-Transfer-Encoding: base64\r\n";
$nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$nmessage .= $content."\r\n\r\n";
$nmessage .= "--".$uid."--";
mail($email_to, $email_subject, $nmessage, $header)
?>
Levelét továbbítottuk.
- 994 megtekintés
Hozzászólások
if(file_exists($_POST['file_field'])) {die('nincs file');}
Valamint dump-old ki a $header és $message tartalmát a mail() helyett.
És használj inkább phpmailer-t.
- A hozzászóláshoz be kell jelentkezni
!file_exists :)
de enélkül is csúnya minden ellenőrzés nélkül a file_get_contents()...
swift mailer?
KoviX
- A hozzászóláshoz be kell jelentkezni
Jaja, persze, if !exists.
Csak gyanús volt hogy nem olvassa be a file-t, és tényleg
- A hozzászóláshoz be kell jelentkezni
Utasítások, függvények puszta létéről nincs fogalmam, vért izzadtam, míg minden másolt vesszőhibámat kiirtottam a példákból és összepasszítottam a példákban különböző neveken szereplő változókat.. Repülőt kell vezetnem kézkönyet lapozgatva. Hogy van ez a dump dolog?
- A hozzászóláshoz be kell jelentkezni
mail() sor után
var_dump($nmessage);
KoviX
- A hozzászóláshoz be kell jelentkezni
Így?
mail($email_to, $email_subject, $nmessage, $header);
var_dump($nmessage);
Ez csak összeszemeteli a küldő displayt:
string(370) "--8db05cc4e961111e6b837d725619dd8a Content-type:text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit ccccccccccccccccccccccccccc --8db05cc4e961111e6b837d725619dd8a Content-Type: application/octet-stream; name="651_2.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="651_2.jpg" --8db05cc4e961111e6b837d725619dd8a--"
Levelét továbbítottuk.
- A hozzászóláshoz be kell jelentkezni
Mindketten a file ellenőrzésre mentetek rá, azt majd bele is kell tenni, de nem az a problémám.
A file létezik, meg is érkezik, de a tartalma empty. Nem tudom, honnan vegyem a scriptben a path-t.
Másik mailer használata meg azért nem ok, mert a teljes hétvégém arra ment, hogy ez valamennyire működjön, most kezdhetném egy másik megközelítéssel. Az életben nem írtam ilyet, fogalmam sincs, mit csinálok, ebben meg csak egy kis hiba van már csak.
- A hozzászóláshoz be kell jelentkezni
Ha ugyanott van ahol a script mondjuk:
dirname(__FILE__)
- A hozzászóláshoz be kell jelentkezni
A filenevet egy HTML form-ban lehet kiválasztani.
File melléklet:
Nem tudom, ez hova olvasódik be. Bocs, de fogalmam sincs az alapokról. Nem tudtam, mibe keveredek.
- A hozzászóláshoz be kell jelentkezni
Akkor nagyon nem jól csinálod. :)
$_FILES lesz a barátod
- A hozzászóláshoz be kell jelentkezni
Így?
mail($email_to, $email_subject, $nmessage, $header, $_FILES);
- A hozzászóláshoz be kell jelentkezni
Nem valahogy így:
if (!$_FILES['file_field']['error'])
{
$name = $_FILES["file_field"]["name"];
$content = chunk_split(base64_encode(file_get_contents($_FILES["file_field"]["tmp_name"])));
}
Ha már a HTML formod olyan amire én gondolok. :)
- A hozzászóláshoz be kell jelentkezni
Honnan a tmp_name ?
- A hozzászóláshoz be kell jelentkezni
Tipp: feltöltöd egy from-mal
- A hozzászóláshoz be kell jelentkezni
Az ideiglenes állomány neve ahogyan a feltöltött fájl tárolásra került a szerveren.
- A hozzászóláshoz be kell jelentkezni
> dirname(__FILE__)
vagy 5.3 óta __DIR__
- A hozzászóláshoz be kell jelentkezni
futtattam a kódod saját vason, mail megjött.
Apple mail, Rainloop webmail, Roundcube szépen megmutatta a szöveget is, a csatolmányt is.
azért mentem rá a fájlellenőrzésre, mert a file_get_contents() nem akad le ha nincs ott a file, simán FALSE-ot ad vissza. Ami stringgé konvertálva ''-lesz. (üres lesz a fájlod)
esetleg izzíts be egy imap klienst és nézd meg mit kapsz.
KoviX
- A hozzászóláshoz be kell jelentkezni
Adott az index.htm ahol file kivalasztható és mellette ott a php, ami elküldené. A file nevet átadja, de a file tartalmát nem. Szóval szerintem az a helyzet, ahogy írod, az alap baj, hogy nem találja file-t - gondolom, a path megadása nem korrekt, én csak egy './'-rel próbálkoztam, de lehet, ez hülyeség.
- A hozzászóláshoz be kell jelentkezni
Az a probléma, hogy az a file ott nem létezik ahonnan te be akarod olvasni, lesz belőle végső soron egy üres string, és azt küldöd el email-ben.
- A hozzászóláshoz be kell jelentkezni
Értem, hogy ezért lesz üres, csak azt nem értem, hol van a file, mit kell útvonalnak adjak?
- A hozzászóláshoz be kell jelentkezni
Szerintem te a böngészőből feltöltött fájlt akarod elküldeni e-mailben, igaz?
Ebben az esetben a $_POST['file_field'] nem jó, a formból feltöltött fájlok adatait a $_FILE tömbben találod. Azon belül is az ideiglenes fájl elérési útjára van szükséged.
- A hozzászóláshoz be kell jelentkezni
Most így állok és továbbra is üres az érkező file. Ezek szerint továbbra sem jó az útvonal. Ln meg továbbra sem értem, mit módosítsak még... Sorry, nagyon nem az én világom.
$email_to = "xxx@gmail.com";
$email_subject = "subject";
$email_from = 'From: '.$_POST['name_field'].'<'.$_POST['from_field'].'>';
$email_message = $_POST['message_field'];
$filename = $_FILE['file_field'];
$content = file_get_contents( $_FILE['file_field']["tmp_name"]);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($filename);
$header = $email_from."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$nmessage = "--".$uid."\r\n";
$nmessage .= "Content-type:text/plain; charset=UTF-8\r\n";
$nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$nmessage .= $email_message."\r\n\r\n";
$nmessage .= "--".$uid."\r\n";
$nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
$nmessage .= "Content-Transfer-Encoding: base64\r\n";
$nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$nmessage .= $content."\r\n\r\n";
$nmessage .= "--".$uid."--";
mail($email_to, $email_subject, $nmessage, $header)
- A hozzászóláshoz be kell jelentkezni
$_FILES lesz az, nem $_FILE...
Egyébként kapcsold be a hibejelzést (ini_set('display_errors', 'on'); és error_reporting(E_ALL)), a megjelenő kisebb raklapnyi hibaüzenet segíteni fog.
És tényleg használj egy PHPmailer-t, sokkal olvashatóbb lesz a kódod.
Ill. nézz rá a filter_input függvényre...
pl.:
$from_address = filter_input(INPUT_POST, 'from_field', FILTER_SANITIZE_EMAIL);
$email_message = filter_input(INPUT_POST, 'message_field', FILTER_DEFAULT);
...
Feltöltött fájlt nem "illik" közvetlenül a tmp_name-ből olvasni, érdemes előtte a move_uploaded_file-al behúzni egy olyan helyre, ahol garantáltan tudsz olvasni (néhány php.ini beállítás letilthatja neked, hogy csak úgy olvasgass a feltöltött fájlok ideiglenes helyről).
BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)
- A hozzászóláshoz be kell jelentkezni
Köszönöm a válaszokat, be kell lássam, ez nekem nem fog menni.
- A hozzászóláshoz be kell jelentkezni
Miért nem?
<?php
/* Nem vagyok programozó, és nélkülöz bármifajta ellenőrzést de majd beleteszi */
if (!isset($_POST["emailsuxx"]))
{
// Ez a FORM
?>
<form method="POST" name="emailsuxx" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
<label for='name'>Name: </label><input type="text" name="name_field" ><br/>
<label for='email'>Email: </label><input type="text" name="from_field" ><br/>
<label for='message'>Message:</label><textarea name="message_field"></textarea><br/>
<label>File:</label><input type="file" name="file_field"><br/>
<input type="submit" name="emailsuxx" value="Send">
</form>
<?php
}
else
{
// Ez a TE Kódod:
$email_to = "xxx@gmail.com";
$email_subject = "subject";
$email_from = 'From: '.$_POST['name_field'].'<'.$_POST['from_field'].'>';
$email_message = $_POST['message_field'];
$name = $_FILES['file_field']["name"];
$content = file_get_contents( $_FILES['file_field']["tmp_name"]);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$header = $email_from."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$nmessage = "--".$uid."\r\n";
$nmessage .= "Content-type:text/plain; charset=UTF-8\r\n";
$nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$nmessage .= $email_message."\r\n\r\n";
$nmessage .= "--".$uid."\r\n";
$nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
$nmessage .= "Content-Transfer-Encoding: base64\r\n";
$nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$nmessage .= $content."\r\n\r\n";
$nmessage .= "--".$uid."--";
mail($email_to, $email_subject, $nmessage, $header);
};
?>
- A hozzászóláshoz be kell jelentkezni
Mert dilettáns vagyok :) Biztosan kapott már mindenki olyan púpot a hátára, hogy "Te informatikus vagy, akkor értened kell hozzá". Most épp én vagyok ennek az áldozata. Kapok sok jó szándékú segítséget, de nem tudom, miről beszélnek. Aztán ott van a megoldások ezerféle módja, ami kizárja egymást. Én meg hülyén tapogatok köztük és Murphy garantálja, hogy az egyébként helytálló útmutatásokból garantáltan össze nem férőket válogassak össze.
Köszönöm, hogy vetted a fáradságot, hogy csináltad nekem ezt a mintát, ez működik. Egyetlen pici bibi az, hogy a feltöltött file neve helyett az "1.2 rész" lesz a filename. Lehetne ezt orvosolni?
- A hozzászóláshoz be kell jelentkezni
Ja igen, megvan. Köszönöm még egyszer a segítséget mindenkinek, Neked, gemnon meg külön köszönet a mintáért!
- A hozzászóláshoz be kell jelentkezni