Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][html] Błąd przy przesyłaniu html
Forum PHP.pl > Forum > PHP
Wolfie
Witam

Napisalem sobie taka prostą funkcje do przesyłania maili :

  1. <?php
  2.  
  3.    class SimpleMail {
  4.        public $to = NULL;
  5.        public $cc = NULL;
  6.        public $bcc = NULL;
  7.        public $from = NULL;
  8.        public $subject = '';
  9.        public $body = '';
  10.        public $htmlbody = '';
  11.        public $send_text = TRUE;
  12.        public $send_html = FALSE;
  13.        private $message = '';
  14.        private $headers = '';
  15.        
  16.        public function send ($to = NULL, $subject = NULL, $message = NULL, $headers = NULL) {
  17.            
  18.            if(func_num_args() >= 3) {
  19.                $this->to = $to;
  20.                $this->subject = $subject;
  21.                $this->message = $message;
  22.                if ($headers) {
  23.                    $this->headers = $headers;
  24.                }
  25.            } else {
  26.                if ($this->from) {
  27.                    $this->headers .= 'From: '.$this->from."r\n";
  28.                }
  29.                if ($this->cc) {
  30.                    $this->headers .= 'Cc: '.$this->cc."r\n";
  31.                }
  32.                if ($this->bcc) {
  33.                    $this->headers .= 'Bcc: '.$this->bcc."r\n";
  34.                }
  35.                
  36.                if ($this->send_text and !$this->send_html) {
  37.                    $this->message = $this->body;
  38.                } elseif ($this->send_html and !$this->send_text) {
  39.                    $this->message = $this->htmlbody;
  40.                    $this->headers .= "MIME-Version: 1.0r\n";
  41.                    $this->headers .= 'Content-Type: text/html; charset="utf-8"'."r\n";
  42.                } else {
  43.                    $_boundary = '==MP_Bound_xyccr948x==';
  44.                    $this->headers = 'MIME-Version: 1.0'."r\n";
  45.                    $this->headers = 'Content-type: multipart/alternative; boundary='.$_boundary."r\n";
  46.                    
  47.                    $this->message = 'Jest to komunikat wieloczęściowy w formacie MIME\n';
  48.                    $this->message .= "--$_boundary\n";
  49.                    $this->message .= 'Content-Type: text/plain; charset="utf-8"'."\n";
  50.                    $this->message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
  51.                    $this->message .= $this->body."\n";
  52.                    $this->message .= "--$_boundary\n";
  53.                    $this->message .= 'Content-Type: text/html; charset="utf-8'."\n";
  54.                    $this->message .= 'Content-Transfer-Encoding: 8bit\n\n';
  55.                    $this->message .= $this->htmlbody."\n";
  56.                    $this->message .= "--$_boundary--";
  57.                }
  58.            }
  59.            
  60.            if (!mail($this->to, $this->subject, $this->message, $this->headers)) {
  61.                throw new Exception('Nieudane wysłanie listu email.');
  62.                return FALSE;
  63.            } else {
  64.                return TRUE;
  65.            }
  66.        }
  67.    }
  68. ?>


A nastepnie kruciótki skrypt aby przetestowac poprawnosć działania
  1. <?php
  2.  
  3.    require 'class.SimpleMail.php';
  4.    
  5.    $postcard = new SimpleMail();
  6.    
  7.    $postcard->to = "matewilk@gmail.com";
  8.    $postcard->subject = "Testowanie poczty z uzyciem html";
  9.    $postcard->body = "Test z użyciem tekstu HTML!";
  10.    $postcard->send_html = TRUE;
  11.    $postcard->send_text = FALSE;
  12.    
  13.    if($postcard->send()) {
  14.        echo "Udane wysłanie listu html!";
  15.    }
  16. ?>


Niestety gdy sprawdzam maila nie dochodzi wogole html tylko pusta wiadomość z tytułem, gdy uzywam skryptu do przesyłania tylko plain text wszystko jest ok, bład wystepuje przy przesylaniu html, mniemam ze bład jest gdzies w klasie SimpleMail tylko nie mam pojecia gdzie.....
maly_swd
byc moze masz tu blad:
Jest:
  1. <?php
  2. $this->headers .= 'Content-Type: text/html; charset="utf-8"'."r\n";
  3. ?>

powinno byc:
  1. <?php
  2. $this->headers .= 'Content-Type: text/html; charset=utf-8'."r\n";
  3. ?>
Wolfie
Racja byl tam błąd ale po poprawieniu nic to nie dalo.......

Mecze sie z tym od kilku dni, probowalem zamieniac \r\n tylko \n , kodowanie i inne cuda ale nic to nie dalo, jakies pomysly ?

-----------------------------------------------------------------------

Ok znalazlem błąd ktory tkwil w wywolaniu zmiennej, zamiast
  1. <?php
  2. $postcard->body = "Test z użyciem tekstu HTML!";
  3. ?>


Powinno byc
  1. <?php
  2. $postcard->htmlbody = "Test z użyciem tekstu HTML!";
  3. ?>


Pozdrawiam

---------------------------------------------------------
Niestety pojawil sie kolejny problem :

gdy chce wysłać list skladajacy sie zarówno ze zwykłego tekstu oraz tekstu html znowu dostaje pusta wiadomość

A oto skrypt :
  1. <?php
  2.  
  3.    require 'class.SimpleMail.php';
  4.    
  5.    $postcard = new SimpleMail();
  6.    
  7.    $postcard->to = "matewilk@gmail.com";
  8.    $postcard->from = "matewilk@gmail.com";
  9.    $postcard->cc = "matewilk@gmail.com";
  10.    $postcard->bcc = "matewilk@gmail.com";
  11.    $postcard->subject = "Testowanie poczty z uzyciem listu wieloczęściowego";
  12.    $postcard->body = "To czystotekstowy fragment listu";
  13.    $postcard->htmlbody = "<h1>Test z użyciem tekstu HTML!</h1>";
  14.    $postcard->send_html = TRUE;
  15.    
  16.    if($postcard->send()) {
  17.        echo "Udane wysłanie listu html!";
  18.    }
  19. ?>


Gdy patrze w źrodło maila jest tylko sam tytul bez wiadomosci....

Czy ktos ma pomysl jak to naprawic ?
maly_swd
a jest mozliwe wyslanie czegos takiego?
Mi sie wydaje ze albo wysylasz text albo html smile.gif Jak sie myle to prosze o linka do dokumentacji:)
Wolfie
Mysle ze jest mozliwe bo wlasnie przerabiam ksiazke pod tytulem : "PHP5, Apache i MySQL od podstaw" no i ten kod jest zaczerpniety z tej wlasnie ksiazki wiec mysle ze autorzy by nie popełnili takiego błedu sadzac po przeczytaniu ich krotkiego zyciorysu zawarego w ksiazce.

Poza tym jest takze przyklad w dokumantacji funkcji mail()

NIe wiem jak sie odsyla do dokladnej linijki za pomoca linku ale w przykładach implementacji funkcji mail() jest to wyraznie napisane, tytuł przykładu to Geoff in Montreal 01-May-2007 10:07

Wiec uwazam ze jest to jak najbardziej mozliwe smile.gif

---------------------
juz wiem jak sie odsyla do dokladnego przykladu zapraszam tutaj :
Przykład

---------------------------------
Tylko dlaczego przychodzi mi pusty mail ?
maly_swd
ten przyklad z php.net dziala, Ale i tak wyswietla w htmlu (poniewaz ten sposob to alternatywa dla czytnikow, jak ma wyswietlac w txt to bierze z txt a jak w html to html;)

w Twoim przykladzie sa bledy, powinno byc tak..
ale nie chce mi sie sprawdzac dokladnie, sprawdz sam z php.net -tamto dziala

  1. <?php
  2. $this->headers = 'MIME-Version: 1.0'."r\n";
  3.                   $this->headers = 'Content-type: multipart/alternative; boundary='.$_boundary."\n";
  4.                  
  5.                   $this->message = 'Jest to komunikat wieloczęściowy w formacie MIME\n';
  6.                   $this->message .= "--$_boundary\n";
  7.                   $this->message .= 'Content-Type: text/plain; charset=utf-8'."\n";
  8.                   $this->message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
  9.                   $this->message .= $this->body."\n";
  10.                   $this->message .= "--$_boundary\n";
  11.                   $this->message .= 'Content-Type: text/html; charset="utf-8'."\n";
  12.                   $this->message .= 'Content-Transfer-Encoding: 8bit\n\n';
  13.                   $this->message .= $this->htmlbody."\n";
  14.                   $this->message .= "--$_boundary--";
  15. ?>
Wolfie
Po Twojej poprawce doszedl mi mail z załącznikiem o nieokreslonym formacie

Otworzyłem załącznik a w srodu znajdowało sie to :

Cytat
Jest to komunikat wieloczęściowy w formacie MIME\n--
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

To czystotekstowy fragment listu
--
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit\n\n<h1>Test z użyciem tekstu HTML!</h1>
----


Czyli cos sie poprawilo ale nie tak jak powinno winksmiley.jpg

---------------------------------------------------------------
A bylo to spowodowane bo przez przypadek skasowalem zmienna $_boundary

Teraz razem ze zmienna ciagle dochodzi pusta wiadomość

Zreszta tak jak mowilem testowalem juz rozne wartianty jesli chodzi o znaczniki \n\n, \r\n itp itd i nic to nie dalo
Moze jakies inne pomysly ?
maly_swd
nie kazdy czytnik (program pocztowy) obsluguje tego typu zabiegi:)

np outlook (pelen, nie expres). Wyswietla mi taka wiadomosc w HTMLu i nie mam alternatywnego (tzn zalacznik lub cos w ten desen).
Wolfie
Czyli u Ciebie ten kod dziala poprawnie ?
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.