Mail в цикле - работает, а письма не доходят

  • Автор темы Sasha_kz
  • Дата начала

Sasha_kz

Guest
Mail в цикле - работает, а письма не доходят

Перелистал форум, пробовал экспериментировать, но... пришлось спросить. В двух словах. На сайте есть база и в ней меньше сотни адресов получателей еженедельника "Бизнес-пресс". Запуск файла php происходит кроном в 2 ночи если есть новый выпуск еженедельника. В цикле идет рассылка писем. Для проверки в базе адресов-получателей есть 2 поля (отправленный номер и дата-время). После вызова функции mail(параметры) в соответствующие поля вписываются дата-время. По базе вроде бы все нормально, письма как бы уходят (новые значения даты-времени), а вот получатели (не все, но большинство) говорят что не получили письма. Может кто сталкивался с подобным?
Если самому рассылать то всем письма приходят.
Мои предположения:
- может быть срабатывает time-out на функции mail()
- может почтовые сервера получателей не принимают почту не от почтового сервера (от работы функции mail() )
Заранее спасибо всем откликнувшимся.
 

Мутник

Новичок
Sasha_kz

а ты попробуй рассылать их с задержкой в секунду, может будет лучше...

во всяком случае были проблемы подобного рода, только не с mail'ом.

или, что лучше, попробуй протестировать ту же самую отсылку на вой майл ручками, может где то сам напортачил.

да, кстати, посмотри внимательнее ф-цию mail, а лучше последние параметры... был прикол, что на некоторых серверах не работает без "-fweb@{$_SERVER['SERVER_NAME']}"

короче, надо смотреть...
привел бы кусок кода, что ли.
 

Andronik

Новичок
PHP:
<?php

set_time_limit (0);


$uz=fopen("itog.dat", "rt");   //база
$str=fread($uz, 1000000);
fclose($uz);


$dis="#";    // разделитель e-mailов


do{

$gar=explode($dis, $str, 2);
list($to, $str)=$gar;


// subject
$subject = 'Ремонт офисов и квартир';

// message

$ammor=fopen("remont.html", "rt");      // HTML форма письма
$message=fread($ammor, 1000000);
fclose($ammor);



// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";

// Additional headers

$headers .= 'From: Ремонт квартир и офисов <[email protected]>' . "\r\n";


// Mail it
mail($to, $subject, $message, $headers);

}while($str!="");


?>
А не получается, наверное из-за ограничения по времени в 30 секунд. Получают только первые адресаты, которые уложились в это время. Остальные - Good-bye.
 

Sasha_kz

Guest
Спасибо, буду пробовать. Я думал про лимит времени работы. Результат подскажу.

-~{}~ 08.04.05 16:56:

Добавил в начале
PHP:
set_time_limit (0)
, но, увы, все по прежнему :-(

Код простейший:
PHP:
=== 
код подготовки текста письма
 на выходе $text_letter
 так же готовим $subject и $headers
===

$sql = 'SELECT * FROM mail_list';
$result = @mysql_query($sql, $connection) or die ("Не могу выполнить запрос");
while ($row = mysql_fetch_array($result))
{
$to      = $row['mail'];
$id_to = $row['id_mail'];
if ( @mail($to, $subject, $text, $headers) )
   {
       $query = "UPDATE mail_list SET data_send = now() WHERE id_mail = $id_to";
       $result_send = @mysql_query($query, $connection) or die ("Не могу обновить данные");
    }
}
А в базе, в поле data_send, дата и время обновляется и время отличается друг от друга на 10 - 15 сек. Как бы все хорошо, а адресаты говорят что не было письма. отправляю "ручками" со свой почты - нормально доходит.
 

Мутник

Новичок
Sasha_kz

странный ты.. заглушил все ошибки и не понимаешь, почему не работает...

убери собак со всех функций и смотри на выводимые ошибки. А еще, прочитай мой первый пост, потом пиши сюда... что, все за тебя должны думать? учись сам искать СВОИ ошибки.

-~{}~ 08.04.05 15:05:

PHP:
<?php
mail("[email protected]", "the subject", $message,
     "From: webmaster@{$_SERVER['SERVER_NAME']}", "-fwebmaster@{$_SERVER['SERVER_NAME']}");
?>
посмотри на последние параметры!
 

Begemot

Guest
Это возможно ограничение хотинг-провайдера, запускай скрипт несколько раз кроном, а в базе указывай адреса тех, кому уже были отправлены письма
 

DimbIch

Новичок
поговори с хостером...
скорее всего у него просто стоит лимит на быструю отправку определенного количества писем...
 

Romashov

экспериментатор
На mail.ru есть лимит на похожие письма, после чего они считаются спамом.
 

tolst

Новичок
может быть дело в SAFE MODE, который не даёт включить set_time_limit(0); так оно скорее всего и есть... сделай вот так и проверь:
PHP:
if (set_time_limit(0)){
exit("OK");
} else {
exit("FACK OFF");
}
 

Romashov

экспериментатор
А поставить в конце
PHP:
echo "Sent.";
или прокрутить счётчик и узнать, сколько отправлено писем?
 

Sasha_kz

Guest
:) Спасибо всем и шуткам тоже.
Хостер я сам, потому как сервер физически у меня. Вот что было мной проделано.
1. В php.ini разремил sendmail_path и указал путь к sendmail с параметрами -t -i
2. установил в файле рассылки почты set_time_limit (0) и добавил задержку в работе цикла рассылки - sleep (50);
В результате получил следующее:
- если запускаю свой php файл сам, с обычной машины (www.мойсайт.ru/send_news.php - это пример) то письма уходят всем, доходят и в базе ставится отметка о времени отправки.
- если это делает cron за меня, то в базе время прописывается что письма ушли, а фактически не доходят. По логам cron фиксирует, что файл запускается и ошибок нет.

Вопрос: есть ли какие либо настройки cron кроме указания времени запуска и чего запускать? Может какие либо права и т.д.
 

SiMM

Новичок
> если это делает cron
Запусти кроном следующий скрипт
PHP:
<?php
$fp = fopen(dirname(__FILE__).'/test.dat','w');
fwrite($fp,var_export(ini_get('sendmail_path'),true));
?>
После чего делай выводы на основании результатов, записанных в test.dat.
 

Sasha_kz

Guest
Автор оригинала: SiMM
> если это делает cron
Запусти кроном следующий скрипт
PHP:
<?php
$fp = fopen(dirname(__FILE__).'/test.dat','w');
fwrite($fp,var_export(ini_get('sendmail_path'),true));
?>
После чего делай выводы на основании результатов, записанных в test.dat.
Ок, попробую
 
Сверху