Рейтинг@Mail.ru
 

Шаг 4

HTML и вывод ошибок

Ну вот, письма теперь будут приходить довольно устойчиво и надежно.
Только класс у нас получился какой то корявенький и шаткий. Стоит забыть передать какие нибудь данные и все - забастовка на почте. Сейчас мы его немного подправим, а за одно сделаем возможность форматировать текст письма тегами HTML.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?php

class IRB_Mailer   
{   
    public 
$type 'text/plain';       
    public 
$to;       
    public 
$from;       
    public 
$subject;       
    public 
$message;       
    public 
$errors = array();   

/**  
* Constructor.     
* @param string $message        
* @Establishes a symbol of carrying over of a line and dividers 
*/          
   
public function __construct($message false)   
   {   
      if(
$message)                    
          
$this->message $message;  
      else  
          
$this->errors[] = 'There is no message text';                       
   } 
      
/**  
* Sets message type to HTML.  
* Устанавливает HTML формат сообщения  
* @access public           
* @return void  
*/    
   
public function setHtml()   
   {      
      
$this->type 'text/html';   
   }      
      
/**  
* Adds a "To" address..  
* Устанавливает адрес "Кому"  
* @access public  
* @param string  $to           
* @return void  
*/     
   
public function createTo($to '')   
   {   
      if(empty(
$to))   
          
$this->errors[] = 'There is no addressee';    
      elseif(!
$this->checkEmail($to))  
          
$this->errors[] = 'The e-mail address is not correct';   
       else  
          
$this->to $to;  
   }  
      
/**  
* Adds a "From" address.  
* Устанавливает адрес "От кого"  
* @access public  
* @param string  $from           
* @return void  
*/     
   
public function createFrom($from false)   
   {   
      if(
$from)      
          
$this->from trim(preg_replace('/[\r\n]+/'' '$from));   
      else   
          
$this->errors[] = 'There is no sender';         
   }       
      
/**  
* Adds a Subject.  
* Устанавливает тему сообщения  
* @access public  
* @param string  $subject           
* @return void  
*/      
   
public function createSubject($subject false)   
   {   
      if(
$subject)   
          
$this->subject '=?utf-8?b?'base64_encode($subject) .'?=';   
      else   
          
$this->errors[] = 'There is no theme';         
   } 
      
/**  
* Method of formation of headings 
* Метод формирования заголовков  
* @access public  
* @param string  $subject           
* @return void  
*/            
   
private function createHeader()   
   {   
   
    $header "Content-type: text/plain; charset=\"utf-8\"\r\n"
   
    $header .= "From: "$this->from ." <"$this->from ."> \r\n" 
   
    $header .= "MIME-Version: 1.0\r\n"
   
    $header .= "Date: "date('D, d M Y h:i:s O') ."\r\n";       
       return 
$header;   
   } 
     
/**  
* Deduces a script error.  
* Проверка корректности электронного адреса  
* @param string  $to      
* @access private     
* @return string or boolean  
*/        
   
private function checkEmail($to)   
   {   
       if (
function_exists("filter_var"))  
           return 
filter_var($toFILTER_VALIDATE_EMAIL); 
       else 
           return 
preg_match("/^[a-z0-9_\.-]+@([a-z0-9]+\.)+[a-z]{2,4}$/i"$to); 
   }     
     
     
/**  
* Deduces a script error.  
* Диагностика ошибок      
* @access private     
* @return string or boolean  
*/       
   
private function checkData()   
   {   
      if(
count($this->errors))    
          return 
implode(PHP_EOL$this->errors);   
      else   
          return 
false;     
   }        
        
/**  
* Sends mail using the PHP mail() function.  
* Отправляет письмо используя PHP функцию  mail()     
* @access public     
* @return string   
*/     
   
public function sendMail()   
   {            
         
$error $this->checkData();   
            
         if(!
$error)   
         {   
            
$header $this->createHeader();   
            
            if(!
mail($this->to$this->subject$this->message$header'-f'$this->from))   
                return 
'Letter sending is impossible';   
            else   
                return 
NULL;   
        }   
        else   
        {   
            return 
$error;   
        }   
   }     


   
////////////////////////////////////////////////////////////////////////////// 
    
$to 'email@mail.ru';       
    
$subject 'Табе пакет';   
    
$from 'email@yandex.ru';       
    
$message '<h1 style="color:blue">Вот такое вот письмо</h1>';   

       
    
$mail = new IRB_Mailer($message);   
    
$mail -> setHtml();   
    
$mail -> createTo($to);   
    
$mail -> createFrom($from);   
    
$mail -> createSubject($subject);   
    
$error $mail -> sendMail();   
    echo  
nl2br($error);
Значит так. Теперь мы текст сообщения будем передавать не в метод sendMail() , а непосредственно в класс.

Что касается типа письма. Мы добавили метод, который изменяет переменную $this->type с установленного по умолчанию 'text/plain' на 'text/html', а саму переменную подставили в заголовок. Теперь если вызвать метод setHtml(), то формат письма установится HTML. А если не вызывать, то останется простым текстовым. Не советуем увлекаться разметкой в письмах, некоторые клиенты режут теги и красота может обернуться боком.

А что касаемо ошибок - не сложно догадаться. Мы собрали в массив ошибки из методов и запустили функцию проверки их наличия. А за одно запустили метод генерации заголовков, что бы не вытаскивать его наружу.

Нужно отметить еще, что появился новый метод (checkEmail()) проверки корректности электронного адреса. Проверяет он функцией filter_var() с ссответствующим флагом. Но так, как функция эта довольно новая, лучше подстраховаться и в случае её отсутствия проверить хотя бы простенькой регуляркой.

Теперь, если каких то данных не будет хватать, метод sendMail() вернет ошибку. А письмо не отправит.

Ну вот теперь совсем все красиво. Или не всё? Ведь не все почтовые клиенты поддерживают HTML. И лучше иметь резервную текстовую копию, что бы письмо отображалось корректно. Вот это мы сейчас и сделаем.