Итак, у меня была программа на PHP, которая выбирала определенных пользователей из базы (в том числе их e-mail адреса) и отправляла им определенное письмо с сайта. Либо отправляла напоминание пароля пользователю. Код-скрипт был представлен следующим образом.

В данном случае приведен пример кода с напоминанием пароля.

$remail = test_mail($line['ml'],$frzi,$msrv,$msprt); //проверяю есть ли такой е-майл
             if ($remail == "YES") {
               mail($line['ml'], convert_cyr_string($frozi,'w','k'), convert_cyr_string("Напоминание пароля",'w','k'), convert_cyr_string($tx,'w','k'), null);
}

Здесь

  • $line['ml'] - это полученный из базы данных e-mail пользователя.
  • $frzi - обратный адрес (от которого отправляется письмо);
  • $msrv - доменный адрес почтового сервера, например mymail.ru
  • $msprt - порт SMTP-почтового сервера (в данном случае будет равен 25
  • $tx - непосредственно сгенерированный пароль и немного вводного текста перед ним (для темы письма). Программа работала в локальной сети с определенным количеством обычных пользователей. Поэтому его шифрование не требовалось. Можно было пересылать в открытом виде.

Также, как видите перед отправкой письма происходит конвертация темы письма и текста письма из windows в кириллицу, чтобы кодировка у письма была правильная (наиболее подходящая для всех локальных почтовых программ).

Кстати, Вы можете вставлять <html>-теги в текст письма. Если почтовая программа продвинутая (the bat, thunderbird) или используется интернет-сервис, то проблем с их отображением не возникнет.

Ну и как видите, сначала происходит проверка наличия такого адреса (через SMTP mail-сервер) и если ответ "YES", то есть адрес есть, то идет отправка письма.

Далее приведена функции проверки наличия адреса:

function test_mail($to,$from,$msrv,$msprt) {

   $to = trim($to);

  // Open an SMTP connection
  $cp = fsockopen ($msrv, $msprt);
  if (!$cp) return "Не могу создать соединение.";

  $res=fgets($cp,256);

  if(substr($res,0,3) != "220") return "Ошибка соединения с ".$msrv.". Ответ сервера: ".$res."<P>";

  // Say hello...
  $HTTP_HOST = $_SERVER["HTTP_HOST"];
  fputs($cp, "HELO ".$HTTP_HOST."\r\n");
  $res=fgets($cp,256);
  if(substr($res,0,3) != "250") return "Не могу представиться. Ответ сервера: ".$res."<P>";

  // Mail from...
  fputs($cp, "MAIL FROM: <".$from.">\r\n");
  $res=fgets($cp,256);
  if(substr($res,0,3) != "250") return "Письмо не может быть отправлено от ".$from.". Ответ сервера: ".$res."<P>";

  // Rcpt to...
  fputs($cp, "RCPT TO: <$to>\r\n");
  $res=fgets($cp,256);
  if(substr($res,0,3) != "250") return "Адресат неизвестен. Ответ сервера: ".$res."<P>";

  // ...And time to quit...
  fputs($cp,"QUIT\r\n");
  $res=fgets($cp,256);
  if(substr($res,0,3) != "221") return "Не могу завершить соединение с ".$msrv.". Ответ сервера: ".$res."<P>";;

  fclose ($cp); //закрываем

  return "YES";
 }

И далее еще один скрипт на PHP, функция отправки письма:

// Вспомогательная функция для отправки почтового сообщения с вложением
   function send_mail($mail_to, $mail_from, $thema, $html, $path) {
       $fc = 0; //флаг говорит о том, что скрытых адресатов не будет
       //преобразую строку с запятыми в массив
       $pcs = explode(",", $mail_to);
       if (count($pcs) > 1) {
           $mail_to = array_shift($pcs); //Извлеку (со смещением) первый элемент массива
        $mail_toc = implode(",",$pcs);
        $fc = 1;
           }

    if(empty($path)) { //если простое письмо без вложения
        //Для отправки HTML-почты вы можете установить шапку Content-type.
        $headers  = "MIME-Version: 1.0\r\n";
        $headers .= "Content-type: text/html; charset=koi8-r\r\n";
        //дополнительные шапки
        $headers   .= "From: ".koi8r_to_mime($mail_from)."\r\n";
        //если есть скрытые адресаты, добавлю их
        if ($fc > 0) $headers   .= "BCC: ".$mail_toc."\r\n";

        if(!mail($mail_to, koi8r_to_mime($thema), $html, $headers))
         {return False;           //если не письмо не отправлено
        }
        else return True; //// если письмо отправлено
    }
    else {
      $fp = fopen($path,"rb");
      if (!$fp){
        echo "Файл не найден на диске!";
        exit();
      }
      $file = fread($fp, filesize($path));
      fclose($fp);


      $name = $path; //в этой переменной надо сформировать имя файла (без всякого пути)

      // ограничитель строк "\r\n", некоторые почтовые сервера требуют \n - подобрать опытным путём
      $boundary     = "--".md5(uniqid(time()));  // любая строка, которой не будет ниже в потоке данных.
      $headers    = "MIME-Version: 1.0;\r\n";
      $headers   .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
      $headers   .= "From: ".koi8r_to_mime($mail_from)."\r\n";
      //если есть скрытые адресаты, добавлю их
      if ($fc > 0) $headers   .= "BCC: ".$mail_toc."\r\n";

      $multipart  = "--$boundary\r\n";
      $multipart .= "Content-Type: text/html; charset=koi8-r\r\n";
      $multipart .= "Content-Transfer-Encoding: base64\r\n";
      $multipart .= "\r\n"; // раздел между заголовками и телом html-части
      $multipart .= chunk_split(base64_encode($html));

      $multipart .=  "\r\n--$boundary\r\n";
      $multipart .= "Content-Type: application/octet-stream; name=\"".$name."\"\r\n";
      $multipart .= "Content-Transfer-Encoding: base64\r\n";
      $multipart .= "Content-Disposition: attachment; filename=\"".$name."\"\r\n";
      $multipart .= "\r\n"; // раздел между заголовками и телом прикрепленного файла
      $multipart .= chunk_split(base64_encode($file));

      $multipart .= "\r\n--$boundary--\r\n";

        if(!mail($mail_to, koi8r_to_mime($thema), $multipart, $headers))
         {return False;           //если не письмо не отправлено
        }
        else return True; //// если письмо отправлено
    }
    exit;
  }

Обратите внимание, в нашей функциеи на PHP доступна также отправка писем с вложением (например с картинкой). Для этого она принимает последний параметр $path - путь к файлу-вложению.

Add comment


Security code
Refresh