Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mail z załącznikiem
1maciek
post
Post #1





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 12.10.2004

Ostrzeżenie: (10%)
X----


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.

Ten post edytował 1maciek 16.11.2006, 15:52:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
1maciek
post
Post #3





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 12.10.2004

Ostrzeżenie: (10%)
X----


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

Ten post edytował 1maciek 16.11.2006, 12:45:17
Go to the top of the page
+Quote Post
mysz0n
post
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 1
Dołączył: 16.08.2006
Skąd: szy-ły

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
1maciek
post
Post #5





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 12.10.2004

Ostrzeżenie: (10%)
X----


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

Ten post edytował 1maciek 17.11.2006, 10:56:26
Go to the top of the page
+Quote Post
mysz0n
post
Post #6





Grupa: Zarejestrowani
Postów: 78
Pomógł: 1
Dołączył: 16.08.2006
Skąd: szy-ły

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
thornag
post
Post #7





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mysz0n
post
Post #8





Grupa: Zarejestrowani
Postów: 78
Pomógł: 1
Dołączył: 16.08.2006
Skąd: szy-ły

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 15:12