Оглавление

26. Отправка писем с сайта. Рассылка писем по E-mail-адресам из файла

Отправить письма с сайта позволяет функция mail(). Функция имеет следующий формат:
mail(<E-mail получателя>, <Тема>, <Сообщение>, [<Заголовки>]);
Функция возвращает true, если письмо отправлено. Если PHP работает в режиме Safe Mode, то функция mail() всегда возвращает false, даже если письмо отправлено.
В параметре <Заголовки> обычно указываются следующие заголовки:
□ From — имя и обратный адрес отправителя:
From: Nik <unicross@mail.ru>
□ Content-Type — MIME-тип и кодовая таблица:
Content-Type: text/html; charset=windows-1251

 

Заголовки должны быть разделены комбинацией символов \r\n. Если в тексте заголовков присутствуют русские буквы, то текст следует зашифровать с помощью метода base64 следующим образом:
=?<Кодировка>?B?<Зашифрованный текст>?=
Зашифровать  текст  с  помощью  метода base64  позволяет  функция base64_encode().

$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";


Зашифровать  текст  в  кодировке UTF-8  позволяет  функция mb_encode_mimeheader(). Функция имеет следующий формат:
mb_encode_mimeheader(<Строка>, [<Кодировка>], [<Метод кодирования>], 
                    [<Символ переноса строк>]);
Если параметр <Кодировка> не указан, то используется значение, указанное в функции  mb_internal_encoding(). Как  показывает  практика,  указывать  кодировку  в  функции  mb_internal_encoding()  нужно  обязательно.  Параметр  <Метод  кодирования>  может  принимать  значения  "B" (Base64)  или  "Q"  (Quoted-Printable).  Если  параметр  не  указан,  то  используется  значение  "B".


Параметр <Символ переноса строк> задает символ для разделения строк. По умолчанию предполагается комбинация "\r\n". Пример:

mb_internal_encoding('UTF-8');
$tema = 'Сообщение';
echo mb_encode_mimeheader($tema);
// Выведет: =?UTF-8?B?0KHQvtC+0LHRidC10L3QuNC1?=


Текст  сообщения шифровать необязательно. А  вот кодовую таблицу символов следует указать в заголовке Content-Type. Также следует учитывать, что длина одной строки не должна превышать 70 символов. Строки отделяются друг от друга символом перевода строки (\n).

 

Любое  письмо  может  быть  отправлено  в  виде  обычного  текста (листинг 57), а также в формате HTML (листинг 58). В первом случае указывается MIME-тип text/plain, а во втором — text/html.

 

В качестве примера отправим письмо с подтверждением регистрации.

 
Листинг 57. Пример отправки письма в виде обычного текста

<?php
$msg = "Добрый день!\n\n";
$msg .= "Вы успешно зарегистрированы.\n\n";
$msg .= "http://www.site.ru/\n";
$msg .= "support@site.ru";
$Ot = "Суппорт";
$Ot = "=?windows-1251?B?" . base64_encode($Ot) . "?=";
$header = "Content-Type: text/plain; charset=windows-1251\r\n";
$header .= "From: " . $Ot . " <support@site.ru>";
$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
mail("vasya@mail.ru", $tema, $msg, $header);
?>

 
Отправленное письмо (с заголовками) будет выглядеть следующим образом:
  To: vasya@mail.ru
  Subject: =?windows-1251?B?0e7u4fnl7ejl?=
  Content-Type: text/plain; charset=windows-1251
  From: =?windows-1251?B?0fPv7+7w8g==?= <support@site.ru>
 
  Добрый день!
 
  Вы успешно зарегистрированы.
 
  http://www.site.ru/
  support@site.ru

 

Листинг 58. Пример отправки письма в формате HTML

<?php
$msg = "Добрый день!<br><br>\n";
$msg .= "Вы успешно зарегистрированы.<br><br>\n";
$msg .= "<a href="http://www.site.ru/">http://www.site.ru/</a><br>\n";
$msg .= "support@site.ru";
$Ot = "Суппорт";
$Ot = "=?windows-1251?B?" . base64_encode($Ot) . "?=";
$header = "Content-Type: text/html; charset=windows-1251\r\n";
$header .= "From: " . $Ot . " <support@site.ru>";
$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
mail("vasya@mail.ru", $tema, $msg, $header);
?>

 

При изучении работы с файлами мы создали файл file.txt со списком рассылки и механизм  работы  с ним  (см.  разд. 25.4). Теперь  рассмотрим  возможность рассылки писем по E-mail-адресам из этого файла (листинг 59).

 
Листинг 59. Рассылка писем

<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="hidden" name="send" value="1">
<input type="submit" value="Разослать">
</form>
<?php
if (isset($_GET["send"])) {
   $email = file('file.txt') or die('Файл не найден');
   $msg = "Добрый день!\n\n";
   $msg .= "Новости нашего сайта.\n\n";
   $msg .= "http://www.site.ru/\n";
   $msg .= "mail@site.ru";
   $header = "Content-Type: text/plain; charset=windows-1251\r\n";
   $header.="From: news <mail@site.ru>";
   $tema = "Новости сайта";
   $tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
   for ($i=0, $c=count($email); $i<$c; $i++) {
      $email[$i] = trim($email[$i]);
      if (preg_match('/^([a-z0-9_.-]+)@([a-z0-9-]+\.)+[a-z]{2,6}$/is', 
         $email[$i])) {
         @mail($email[$i], $tema, $msg, $header);
      }
   }
   echo "Сообщения разосланы";
}
?>

 

При  нажатии  кнопки  Разослать  на  все E-mail  из  файла  будет  отправлено письмо.

 

Обратите внимание, на локальной машине письма отправлены не будут, так как мы не устанавливали программу отправки писем — sendmail. На сервере хостинг-провайдера данная программа практически всегда установлена и настроена. Правда, количество одновременно отправленных писем часто ограничено.

 
При  рассылке  в  письме  обязательно  должна  быть  предусмотрена  возможность отписаться от рассылки. И  запомните — рассылка спама в Интернете запрещена. Под спамом понимаются письма, не запрошенные явным образом получателем.

3
<< Меню >>  
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити