|
 2.8 Кб |
|
| Всем привет! Перед мной стоит задача создать такой скрипт, который бы из файла брал адреса и по ним рассылал.
Что я пока не смог сделать и прошу в этом помочь:
1 - это после нажатия на отправку нужно в Лог-чате выводить вреалтайме сообщения - отправлено/не отправлено.............и вообще я верно определяю отправку? если нет, то жду критики, советов, помощи.
2 - когда отправил уже сообщения на адреса, то не вижу самого тела сообщения subject
Жду критики, исправлений (как правильно или лучше реализовывать) и помощи. Приложу код 2-х файлов и сами файлы прикреплю:
Index.php
<?php
//отключаем время срабатывания скрипта
ini_set("max_execution_time", "0");
//подключаем настройки
include("config.php");
//создаем файлы .тхт и каталог если они не существуют
if (!is_file("name.txt") || !is_file("mail_list.txt") || !is_file("log.txt") || !is_dir("attachments"))
{
$file1 = fopen("name.txt","w");
chmod("name.txt",0777);
fclose($file1);
$file2 = fopen("mail_list.txt","w");
chmod("mail_list.txt",0777);
fclose($file2);
$file3 = fopen("log.txt","w");
chmod("log.txt",0777);
fclose($file3);
@mkdir("attachments",0777);
}
//при загрузке странице заполняется поле От:
$em = file("name.txt");
$email = $em[0];
//при загрузке странице заполняется поле Задержка:
$val = 0;
//все действия, что происходят после отправки формы
if(!empty($_POST['send']))
{
//обрабатываем возможные ошибки
if($_POST['email'] == "" || $_POST['tema'] == "")
$array_error[] = "<font color='red'>*</font> Основне поля должны быть заполнены!";
if($_POST['femail'] == "")
$array_error[] = "<font color='red'>*</font> Невозможно отправить сообщения, т.к. файл <b>mail_list.txt</b> пуст!";
if(!preg_match("/^[a-z0-9_.-]+@([a-z0-9_]+.)+[a-z]{2,4}$/",$_POST['email']))
$array_error[] = "<font color='red'>*</font> Формат почты неверен. Пример: <b>test@mail.ru</b>.";
if (is_uploaded_file($_FILES['file']['tmp_name']) == false)
$array_error[] = "<font color='red'>*</font> Произошел сбой в загрузке картинки. Повторите загрузку.";
if($_FILES["file"]["error"] == 1)
$array_error[] = "<font color='red'>*</font> Размер файла превышает 2 мегабайта.";
if($_FILES["file"]["error"] == 4)
$array_error[] = "<font color='red'>*</font> Выберите картинку.";
if($_FILES["file"]["type"] != "" && $_FILES["file"]["type"] != "image/jpeg" && $_FILES["file"]["type"] != "image/pjpeg")
$array_error[] = "<font color='red'>*</font> Тип файла запрещен к загрузке. Загружайте <b>.jpg</b> и <b>.jpeg</b>.";
//после отправки формы, при возникновении ошибки, сохраняем значение в поле От:
$email = $_POST['email'];
//после отправки формы, при возникновении ошибки, сохраняем значение в поле Задержка:
$val = $_POST['val'];
//начало формирования письма
$subj = $_POST['tema'];
$bound = "spravkaweb-1234";
$headers = "From:".$_POST['email']."\n";
$headers .= "Subject: $subj\n";
$headers .= "Mime-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$bound\"\n";
$body = "--$bound\n";
$body .= "Content-type: text/html; charset=\"windows-1251\"";
$body .= "Content-Transfer-Encoding: 8bit\n\n";
$body .= $_POST['message']."<BR><img src=\"cid:spravkaweb_img_1\">";
$body .= "\n\n--$bound\n";
//действия выполняемые при условии, что нет ошибок
if(count($array_error) == 0)
{
//формируем имя файла
$image = "att_".date("YmdHis").rand(100,300).".jpg";
//загрузка и перемещение файла
//move_uploaded_file($_FILES["file"]["tmp_name"],"attachments/".$image);
move_uploaded_file($_FILES["file"]["tmp_name"],$_SERVER['DOCUMENT_ROOT']."/email/attachments/".$image);
//продолжение формирования файла
$body .= "Content-Type: image/jpeg; name=\"".basename($image)."\"\n";
$body .= "Content-Transfer-Encoding:base64\n";
$body .= "Content-ID: <spravkaweb_img_1>\n\n";
$f = fopen("attachments/".$image,"rb");
$body .= base64_encode(fread($f,filesize("attachments/".$image)))."\n";
$body .= "--$bound--\n\n";
//читаем файл с адресами
$mail_list = file("mail_list.txt");
//открываем файл для перезаписи
$put_log = fopen("log.txt","w");
//в цикле отправляем по адресам сообщения
for($i=0;$i<count($mail_list);$i++)
{
//задержка отправки
sleep($_POST['val']);
//условием проверяем успешность отправки сообщения
if (mail($mail_list[$i], $subj, $body, $headers))
{
//успешная отправка
$log = trim($mail_list[$i])." : сообщение отправленно\r\n";
}
else
{
//не успешная отправка
$log = trim($mail_list[$i])." : сообщение не отправленно\r\n";
}
//производим запись в файл
fputs($put_log, $log);
$log_list .= $log."<br>";
}
//закрываем файл
fclose($put_log);
//открываем файл для перезаписи
$put_name = fopen("name.txt","w");
//перезаписываем
fputs($put_name, $_POST['email']);
//закрываем файл
fclose($put_name);
if(mail == true)
{
$redr = "<input style='background:#FFA59F; border:solid 1px #FF0606' name='redr' type='submit' value='Перейти к новой рассылке' />";
}
}
}
if(!empty($_POST['redr']))
{
//очистка лог-файла
$clear_log = fopen("log.txt","w");
$clear = "";
fputs($clear_log, $clear);
fclose($clear_log);
//переадресация
header("location: ".DOMEN."/email/");
}
?>
<form action="" method="post" enctype="multipart/form-data" name="name_form">
<table align="center" style="border:solid 1px black" bgcolor="#F8F8F8" width="600" height="135" border="0">
<tr>
<td colspan="3" height="29" align="center" valign="top"><b>Скрипт масcовой рассылки от Романова Алексея</b></td>
</tr>
<tr>
<td width="176" align="right">От:</td>
<td width="318" valign="top"><input size="53" name="email" type="text" value="<?php echo $email; ?>" <?php if(!empty($_POST) && $array_error == 0) { echo "readonly";} ?> /></td>
<td width="90"><font color="red">*</font></td>
</tr>
<tr>
<td align="right">Кому:</td>
<td valign="top"><textarea name="femail" cols="40" rows="2" readonly="readonly">
<?php
//читаем файл с адресами
$mail_list2 = file("mail_list.txt");
//в цикле выводим адреса
for($i=0;$i<count($mail_list2);$i++)
{
//вывод
echo $mail_list2[$i];
}
?>
</textarea></td>
<td><font color="red">*</font></td>
</tr>
<tr>
<td align="right">Тема:</td>
<td valign="top"><input size="53" name="tema" type="text" value="<?php echo $_POST['tema']; ?>" <?php if(!empty($_POST) && $array_error == 0) { echo "readonly";} ?> /></td>
<td><font color="red">*</font></td>
</tr>
<tr>
<td align="right">Сообщение:</td>
<td valign="top"><textarea name="message" cols="40" rows="3" <?php if(!empty($_POST) && $array_error == 0) { echo "readonly";} ?> ><?php echo $_POST['message']; ?></textarea></td>
<td> </td>
</tr>
<tr>
<td align="right">Прикрепить файл:</td>
<td valign="top"><input size="41" name="file" type="file" <?php if(!empty($_POST) && $array_error == 0) { echo "disabled";} ?> /></td>
<td><font color="red">*</font></td>
</tr>
<tr>
<td align="right">Задержка:</td>
<td valign="top"><input id="val" size="1" type="text" name="val" value="<?php echo $val; ?>" readonly="readonly"> <input name="minus" type="button" size="3" value="-" onClick="if(val.value == 1){minus.disabled=true;}val.value--" disabled="disabled" <?php if(!empty($_POST) && $array_error == 0) { echo "disabled";} ?> > <input type="button" size="3" value="+" onClick="if(val.value == 0){minus.disabled=false;}val.value++" <?php if(!empty($_POST) && $array_error == 0) { echo "disabled";} ?> ></td>
<td> </td>
</tr>
<tr>
<td colspan="3"><div align="center"><input name="send" type="submit" value="Отправить сообщения" <?php if(!empty($_POST) && $array_error == 0) { echo "disabled";} ?> /></div><div style="font-size:12px; color:gray; font-family:tahoma; margin:10px 250px 0 170px"><font color="red">*</font> Основные поля.</div></td>
</tr>
</table>
<table align="center" width="600" border="0">
<tr>
<td align="right"><?php echo $redr; ?></td>
</tr>
</table>
</form>
<table align="center" width="600" border="0">
<tr>
<td>
<?php
//в цикле выводим все возможные ошибки
for($c=0;$c<count($array_error);$c++)
{
//вывод
echo $array_error[$c]."<br>";
}
?>
</td>
</tr>
</table>
<div align="center" style="font-size:20px; font-weight:bold">Логи:</div>
<div align="center"><div align="left" style="height: 15em; width: 37em; overflow: scroll;border: 1px solid black; padding-left:5px">
<?php
if(!empty($_POST))
{
echo $log_list;
}
?>
</div></div>
|
config.php
<?php
header("Content-Type: text/html; charset=windows-1251");
//define("DOMEN","http://localhost/denwer");
define("DOMEN","http://furmani.dp.ua");
?>
|
Прошу прощения за столь растянутую страничку, но не хотелось резать строки переносами, сбивая код в кучу. | |
|
|
|
|
|
|
|
для: TetRiska
(04.12.2009 в 04:46)
| | Такое впечатление, что все писалось впопыхах - писали, писали, вспомнили, что забыли вот это, вставили это, пишем дальше, опять вспомнили.... | |
|
|
|
|
|
|
|
для: sim5
(04.12.2009 в 06:03)
| | От части можно сказать и так. Но я его переработал и привел в более читабельный вид. Вопрос еще не решен. | |
|
|
|
|
|
|
|
для: TetRiska
(04.12.2009 в 10:41)
| | Работали, работали над ошибками, потом (видимо с перепугу) начали формировать почтовое отправление, потом вспомнили опять про ошибки, проверили, продолжили опять с почтой....
И это вы называете читабельностью? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2009 в 10:46)
| | Где Вы видите потом вспомнили опять про ошибки, проверили, ? У меня лишь в одном месте обработка ошибок идет! | |
|
|
|
|
|
|
|
для: TetRiska
(04.12.2009 в 15:34)
| | У вас такая обстановка.
Вы ждали гостя, размышляя как его встретить, где посадить. Логичны действия? Логичны.
Раздался звонок, но вроде бы как незнакомый. Вы мысленно прокрутили ошибочные ситуации (если это неожидаемый гость). Логичны действия ваши? Логичны.
Вы открыли дверь, впустили половину туловища звонящего, после чего спросили - "Кто там?"
С этого момента ваши действия логичны? | |
|
|
|
|
|
|
|
для: sim5
(04.12.2009 в 15:54)
| | Теперь, я надеюсь, понял о чем Вы :) Нужно сделать так:
<?php
.............
//после отправки формы, при возникновении ошибки, сохраняем значение в поле От:
$email = $_POST['email'];
//после отправки формы, при возникновении ошибки, сохраняем значение в поле Задержка:
$val = $_POST['val'];
//действия выполняемые при условии, что нет ошибок
if(count($array_error) == 0)
{
//формируем имя файла
$image = "att_".date("YmdHis").rand(100,300).".jpg";
//загрузка и перемещение файла
//move_uploaded_file($_FILES["file"]["tmp_name"],"attachments/".$image);
move_uploaded_file($_FILES["file"]["tmp_name"],$_SERVER['DOCUMENT_ROOT']."/email/attachments/".$image);
//формируем письмо
$subj = $_POST['tema'];
$bound = "spravkaweb-1234";
$headers = "From:".$_POST['email']."\n";
$headers .= "Subject: $subj\n";
$headers .= "Mime-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$bound\"\n";
$body = "--$bound\n";
$body .= "Content-type: text/html; charset=\"windows-1251\"";
$body .= "Content-Transfer-Encoding: 8bit\n\n";
$body .= $_POST['message']."<BR><img src=\"cid:spravkaweb_img_1\">";
$body .= "\n\n--$bound\n";
$body .= "Content-Type: image/jpeg; name=\"".basename($image)."\"\n";
$body .= "Content-Transfer-Encoding:base64\n";
$body .= "Content-ID: <spravkaweb_img_1>\n\n";
$f = fopen("attachments/".$image,"rb");
$body .= base64_encode(fread($f,filesize("attachments/".$image)))."\n";
$body .= "--$bound--\n\n";
................
?>
|
Если верно поправил, то как быть с:
1 - вывод в реалтайме сообщений об успешности/не успешности отпарвки
2 - есть сомнения, что конструкцией
<?php
.........
if (mail($mail_list[$i], $subj, $body, $headers))
{
//успешная отправка
$log = trim($mail_list[$i])." : сообщение отправленно\r\n";
}
else
.....
?>
|
можно правильно определить успешность отправки
3 - и еще я неверно вывожу кнопку возврата в начало отправки:
<?php
if(mail == true)
{
$redr = "<input style='background:#FFA59F; border:solid 1px #FF0606' name='redr' type='submit' value='Перейти к новой рассылке' />";
}
?>
|
В этом случае будет кнопка появляться если все сообщения отправлены успешно, или я ошибаюсь? | |
|
|
|
|
|
|
|
для: TetRiska
(04.12.2009 в 22:46)
| | Вам надо выполнить три действия, последнее из них по условию. Первое - инициализация переменных, второе - прием и проверка формы, и третье по условию - верно, значит требуемое действие, нет, значит возврат ошибок. И все это нужно писать как блоки кода, а не разбрасывать их кусками. Это и имелось ввиду.
1. А что тут сложного? Если операция отработала успешно - вывод сообщения.
2. Конструкция if(mail(... не гарантирует успешной отправки, если говорить именно о получении респондентом вашего сообщения, а то что оно отправлено укажет отсутствие ошибки.
3. if(mail) без всякого true, но, если речь о рассылке, то разве нужно проверять это? Проверять нужно окончание задачи, которая включает в себя множество отправлений.
$headers .= "Subject: $subj\n";
Так нельзя отправлять тему письма на русском языке, ее нужно кодировать, иначе она может прийти в неудобочитаемом виде. Здесь есть прикрепление, почитайте об этом, и вообще о почте. Особое внимание на заголовки для Content-Type: multipart.
А если по тем или иным причинам move_uploaded_file вернет ошибку? | |
|
|
|
|