Проверка доставки письма

Me11er

Новичок
Доброго времени суток, форумчане!

На моём сайте есть сервис "Отправка заявки". Отправка письма осуществляется функцией mail().

Вопрос в следующем:
Как отследить доставку письма?

По ответу функции можно только узнать отправилось или нет. Есть необходимость узнать доставлено или нет. Были мысли отправки письма с функцией "Сообщить о прочтении", но прочитано может быть через день, неделю и т.д. Соответственно родилась мысль перед отправкой проверить валидность smtp сервера, но вот тут сложность возникла. Подскажите пожалуйста каким образом можно проверить не лежит ли smtp сервер или
может быть есть лучше решение задачи.

Заранее спасибо за положительные советы.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нельзя проверить, никак с 100% вероятностью, так же как нельзя проверить, понял твое письмо реципиент или нет.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
PS: многие делают так: Вставляют в письмо картинки, которые рендерятся в письме (при включенном отображении графици в почтовике, что редкость ныне) и к тебе приходит запрос, который потом парсится.

Упрощенно:
<img src="site.tld/index.php?image=x&user=y">
 

Me11er

Новичок
c0dex
С вероятность 100% понятное дело нельзя. Но если до отправки проверить доступность сервера входящей почты и затем сразу отправить, то вероятность что в этот промежуток времени сервер упал невелика.

Необходимость проверки доставки возникла из-за того, что заявки не дошли в один "прекрасный" момент.
 

Beavis

Banned
а кому отправляются заявки? если себе, то лучше тогда не через почту
 

Me11er

Новичок
Beavis, они отправляются по различным e-mail адресам, в зависимости от тематики заявки.
 

baev

‹°°¬•
Команда форума
c0dex
С вероятность 100% понятное дело нельзя. Но если до отправки проверить доступность сервера входящей почты и затем сразу отправить, то вероятность что в этот промежуток времени сервер упал невелика.
— то, что сервер «не упал» не является гарантией доставки.
Сервер может «отфутболить» сообщение по целому ряду причин: «нет такого ящика», «переполнен ящик», «сообщение похоже на спам», — и так далее.
А ещё сообщение может не дойти тупо из-за «разрывов на линии».
 

Me11er

Новичок
— то, что сервер «не упал» не является гарантией доставки.
Сервер может «отфутболить» сообщение по целому ряду причин: «нет такого ящика», «переполнен ящик», «сообщение похоже на спам», — и так далее.
А ещё сообщение может не дойти тупо из-за «разрывов на линии».
1) ящик такой 100% есть, т.к. используются только ящик своего почтовика. 2) переполнение тоже исключено, т.к. регулярно проверяем это. 3) спам заносится в "нежелательную почту", таковы настройки почтового сервера.
4) разрыв на линии - при проверки доступности сервера входящей почты исключается вероятность перебоя из-за небольшого интервала между проверкой и отправкой.

Следовательно остается только понять как проверить доступность smtp сервера. Перепробовал массу скриптов, но они все преимущественно на соксах, в виду небольшого опыта программирования от соксов избавиться не смог.
 

Me11er

Новичок
Спасибо за внимание моей проблеме.
проблему решил.. скрипт проверяет авторизацию. может кому-то тоже будет интересно.
скрипт вместе с отправкой письма. взято с пхп(точка)су
PHP:
<?php
function get_data($smtp_conn)
{
$data="";
while($str = fgets($smtp_conn,515))
{
$data .= $str;
if(substr($str,3,1) == " ") { break; }
}
return $data;
}

$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
$header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <[email protected]>\r\n";
$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <[email protected]>\r\n";
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: <172562218.".date("YmjHis")."@mail.ru>\r\n";
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Сергей')))."?= <[email protected]>\r\n";
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n";
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: text/plain; charset=windows-1251\r\n";
$header.="Content-Transfer-Encoding: 8bit\r\n";

$text="привет, проверка связи.";

$smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);
if(!$smtp_conn) {print "соединение с серверов не прошло"; fclose($smtp_conn); exit;}
$data = get_data($smtp_conn);
fputs($smtp_conn,"EHLO mail.ru\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 250) {print "ошибка приветсвия EHLO"; fclose($smtp_conn); exit;}
fputs($smtp_conn,"AUTH LOGIN\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;}

fputs($smtp_conn,base64_encode("login")."\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 334) {print "ошибка доступа к такому юзеру"; fclose($smtp_conn); exit;}


fputs($smtp_conn,base64_encode("password")."\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 235) {print "не правильный пароль"; fclose($smtp_conn); exit;}

fputs($smtp_conn,"MAIL FROM:[email protected]\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 250) {print "сервер отказал в команде MAIL FROM"; fclose($smtp_conn); exit;}

fputs($smtp_conn,"RCPT TO:[email protected]\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 250 AND $code != 251) {print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit;}

fputs($smtp_conn,"DATA\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 354) {print "сервер не принял DATA"; fclose($smtp_conn); exit;}

fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n");
$code = substr(get_data($smtp_conn),0,3);
if($code != 250) {print "ошибка отправки письма"; fclose($smtp_conn); exit;}

fputs($smtp_conn,"QUIT\r\n");
fclose($smtp_conn);
?>
 

С.

Продвинутый новичок
Не надо маяться дурью и проверять доступность СВОЕГО сервера. Достаточно иметь адекватного хостера не за 3 копейки.
 

Me11er

Новичок
С.,
Хостер не за 3 копейки. Почитайте выше зачем это нужно.

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

Redjik

Джедай-мастер
PHP:
		if(function_exists('checkdnsrr'))
			$valid=checkdnsrr($domain,'MX');
		if(function_exists('fsockopen'))
			$valid=fsockopen($domain,25)!==false;
проверка mx записи и пинг сервера... зачем такая портянка кода
 

Me11er

Новичок
Фанат,
Еще один "папка"... родственник "С." похоже..

Uptime хоста 99.9% за всё время. Проблема возника из-за "падения" почтового сервера. Теперь есть возможно перенаправить, продублировать письмо и т.д.
 

Me11er

Новичок
PHP:
		if(function_exists('checkdnsrr'))
			$valid=checkdnsrr($domain,'MX');
		if(function_exists('fsockopen'))
			$valid=fsockopen($domain,25)!==false;
проверка mx записи и пинг сервера... зачем такая портянка кода
Спасибо за помощь. "Портянку" кода использую не всю. По тому же принципу взял только кусок до аутентификации. Вышло легче чем ожидалось.
Буду рад еще каким-либо вариантам и рассуждениям.
 

Фанат

oncle terrible
Команда форума
аптайм твоего хоста тут не при чем, LOL
тот факт, что ТВОЙ сервер принял письмо к отправке, НИКАК не влияет на факт получения письма сервером ПОЛУЧАТЕЛЯ.

дети такие дети.
 

Me11er

Новичок
аптайм твоего хоста тут не при чем, LOL
тот факт, что ТВОЙ сервер принял письмо к отправке, НИКАК не влияет на факт получения письма сервером ПОЛУЧАТЕЛЯ.

дети такие дети.
Фанат, сервер получателя - один. Я проверяю сервер получателя, а не сервер отправителя. Мысль интересная.
 

Фанат

oncle terrible
Команда форума
Redjik
для валидации емейла это поможет как рыбке - зонтик. сто раз уже обсуждалось.
из-за борьбы со спамерами никакой адекватной информации сервер тебе никогда не отдаст.
 
Сверху