Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция mail и smtp
 
 автор: Владимир55   (12.01.2012 в 18:53)   письмо автору
 
 

Администратор хостинга неожиданно заблокировал функцию mail (я как раз в это время настраивал систему с почтовым взаимодействием между сайтами и чуть с ума не сошел в поисках причины того, почему вся система заткнулась! ). Причем, заблокировал не персонально у меня, а на всем сервере.

Какие-то невнятные объяснения, связанные со спамфильтрами. Или типа того, что функция mail непрогрессивна, или устарела. Что-то такое.

И предлагается использовать smtp (я даже не знаю, что это. Вероятно, связь через сокеты?).

Хотелось бы понять: что, действительно от mail лучше уходить к этой самой smtp?

  Ответить  
 
 автор: Sfinks   (13.01.2012 в 00:43)   письмо автору
 
   для: Владимир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($socketbase64_encode($login)."\r\n");
    if(
substr(fgets($socket,256),0,3) != 334) return false;
    
fputs($socketbase64_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;
  }
  
?>

  Ответить  
 
 автор: Владимир55   (13.01.2012 в 10:58)   письмо автору
 
   для: Sfinks   (13.01.2012 в 00:43)
 

Спасибо, очень интересная функция!

Непонятно только, для чего вообще многократное повторение строки
if(substr(fgets($socket,256),0,3) != 250) return false; 

И еще: как видоизменть код для передачи в кодировке 1251?

Кстати, используя return false; можно ли получить сообщение о том, что почта отправлена (или не отправлена)?

  Ответить  
 
 автор: Sfinks   (13.01.2012 в 15:50)   письмо автору
 
   для: Владимир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($socketbase64_encode($login)."\r\n"); 
    if(
substr(fgets($socket,256),0,3) != 334) return false
    
fputs($socketbase64_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
  } 
?>

  Ответить  
 
 автор: Владимир55   (15.01.2012 в 13:28)   письмо автору
 
   для: Sfinks   (13.01.2012 в 15:50)
 

Долго не получалось, пока не осознал, что у хостера закрыт порт 25. Теперь всё ОК!

Моя коллекция замечательных решений полонилась ещё одним, за что Вам большое спасибо!

  Ответить  
 
 автор: intreb   (26.11.2013 в 23:00)   письмо автору
 
   для: Владимир55   (15.01.2012 в 13:28)
 

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

он 25 у меня.

пишет: Произошла ошибка
есть идеи?

  Ответить  
 
 автор: Sfinks   (27.11.2013 в 08:53)   письмо автору
 
   для: 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;
    }
    
// и т.д. до конца скрипта ....

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования