редакция на скрип

mirela_ivanova_

Registered
някой може ли да промени този скрипт за масов емайл да праща по 19 емайла на две минути а не повече. Имам 700 емайла в mysql и когато почне да ги праща ме блокират за спам. Лимита е 19 мин на 2 мин. някой ако може ще съм много благодарна.
Мерси предварително!
Код:
<?

$action = $_REQUEST['action'];
global $action;

function showForm() {
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body body onload="init()">
<?php
/* Настройки за получателя */
$toname="name_user"; //Име на получателя
$tomail="mail@mail-a"; //Емаил на получателя
/* Настройки за получателя */
?>
<form enctype="multipart/form-data" name="send" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="hidden" name="action" value="send" />
<input type="hidden" name="to_name" size="50" value="<?php echo $toname; ?>">
<input type="hidden" name="to_email" size="50" value="<?php echo $tomail; ?>">
<table class="ttop2" border="3" cellspacing="1" cellpadding="2" style="background-color: rgb(204, 204, 204);" id="emailTable">
<tbody id="emailTBody">
<tr>
<td class="gradient" style="text-align: right;">
Вашето име:
</td>
<td class="gradient" style="text-align: left;">
<input name="from_name" size="25">
</td>
<td class="gradient" style="text-align: right;">
Вашия Емаил:
</td>
<td class="gradient" style="text-align: left;">
<input name="from_email" size="25">
</td>
</tr>
<tr>
<td class="gradient" style="text-align: right;">
Заглавие:
</td>
<td class="gradient" colspan="3" style="text-align: left;">
<input name="subject" size="55">
<input type="button" name="add_attachment" value="Закачи файл" onclick="addAttachment()">
</td>
</tr>
<tr>
<td class="nogradient" colspan="4" style="text-align: left;">
<textarea name="body" rows="10" cols="70"></textarea>
</td>
</tr>
<tr>
<td class="gradient" height="65" colspan="4" style="text-align: left;">
<div style="position: relative; bottom: -6px; left: 6px;">
<input type="submit" value="Изпрати">
</div>
</td>
</tr>
</tbody>
</table>
</form>

<script type="text/javascript" language="javascript">
var trow;

function init()
{
trow = 2;
}

function addAttachment()
{
var tbodyElem = document.getElementById("emailTBody");
var trElem, tdElem, txtNode, tmpString;

trElem = tbodyElem.insertRow(trow);

tdElem = trElem.insertCell(0);
tdElem.className = "gradient";
tdElem.setAttribute("style", "text-align: right;");
txtNode = document.createTextNode("Закачи файл " + (trow - 1) + ":");
tdElem.appendChild(txtNode);


tdElem = trElem.insertCell(1);
tdElem.className = "gradient";
tdElem.setAttribute("style", "text-align: left;");
tdElem.setAttribute("colspan", "3");

var input = document.createElement("INPUT");
input.setAttribute("type", "file");
input.setAttribute("name", "attachment" + (trow - 1));
input.setAttribute("size", "60");
input.setAttribute("value", "");
input.setAttribute("id", "attachment" + (trow - 1));
tdElem.appendChild(input);

trow++;
}
</script>
<?php
}
function sendMail() {
if ((trim($_POST['from_name']))=="") { //Ако не е попълнено име!
die ("<p>Не сте попълнили вашето име, моля батиснете бутона Back и го попълнете</p>");
}
if ((trim($_POST['from_email']))=="") { //ако не е попълнен емаил!
die ("<p>Не сте попълнили вашия емайл адрес, моля батиснете бутона Back и го попълнете</p>");
}
else {
$to_name = stripslashes($_POST['to_name']);
$from_name = stripslashes($_POST['from_name']);
$subject = stripslashes($_POST['subject']);
$body = stripslashes($_POST['body']);
$to_email = $_POST['to_email'];


$headers = "From: $from_name <" . $_POST['from_email'] . ">\n";
$headers .= "Reply-To: <" . $_POST['from_email'] . ">\n"; 
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\"----=MIME_BOUNDRY_main_message\"\n"; 
$headers .= "X-Sender: $from_name <" . $_POST['from_email'] . ">\n";
$headers .= "X-Mailer: PHP4\n";


$headers .= "X-Priority: 3\n"; 
$headers .= "Return-Path: <" . $_POST['from_email'] . ">\n"; 
$headers .= "This is a multi-part message in MIME format.\n";
$headers .= "------=MIME_BOUNDRY_main_message \n"; 
$headers .= "Content-Type: multipart/alternative; boundary=\"----=MIME_BOUNDRY_message_parts\"\n"; 
$message = "------=MIME_BOUNDRY_message_parts\n";
$message .= "Content-Type: text/plain; charset=\"windows-1251\"\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n"; 
$message .= "\n"; 
$message .= "$body\n";
$message .= "\n"; 
$message .= "------=MIME_BOUNDRY_message_parts--\n"; 
$message .= "\n"; 

foreach($_FILES as $file => $value) {
$_tmpname = $_FILES[$file]['tmp_name'];
$_filename = $_FILES[$file]['name'];
if (is_uploaded_file($_tmpname)) { 
$fp = fopen($_tmpname, "rb"); 
$data = fread($fp, filesize($_tmpname)); 
$data = chunk_split(base64_encode($data)); 
$message .= "------=MIME_BOUNDRY_main_message\n"; 
$message .= "Content-Type: application/octet-stream;\n\tname=\"" . $_filename . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: attachment;\n\tfilename=\"" . $_filename . "\"\n\n";
$message .= $data; 
$message .= "\n\n";
fclose($fp);
}
}

$message .= "------=MIME_BOUNDRY_main_message--\n"; 


$ok = mail("$to_name<$to_email>", $subject, $message, $headers); 
if($ok)
{
echo "Благодарим ви. Писмото беше изпратено.";
}
else
{
echo "Елайлът не може да буде изпратен";
}
}
}

print <<< EOT
<?xml version="1.0" encoding="windows-1251"?>

EOT;
?>
<?
switch ($action) {
case "send":
sendMail();
showForm();
break;
default:
showForm();
}
?>
 
До колкото разбирам, това което си показала е формуляр за контакти. Не мисля, че има начин да ограничиш колко често да бъде използван. Не става ясно как през този формуляр изпращаш писма, взимайки имейл адреси от базата-данни. Вероятно се опитваш да направиш нещо, използвайки обаче неподходящ за целта метод.

Ако искаш да ограничиш използването на формуляра за контакти, вместо да изпращаш имейл, записвай си съобщенията, които потребителите ти пращат, в базата-данни и после си ги чети от там.

Ако искаш автоматично да изпращаш писма на потребителите, за които имаш имейл адреси в базата си данни, начина е съвсем друг. В този случай е напълно възможно да се направи (или да се използва вече готова) система, която взима в предвид тези лимити. Прави се един РНР скрипт, който се изплънява през cron всеки две минути, взима 19 адреса, изпраща писма, записва id на последния изпратен и като се включи отново след две минути, търси следващите 19 имейл адреса, спрямо последния използван. Накрая нулираш контролата за да си готова за следващия път, когато отново трябва да изпращаш писма.

Има и малко по-бърз вариант - в bcc можеш да сложиш до 20 (или 25) допълнителни адреса, получателите няма да видят адресите на другите потребители, но така с едно извикване на mail() функцията, изпращаш 20 писма. Ако на всеки 2 минути, можеш да извикваш mail() функция по 19 пъти, това прави по 380 писма на всеки две минути. Писмото го изпращаш до себе си, а в bcc подреждаш със запетя 20 имейл адреса.
 
това е скрипт в който аз пиша моя емайл и моя текст и скрипта автоматично го изпраща на всички емайли от mysql. но емайлити в mysql са над 700 и сервера се блокира тъй като за по малко от минута пращам над 700 емайла.
Лимита на серавера е на две минути да се пращат по 19 емайла.
Искам еднократно да въведа в този код моя емайл и текста, а кода го праща на всеки 2 мин на по 19 емайла и така след час всичките 700 емайла да са получили текста който съм въвела без да надхвърлям лимита на сервера който е 19 емайла за 2 мин!
 
В този код абсолютно никъде не е показано как взимаш имейл адресите от базата-данни и им изпращаш писма, затова и моите въпроси бяха такива.

Както и да е, това което искаш няма как да стане точно с този код. Или трябва да използваш някоя система като phpList (което върши работа, но е една отвратителна каша от всякакъв РНР код), или да си го направиш сама в няколко стъпки:

1. При попълване и събмитване на формуляра, взимаш всички имейл адреси и в една нова таблица в базата-данни, записваш съобщенията, които ще изпращаш на всеки един по отделно. До тук имаш 700 съобщения.

2. Един РНР скрипт, изпълняван автоматично през cron job на всеки две минути, проверява дали има записи в тази таблица със съобщенията. Ако има, взима 18, изпраща ги, изтрива ги от таблицата. Спира за две минути и после пак. И така докато изпрати всичките.
 
да да да, това ми трябва. но не съм толкова компетентна за да го направя. ако някой може ще съм изключително много благодарна.
 

Back
Горе