Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] mail() z załącznikiem
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
janekpogwad
Witam,
przeszukałem już chyba cały internet i jakoś nie mogę sobie poradzić z takim problemem.

Chciałbym utworzyć formularz, za pomocą którego można by było dodać załącznik (już nie chodzi mi o automatyczny dobór MIME; wystarczy image/jpeg), który wysłałby się jako e-mail. Nie chce, żeby ów załącznik najpierw zapisywał się na dysku, a później z niego się wysyłał. Chciałbym coś w stylu jakiego tmp.

Jakieś pomysły?

Z góry dziękuję
dr_bonzo
Plik z formularza musisz zuploadowac na serwer. W PHP, podczas uploadu, on sie na nim ZAWSZE ZAPISZE na dysku.
Potem mozesz go skasowac.
janekpogwad
OK. Ale jak w nagłówkach "wpisać" ten załącznik. Wiem, że trzeba go zakodować w base64, ale jak to zapisać w headerach?questionmark.gif
dantes
  1. <?php
  2. class m_Mail {
  3. var $to;
  4. var $subject;
  5. var $content;
  6. var $headers;
  7. var $marker;
  8. var $type;
  9. var $xMailer = "xMailer";
  10.  
  11. function eMail($type = "1", $from, $replyto)
  12. {
  13. $this->type = $type;
  14. $this->headers .= "From: " . $from . "\n";
  15. $this->headers .= "Reply-to: " . $replyto . "\n";
  16. $this->headers .= "X-Mailer: " . $this->xMailer . "\n";
  17. $this->headers .= "MIME-Version: 1.0\n";
  18. if ($type == 1) {
  19. $this->headers .= "Content-Type: text/html; charset=utf-8\n";
  20. } else {
  21. srand((double)microtime() * 1000000);
  22. $this->marker = md5(uniqid(rand()));
  23. $this->headers .= "Content-Type: multipart/mixed;\n";
  24. $this->headers .= "\tboundary=\"___" . $this->marker . "==\"\n\n";
  25. $this->content = "--___" . $this->marker . "==\n";
  26. $this->content .= "Content-Type: text/html; charset=\"utf-8\"\n";
  27. $this->content .= "Content-Transfer-Encoding: 8bit\n\n";
  28. }
  29. }
  30.  
  31. function eMailAttachment($mimeType, $fileName, $data)
  32. {
  33. if ($this->type != 1) {
  34. $this->content .= "\n\n--___" . $this->marker . "==\n";
  35. $this->content .= "Content-Type: " . $mimeType . "; name=\"" . $fileName . "\"\n";
  36. $this->content .= "Content-Transfer-Encoding: base64\n";
  37. $this->content .= "Content-Disposition: attachment; filename=\"" . $fileName . "\"\n\n";
  38. $this->content .= chunk_split(base64_encode($data));
  39. }
  40. }
  41.  
  42. function eMailSend($to)
  43. {
  44. if ($this->type != 1) {
  45. $this->content .= "--___" . $this->marker . "==--\n\n"; // close marker
  46. }
  47. mail ($to, $this->subject, $this->content, $this->headers);
  48. }
  49.  
  50. function eMailContent($subject, $content)
  51. {
  52. $this->subject = $subject;
  53. $this->content .= $content;
  54. }
  55. }
  56.  
  57. ?>


To jest klasa, którą wysyłam maile. Może Ci pomoże.
Autor:
http://www.kocjan.net/publikacje.html?id=5

edit:

chyba, że chodzi Ci o załączenie grafiki inline, bezpośrednio w wiadomości, a nie jako "załącznik" "załącznik". winksmiley.jpg
janekpogwad
Ok. Ale jak to wykorzystać? W czymś takim jestem kompletnie zielony...
vokiel
Do takich celów polecam: phpmailer
dantes
Z pewnością phpMailer ma dużo większe możliwości i jest pewniejszym rozwiązaniem, ale skoro już zacząłem pisać to dokończę smile.gif

  1. $filename = 'jakis_plik.jpg';
  2. $file = file_get_contents($filename);
  3. $mail = new eMail(2,'nadawca@example.com','nadawca_reply_to@example.com'); // typ 2 wysyła maile z załącznikiem, pierwszy adres odp. nagłówkowi From, drugi ReplyTo
  4. $mail->eMailAttachment('image/jpg',$filename,$file); // typ MIME, nazwa pliku, zawartość pliku
  5. $mail->eMailContent('Tytuł emaila','Zawartość np. kod html, doklejana do wiadomości po zakodowanym (w tym wypadku po) załączniku');
  6. $mail->eMailSend('odbiorca@example.com');

vokiel
@dantes wszystko fajnie, ale poczta wysyłana przez zwykłe mail() często nie dochodzi. Pewnym rozwiązaniem jest wysyłanie z autoryzacją SMTP, czego niestety Twoje rozwiązanie nie oferuje.
janekpogwad
No i lipa.

Kod
Fatal error: Class 'eMail' not found in .......


A zrobiłem tam tak:

Kod
$adresat = 'moj-email@onet.pl';

$nick = $_POST['nick'];
$email = $_POST['email'];

$pytanie = $_POST['pytanie'];
$content = "jakas tresc";

$topic = 'jakis temat';

require('klasa_pytanie.php');

$filename = $_FILES['plik']['tmp_name'];
$file = file_get_contents($filename);
$mail = new eMail(2,"$email","$email");
$mail->eMailAttachment('image/jpg',$filename,$file);
$mail->eMailContent("$topic","$content");
$mail->eMailSend("$adresat");


Co teraz? Co źle?
bogdan89
nie znaleziono klasy o nazwie eMail. Nie jest tak trudno przeczytać kilka wyrazów po angielsku.

mam nadzieje, że includujesz plik z klasą, a poza tym, podana wyżej klasa kolegi dantes nazywa się m_Mail, a nie jak sam kolega dantes błędnie napisał: eMail.

no i ja także polecę phpMailer (+ dokumentacje, tutoriale lub jakieś inne artykuły - w google i tu na forum pełno o tym) i wysyłanie poczty za pośrednictwem SMTP, które w phpMailer można bezproblemowo skonfigurować i cieszyć się pocztą dochodzącą i nie trafiającą do SPAMu.
dantes
Racja, mój błąd smile.gif W oryginale było eMail, ja, by zestandaryzować nazwy klas u siebie w libach przerobiłem na m_Mail. Co do SMTP - racja sad.gif
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-2024 Invision Power Services, Inc.