|
|
|
| Администратор хостинга неожиданно заблокировал функцию mail (я как раз в это время настраивал систему с почтовым взаимодействием между сайтами и чуть с ума не сошел в поисках причины того, почему вся система заткнулась! ). Причем, заблокировал не персонально у меня, а на всем сервере.
Какие-то невнятные объяснения, связанные со спамфильтрами. Или типа того, что функция mail непрогрессивна, или устарела. Что-то такое.
И предлагается использовать smtp (я даже не знаю, что это. Вероятно, связь через сокеты?).
Хотелось бы понять: что, действительно от mail лучше уходить к этой самой smtp? | |
|
|
|
|
|
|
|
для: Владимир55
(12.01.2012 в 18:53)
| | Имеется ввиду, наверно, чтоб вы не серв хостера грузили, а отправляли со своего реального ящика.
Проходили.
Я в подобной ситуации писал такую функцию:
<?php
function smtpmail($mail_to,$subject,$message,$from_name,$from_mail){
$smtp_server = "smtp.server.ru"; // реальные данные
$login = "login"; // любого вашего
$password = "password"; // реального ящика
$SEND = "Date: ".date("r")."\r\n";
$SEND .= "Subject: =?UTF-8?B?".base64_encode($subject)."?=\r\n";
$SEND .= "Reply-To: <$from_mail>\r\n";
$SEND .= "MIME-Version: 1.0\r\n";
$SEND .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n";
$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
$SEND .= "From: \"=?UTF-8?B?".base64_encode($from_name)."?=\" <$from_mail>\r\n";
$SEND .= "To: <$mail_to>\r\n";
$SEND .= "X-Priority: 3\r\n\r\n";
$SEND .= $message."\r\n";
if(!$socket = fsockopen($smtp_server,25,$errno,$errstr,30)) return false;
if(substr(fgets($socket,256),0,3) != 220) return false;
fputs($socket, "EHLO support\r\n"); // тут не помню откуда взял "support"
// помоему по барабану, любое слово.
if(substr(fgets($socket,256),0,3) != 250) return false; //
if(substr(fgets($socket,256),0,3) != 250) return false; // Количество этих
if(substr(fgets($socket,256),0,3) != 250) return false; // строк может различаться
if(substr(fgets($socket,256),0,3) != 250) return false; // я их тупо посмотрел
if(substr(fgets($socket,256),0,3) != 250) return false; // в логе The Bat.
if(substr(fgets($socket,256),0,3) != 250) return false; //
fputs($socket, "AUTH LOGIN\r\n");
if(substr(fgets($socket,256),0,3) != 334) return false;
fputs($socket, base64_encode($login)."\r\n");
if(substr(fgets($socket,256),0,3) != 334) return false;
fputs($socket, base64_encode($password)."\r\n");
if(substr(fgets($socket,256),0,3) != 235) return false;
fputs($socket, "MAIL FROM: <$from_mail>\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "RCPT TO: <$mail_to>\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "DATA\r\n");
if(substr(fgets($socket,256),0,3) != 354) return false;
fputs($socket, $SEND."\r\n.\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "QUIT\r\n");
if(substr(fgets($socket,256),0,3) != 221) return false;
fclose($socket);
return true;
}
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(13.01.2012 в 00:43)
| | Спасибо, очень интересная функция!
Непонятно только, для чего вообще многократное повторение строки
if(substr(fgets($socket,256),0,3) != 250) return false;
|
И еще: как видоизменть код для передачи в кодировке 1251?
Кстати, используя return false; можно ли получить сообщение о том, что почта отправлена (или не отправлена)? | |
|
|
|
|
|
|
|
для: Владимир55
(13.01.2012 в 10:58)
| | > Непонятно только, для чего вообще многократное повторение строки
Это проверка правильности ответов сервера. Т.е. вы обращаетесь к серверу и у вашего скрипта состоится с ним примерно такой диалог:
# Скрипт открывает сокет.
# Сервер отвечает:
220 OK
# Скрипт здоровается:
EHLO smtp.server.ru
# Сервер отвечает и в несколько строк сообщает правила общения с ним, такие как способы
# авторизации и что-то там еще. Чтобы продолжить общение нужно дослушать его, поэтому
# несколько строк:
250 hello script
250 auth так-то и так-то
250 не помню че еще
# Скрипт говорит как он будет авторизовываться:
AUTH LOGIN
# Сервер не против:
334 OK. Input login
# Скрипт представляется:
Vasya
# Сервер соглассен
334 OK. Input password.
# Скрипт вводит
Parol
# Ну и так далее......
| И каждый ответ сервера, чтоб не думать согласен он или нет, начинается с кода ответа, по которому мы и определяем все ли в порядке.
> Кстати, используя return false; можно ли получить сообщение о том, что
> почта отправлена (или не отправлена)?
Именно для этого я это и сделал. Т.е. вызов производим так:
<?
if( smtpmail( "adres@mail.ru", "Тема письма", "Текст письма", "Вася Иванов", "admin@server.ru" ) ){
echo "Письмо отправлено";
}
else{
echo "Произошла ошибка";
}
?>
|
> как видоизменть код для передачи в кодировке 1251?
Можно так:
<?php
function smtpmail($mail_to,$subject,$message,$from_name,$from_mail){
$smtp_server = "smtp.server.ru"; // реальные данные
$login = "login"; // любого вашего
$password = "password"; // реального ящика
$encoding = "windows-1251";
$SEND = "Date: ".date("r")."\r\n";
$SEND .= "Subject: =?$encoding?B?".base64_encode($subject)."?=\r\n";
$SEND .= "Reply-To: <$from_mail>\r\n";
$SEND .= "MIME-Version: 1.0\r\n";
$SEND .= "Content-Type: text/plain; charset=\"$encoding\"\r\n";
$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
$SEND .= "From: \"=?$encoding?B?".base64_encode($from_name)."?=\" <$from_mail>\r\n";
$SEND .= "To: <$mail_to>\r\n";
$SEND .= "X-Priority: 3\r\n\r\n";
$SEND .= $message."\r\n";
if(!$socket = fsockopen($smtp_server,25,$errno,$errstr,30)) return false;
if(substr(fgets($socket,256),0,3) != 220) return false;
fputs($socket, "EHLO $smtp_server\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false; //
if(substr(fgets($socket,256),0,3) != 250) return false; // Количество этих
if(substr(fgets($socket,256),0,3) != 250) return false; // строк может различаться
if(substr(fgets($socket,256),0,3) != 250) return false; // я их тупо посмотрел
if(substr(fgets($socket,256),0,3) != 250) return false; // в логе The Bat.
if(substr(fgets($socket,256),0,3) != 250) return false; //
fputs($socket, "AUTH LOGIN\r\n");
if(substr(fgets($socket,256),0,3) != 334) return false;
fputs($socket, base64_encode($login)."\r\n");
if(substr(fgets($socket,256),0,3) != 334) return false;
fputs($socket, base64_encode($password)."\r\n");
if(substr(fgets($socket,256),0,3) != 235) return false;
fputs($socket, "MAIL FROM: <$from_mail>\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "RCPT TO: <$mail_to>\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "DATA\r\n");
if(substr(fgets($socket,256),0,3) != 354) return false;
fputs($socket, $SEND."\r\n.\r\n");
if(substr(fgets($socket,256),0,3) != 250) return false;
fputs($socket, "QUIT\r\n");
if(substr(fgets($socket,256),0,3) != 221) return false;
fclose($socket);
return true;
}
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(13.01.2012 в 15:50)
| | Долго не получалось, пока не осознал, что у хостера закрыт порт 25. Теперь всё ОК!
Моя коллекция замечательных решений полонилась ещё одним, за что Вам большое спасибо! | |
|
|
|
|
|
|
|
для: Владимир55
(15.01.2012 в 13:28)
| | решил попробовать, не получается отпарвить. все данные верны. порт я не трогал.
он 25 у меня.
пишет: Произошла ошибка
есть идеи? | |
|
|
|
|
|
|
|
для: intreb
(26.11.2013 в 23:00)
| | замените все "return false" на более информативные ответы и добавьте везде вывод ответов сервера, тогда можно будет что-то понять:
<?php
// .........
if(!$socket = fsockopen($smtp_server,25,$errno,$errstr,30)){
echo "ошибка открытия сокета";
return false;
}
echo $answer = fgets($socket,256);
if(substr($answer,0,3) != 220){
echo "Не верный ответ сервера после подключения";
return false;
}
// и т.д. до конца скрипта ....
|
| |
|
|
|
|