empty attachment

 ( Uhum2004 | 2017. március 20., hétfő - 13:45 )

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.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

!file_exists :)

de enélkül is csúnya minden ellenőrzés nélkül a file_get_contents()...

swift mailer?

KoviX

Jaja, persze, if !exists.
Csak gyanús volt hogy nem olvassa be a file-t, és tényleg

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?

mail() sor után

var_dump($nmessage);

KoviX

Í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.

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.

Ha ugyanott van ahol a script mondjuk:
dirname(__FILE__)

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.

Akkor nagyon nem jól csinálod. :)

$_FILES lesz a barátod

Így?
mail($email_to, $email_subject, $nmessage, $header, $_FILES);

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. :)

Honnan a tmp_name ?

Tipp: feltöltöd egy from-mal

Az ideiglenes állomány neve ahogyan a feltöltött fájl tárolásra került a szerveren.

> dirname(__FILE__)

vagy 5.3 óta __DIR__

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

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.

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.

Értem, hogy ezért lesz üres, csak azt nem értem, hol van a file, mit kell útvonalnak adjak?

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.

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)

$_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)

Köszönöm a válaszokat, be kell lássam, ez nekem nem fog menni.

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);
};
?>

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?

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!