Итак, у меня была программа на 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 - путь к файлу-вложению.