Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mail z załącznikiem
Forum PHP.pl > Forum > PHP
1maciek
Witam,
Mam pytanie, tak jak w temacie, czy jest możliwe wysłanie maila z załącznikiem bez wcześniejszego uploadowania pliku-załącznika na serwer?
Sytuacja jest taka: jest strona z formularzem kontaktowym gdzie można dołączyć plik-załącznik, dane z formularza są przetwarzane i wysyłany jest mail. Aby dodać załącznik uploadowałem plik na serwer, ale pojawił się problem, gdy załącznik miał więcej niż 2 MB serwer wyrzucał błąd:Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 3266122 bytes) in ***/www/phpmailer/class.smtp.php on line 307
, dodam że wysyłałem maila poprzez bibliotekę phpmailer.

kod skryptu wysyłającego wiadomość

  1. <?php
  2. $form = true;
  3. if(isset($_POST['imienazwisko'])) {
  4.  
  5. $imienazwisko = strip_tags(stripslashes(trim($_POST['imienazwisko'])));
  6. $firma = strip_tags(stripslashes(trim($_POST['firma'])));
  7. $email = strip_tags(stripslashes(trim($_POST['email'])));
  8.  
  9. if(!empty($_FILES['plik']['name'])) {
  10. $pname = $_FILES['plik']['name'];
  11. $pnametmp = $_FILES['plik']['tmp_name'];
  12.  
  13. while(file_exists(TMP_DIR.$pname)) {
  14. $count = rand(1, 99);
  15. $part = explode('.', $pname);
  16. $part[0] .= $count;
  17. $pname = $art[0].'.'.$part[1];
  18.  }
  19. move_uploaded_file($pnametmp, 'tmp/'.$pname); 
  20.  }
  21.  
  22. $tresc = '<b>Imię i nazwisko:</b> $imienazwisko<br>';
  23. $tresc .= '<b>Firma:</b>'.$firma.'<br>';
  24. $tresc .= '<b>E-mail:</b>'.$email.'<br>';
  25.  
  26. $mail = new PHPMailer();
  27.  
  28. $mail->IsSMTP();
  29.  
  30. $mail->From  = '';
  31. $mail->FromName = 'Serwis Remco';
  32. $mail->AddAddress('aaa@aaa.pl');
  33.  
  34. $mail->WordWrap = 50;  
  35. $mail->AddAttachment('tmp/'.$pname);
  36. $mail->IsHTML(true);
  37.  
  38. $mail->Subject = 'temat';
  39. $mail->Body  = $tresc;
  40. $mail->AltBody = $tresc;
  41.  
  42.  
  43. if(!$mail->Send()) $send_error = true;
  44. if(isset($pname)) unlink('tmp/'.$pname);
  45. }
  46. ?>


Ustawienia serwera pozwalają na upload plików do 15 MB, a pamięć na wykonanie skryptu to 10MB.
Może ktoś wie co można z tym zrobić?
Dzięki za pomoc.
mike
Cytat(1maciek @ 16.11.2006, 12:03:21 ) *
Mam pytanie, tak jak w temacie, czy jest możliwe wysłanie maila z załącznikiem bez wcześniejszego uploadowania pliku-załącznika na serwer?

Nie.
Przecież php musi mieć dostęp do pliku aby go przesłać.
A skoro nie ma go na serwerze to nie ma jak go przesłać.
1maciek
wiec jeśli nie, to może jakiś pomysł na rozwiązanie tego problemu (opisanego w pierwszym postcie)
jest może jakaś metoda, która nie zużywa aż tak dużej ilości pamięci, dodam że jeśli formularz jet wysyłany bez załącznika lub z małym załącznikiem, problemu nie ma, wiosek wiec jest taki że to wina uploadu
mysz0n
formularz mam w html-u, a skrypt odbierajacy i wysyłający wygłada tak:

  1. <html>
  2. <head>
  3. <title> Email </title>
  4. </head>
  5. <body>
  6. <?php
  7.  
  8. $to = $_POST['to'];
  9. $from = $_POST['from'];
  10. $subject = $_POST['subject'];
  11. $message = $_POST['message'];
  12.  
  13. $fileatt = $_FILES['fileatt']['tmp_name'];
  14. $fileatt_type = $_FILES['fileatt']['type'];
  15. $fileatt_name = $_FILES['fileatt']['name'];
  16.  
  17. $headers = "From: $from";
  18.  
  19. if (is_uploaded_file($fileatt)) {
  20. // Read the file to be attached ('rb' = read binary)
  21. $file = fopen($fileatt,'rb');
  22. $data = fread($file,filesize($fileatt));
  23. fclose($file);
  24.  
  25. $semi_rand = md5(time());
  26. $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  27.  
  28. $headers .= "nMIME-Version: 1.0n" .
  29. "Content-Type: multipart/mixed;n" .
  30. " boundary="{$mime_boundary}"";
  31.  
  32. $message = "This is a multi-part message in MIME format.nn" .
  33.  "--{$mime_boundary}n" .
  34.  "Content-Type: text/plain; charset="iso-8859-1"n" .
  35.  "Content-Transfer-Encoding: 7bitnn" .
  36.  $message . "nn";
  37.  
  38.  
  39. $data = chunk_split(base64_encode($data));
  40.  
  41. $message .= "--{$mime_boundary}n" .
  42. "Content-Type: {$fileatt_type};n" .
  43. " name="{$fileatt_name}"n" .
  44. //"Content-Disposition: attachment;n" .
  45. //" filename="{$fileatt_name}"n" .
  46. "Content-Transfer-Encoding: base64nn" .
  47. $data . "nn" .
  48. "--{$mime_boundary}--n";
  49. }
  50.  
  51. $ok = @mail($to, $subject, $message, $headers);
  52. if ($ok) {
  53. echo "<p>Mail poszedł bez problemu</p>";
  54. } else {
  55. echo "<p>Sorry! coś jest nie tak!</p>";
  56. }
  57. ?>
  58. </body>
  59. </html>


przed chwilą jeszcze dla sprawdzenia wysłalem sobie maila z 12 megowym załacznikiem - i poszło bez żadnego bólu. zobacz jak to wygląda u Ciebie i daj znac.
1maciek
sprawdzilem i sprawa wyglada tak:
najwiekszy zalacznik jaki udalo mi sie przeslac to 3,5MB
przy 4,5MB pojawia sie blad
Kod
Fatal error: Allowed memory size of 15728640 bytes exhausted (tried to allocate 5929279 bytes) in ***/www/test/mail/mail.php on line 34

tak jak widac pamiec dla skryptow to 15MB
linia 34 w mail.php to
Kod
$data = chunk_split(base64_encode($data));

moj plik - mail.php jest przesuniety wzgledem Twojego pliku o 5 linii do tylu, bo wyrzucilem naglowki html, poza tym odkomentowalem linie 44 i 45 (nr linii wg Twojego skryptu), reszta bez zmian
mysz0n
czyli probowałes na moim skrypcie od poczatku do konca? czy tylko jakas jego część wpakowałes?
wrzuc całość i zobacz - u mnie tak jak pisałem 12 megowy załacznik wysłał sie bez bolu - moze to jakies ograniczenia od strony serwera, a nie od strony skryptu, tzn na bank to wina serwera i ograniczen - bo u mnie działało bez problemu.
thornag
To przeciez zalezy od konfiguracji samego serwera.

W php.ini sa trzy wllasciwosci za to odpowiadajace, max_upload_filesize, max_post_size, i max_memory (nazwy nie sa dokladne nie pamietam teraz). To je musisz ustawic tak, zeby skrypt mogl zajac sie wiekszym plikiem.

Teraz to zalezy gdzie hostujesz strone, jesli wlasny serwer to wal do php.ini i zmien, jesli wykupiony gdzies to skonaktuj sie z adminem i zapytaj jak mozesz takie rzeczy zmieniac. W home.pl o ile sie nie myle wystarczy stworzyc dodatkowy php.ini w katalogu z ktorego strona jest czytana i w nim wlasnie umiescic zmiany. No ale jak mowilem, administrator.
mysz0n
Cytat(thornag @ 18.11.2006, 18:48:32 ) *
W home.pl o ile sie nie myle wystarczy stworzyc dodatkowy php.ini w katalogu z ktorego strona jest czytana i w nim wlasnie umiescic zmiany.


dokładnie - w home.pl jest tak jak piszesz, rozmawiałem ostatnio na czacie pomocy bo tez chciałem cos pozmieniac w php.ini.
dodatkowo nie ma co sie bac ze cos mozna namieszac - jesli cos przestanie działac - usuwasz twoj plik php.ini i wszystko wraca do normy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.