Анимация
JavaScript


Главная  Библионтека 

0 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 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

Одно из самых мощных средств PHP - возможность автоматической посылки писем по электронной почте, минуя использование внешних программ и утилит. Функция отсылки встроена в PHP. С нее мы и начнем.


Функция отправки письма

bool mail(string $to, string $subject, string $msg [,string $headers])

Функция mail() посылает сообщение с телом $msg (это может быть "многострочная строка", т. е. переменная, содержащая несколько строк, разделенных символом перевода строки) по адресу $to. Можно задать сразу нескольких получателей, разделив их адреса пробелами в параметре $to. Пример:

mail("rasmus@lerdorf.on.ca ca.ok@oklab.ru, "My Subject", "Line 1\nLine 2\nLine 3"

В случае, если указан четвертый параметр, переданная в нем строка вставляется между концом стандартных почтовых заголовков (таких как To, Content-type и т. д.) и началом текста письма. Обычно этот параметр используется для задания дополнительных заголовков письма. Пример:

mail("ssb@guardian.no dk@dizain.ru", "the subject", "Line 1\nLine 2\nLine 3", "From: webmaster@$SERVER NAME\n". "Reply-To: webmaster@$SERVER NAME\n". "X-Mailer: PHP/" . phpversion()

Необходимо добавить, что этот пример довольно-таки неказист. Гораздо лучше было бы включить указанные заголовки прямо в тело письма $msg (в начало тела), отделив их от самого письма пустой строкой (прямо как в стандарте HTTP). То же самое применимо и к параметру $subject: лучше задавать в нем всегда пустую строку и ука-

Посылка писем через PHP



зывать заголовок Subject в самом письме. Всегда старайтесь поступать таким образом. Далее будет ясно, зачем.

Проблема с кодировками

Думаю, не надо напоминать, что русских кодировок существует великое множество. Поэтому от того, насколько умело вы перекодируете письмо перед его отсылкой, зависит, прочтет ли его получатель или, махнув рукой, отправит в корзину, даже не попытавшись установить в своем почтовом клиенте нужную кодировку. Эта глава как раз и призвана раз и навсегда решить проблему кодировок. Если вы воспользуетесь советами, изложенными в ней, ваши письма всегда будут читаемыми.

Посылка в указанной кодировке

Сначала давайте договоримся об одном соглашении: функции mail() передавать только адрес получателя и текст письма. Ни заголовков, ни темы - и то и другое должно присутствовать в самом письме. Например:

$message=

"From: Лист расс1лки To: Иванов Иван Иванович Subject: Пробная расс1лка

Content-type: text/plain; charset=windows-1825

Уважаем1й товарищ! Это письмо послано почтов1м роботом. Всего хорошего!";

Mail("ivanov@ivan.ivanovich.ru","",$message);

Обратите внимание на заголовок Content-type (в некоторых системах он обязательно должен стоять последним - проверьте это экспериментально). Он задает, что, во-первых, письмо доставляется как простой текст (text/plain), а во-вторых, что его кодировка - Windows. Теперь письмо всегда можно будет прочитать, даже если почтовая программа клиента по умолчанию настроена на китайскую кодировку.

Примечание

И почему некоторые программы так не делают, а посылают письма без указания их кодировки? Неужели им жалко лишнего десятка байтов для названия кодировки?

Обратите внимание на то, что тело письма отделяется от заголовков пустой строкой, с тем, чтобы почтовая программа могла понять, где кончаются заголовки и начинается тело.



Глава 20. Посылка писем через PHP 287

Динамическая смена кодировки

Приведенное в предхдущем примере письмо можно будет прочитать в 90% существующих почтовых программ. Для "удовлетворения" остальных желательно посылать письма не в Windows-кодировке, а в KOI-8R. Для перекодирования можно воспользоваться уже известной нам функцией convert cyr string(). И, конечно, нужно в Content-type заменить charset на koi8-r. Вот что у нас получится:

$message=

"From: Лист расс1лки

To: Иванов Иван Иванович <ivanov@ivan.ivanovich.ru>

Subject: Пробная расс1лка

Content-type: text/plain; charset=koi8-r

Уважаем1й товарищ! Это письмо послано почтов1м роботом. Всего хорошего!";

$message=convert cyr string($message,"w","k"); Mail("ivanov@ivan.ivanovich.ru","",$message);

Теперь вы понимаете, почему я говорил о том, чтобы все заголовки и Subject находились внутри тела письма? Этим мы достигаем того, что одной командой convert cyr string() перекодируется сразу все письмо, включая поля From, To, Subject и др. Иначе пришлось бы применять эту функцию дополнительно для перекодировки параметров $subject и $headers...

Проблема с заголовками

Есть одна проблема, возникающая при подобном использовании заголовка Content-type . Дело в том, что существуют почтовые программы, которые понимают заголовок Content-type, но не понимают русский текст в поле Subject, если это поле стоит до Content-type. В то же время, другие почтовые клиенты обязывают нас задавать Content-type последним заголовком в списке. Чтобы обойти этот заколдованный круг, проще всего разместить поле Content-type сразу в двух местах - перед первым и после последнего заголовка:

$message=

"Content-type: text/plain; charset=koi8-r From: Лист расс1лки

To: Иванов Иван Иванович <ivanov@ivan.ivanovich.ru>

Subject: Пробная расс1лка

Content-type: text/plain; charset=koi8-r

Уважаем1й товарищ! Это письмо послано почтов1м роботом.

Всего хорошего!";

$message=convert cyr string($message,"w","k"); Mail("ivanov@ivan.ivanovich.ru","",$message);



0 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 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189