Изпращане на поща със средствата на PHP. Част 1

С такава задача се сблъскват огромно количество разработчици и, като следствие, съществува огромно количество готови решения. Болшинството от тях съдържат различен род грешки, не реализират цялата функционалност или са сложни за употреба. Но най-големият минус - огромна част от разработчиците след написване на клас, отговарящ на неговите лични потребности за момента, никога не се връщат към поддръжка и доработка на изходните кодове.Във връзка с това следващите примери на код ще бъдат базирани на готови решения, взети от PEAR (вградени приложения и модули в PHP).

1. Как да изпратиме писмо със средствата на PHP

Най-простият метод за изпращане на писмо с помоща на PHP - възползуваме се от стандартната функция mail. Тя има следния синтаксис:

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters>)


Задължителни параметри:

E-mail на получателя
Заглавие на писмото
Текст на писмото
Незадължителни параметри:
Допълнително заглавие на писмото
Допълнителни параметри на командният ред
Връщана стойност:
true, ако писмото е получено
false, в противен случай.
Простичък пример:

Ако на екрана Ви се появява грешка "Fatal error: Call to undefined function: mail()", това значи, че или PHP версията е без подръжка на функцията mail, или е изключена при настройките на сървъра. Такава практика напоследък е широко разпространена на безплатните хостингови сървъри. Ако сте се сблъскали с такъв проблем , възползувайте се от възможността за изпращане на писма с помоща на сокети (sockets), детайлно описани в раздела "алтернативни методи за изпращане на писма". В случай, че Вие сте системен администратор, вижте раздела "Как да настроим сървър" и опитайте да отстраните проблема като такъв.

Допълнителните заглавия в писмото (additional headers) могат да се използуват за указване на кодировката на писмото, адреса на изпращача, обратен адрес и много други опции. Они должны быть разделены переводом строк: комбинацией " ". Например:



Преминаваме към по-сложен пример. В предишният скрипт работим във формат text/plain, а сега ще опитаме да изпратиме поща във формат HTML с няколко адресанти и указани кодировки:



Коментари към примера: в началото определяме, до кого е адресирано писмото. Ако получателите са няколко, техните адреси се указват в един ред и се разделят със запетайки. При задание на заглавието и тялото на писмото следете, кодировката, в която действително са написани, да съвпада със заявеният в заглавието charset.

В примера променливата $headers се състои от четири реда: в първите два указваме типа на изпращаното писмо - HTML - и неговата кодировка. В следващите два реда указваме адреса на изпращача и адреса, на който следва да се изпрати скрито копие на писмото.

Един от често възникващите проблеми при изпращане на поща в koi8 - това е формирането на заглавието в писмото. За разрешаването му е необходимо да се възползваме от следния код, който превежда реда в кодировка win-1251 в разбираемия за повечето пощенски клиенти koi8 .

<?php
$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
?>


Например, заглавието "Уведомяване за поща" ще изглежда така

=?koi8-r?B?8M/e1M/Xz8Ug1dfFxM/NzMXOycU=?=


Ако сте извършили всичко правилно, а получателя на писмото не го получава (помнете, че временното задържане на доставяното писмо зависи от много фактори и може да варира от няколко минути до няколко часа), убедете се, че то действително е отправено. Това е необходимо да се извърши в 2 етапа. За начало изпробвайте да изпълните кода:



Ако още на тази стъпка получите грешка, това може да означава, че при Вас или не е задействан sendmail (или друг транспортен агент), или е неправилно настроен, или съществуват грешки в php.ini. Например, в последно време е разпространено правилото да не се приемат писма, в които не е указано правилно заглавието Mail-from.

В случай, че съобщението е прието, опитайте да прегледате файла /var/log/mail или да помолите за това Вашият администратор, защото това изисква да имате правата на суперюзер (root). Може да се извърши с помоща на командата tail /var/log/mail. В случай на успешно отправено писмо в log-файла трябва да се появят редове от типа долу или съобщение за грешка:

Oct 2 00:21:02 l72 sendmail[131]: h91LL1DG000131: to=root, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30225, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (h91LL1g1000134 Message accepted for delivery)
Oct 2 00:21:18 l72 sendmail[137]: h91LL1g1000134: to=, ctladdr= (0/0), delay=00:00:17, xdelay=00:00:16, mailer=local, pri=30774, dsn=2.0.0, stat=Sent


Във всеки случай разгледайте раздела "Как да настроим сървър".

2. Как да изпратим писмо c attachment към него
С такава задача се сблъскват огромно количество разработчици и, като следствие, съществува огромно количество готови решения. Болшинството от тях съдържат различен род грешки, не реализират цялата функционалност или са сложни за употреба. Но най-големият минус - огромна част от разработчиците след написване на клас, отговарящ на неговите лични потребности за момента, никога не се връщат към подръжка и доработка на изходните кодове.

Във връзка с това следващите примери на код ще бъдат базирани на готови решения, взети от PEAR (вградени приложения и модули в PHP). Пакета, който ще бъде използван в примерите, се казва Mail_Mime. Сваляне на последната версия на пакета и получаване на изчерпателна документация е на адрес http://pear.php.net/package/Mail_Mime. Да разгледаме пример на неговото използуване:



Променливата $mime се явява екземпляр на класа Mail_mime. В неговия конструктор предаваме незадължителният параметър, определящ, какъв начин на преместване на редовете ще бъде използуван: " " или " ". Даденият клас е предназначен за формиране тялото и заглавието на отправяното писмо. С помоща на метода setTXTBody определяме текстовата част на писмото. В качеството на параметър метода приема ред или име на файл, който ще бъде използван. Аналогично при помоща на метода setHTMLBody задаваме HTML-версия на писмото.

Да разгледаме метода addAttachment по-подробно.

string $data
Пълен път до прикрепеният файл на сървъра или неговото съдържание. Задължителен параметър.

string $c_type
Със значение в заглавната част Сontent-type, който ще бъде изпратен. Незадължителен параметър, значение по подразбиране - application/octet-stream.

string $name
Име на прикрепеният файл. Ще се използува само, ако първият параметър ($data) се явява съдържащ файла.

boolean $isfile
Определя, представя ли първият параметър пътя към файла. Незадължителен параметър, по подразбиране - true.

string $encoding
Значението на Content-Transfer-Encoding намиращ се в заглавната част е определяне на формата, в който ще бъде изпратено приложението. Незадължителен параметър. Допустимо значения: base64 (използва се за двоични файлове), quoted-printable(използува се за текстови файлове). Значение по подразбиране: base64.

По този начин има два способа за прилагане на дадения метод.

указване на пътя към файла на сървъра:

$mime->addAttachment('/home/user/report.txt', 'text/plain');


2. указване съдържанието на файла (в такъв случай трети и четвърти параметри е необходимо указват принудително):

$mime->addAttachment($contentFile, 'text/plain', 'report.txt', false);


Преминаваме към формиране на заглавната част и тялото на писмото. Всичко това е задължение на екземпляра на класа Mail_mime. За формиране на тялото на писмото се прилага метода get, който в качеството на незадължителен параметър приема асоциативен масив. Ключовете могат да изведат следните значения: text_encoding, html_encoding, 7bit_wrap, text_charset, html_charset. За формиране на заглавната част се използува метода headers. В качеството си на незадължителен параметър приема кеш-масив. За по-детайлно запознаване с допустимите значения на дадения параметър се обърнете към RFC-822.

Извикването на метода get() продължава докато бъде извикан метода headers(). Убедете се, че във Вашият код това условие е спазено.

Самият процес по изпращане на вече сформираното писмо е възложен на класа Mail. В началото е необходимо с помоща на статично извикване на метода factory да се създаде екземпляр на даденият клас. В нашият пример той приема единственият параметър - реда 'mail'. По-детайлно ще се заемем с параметрите и техните значения по-надолу в статията, където се описват алтернативни методи за изпращане на поща.

Процесът по изпращане на поща завършва с извикване на метода send, приемащ в качеството на входящ параметър списъка на адресантите, заглавната част на писмото и неговото тяло.

Проверка за грешки, по време на изпращане на писмото, може да се реализира използувайки следният код:

<?php
$status =$mailer->send('user@your.domain.com', $headers, 'your message');
if (PEAR::isError($status)) {
print("***ERROR");
}
?>


статията продължава във втора част



/ Трябва да сте регистриран за да напишете коментар /