Форумы портала PHP.SU » Разное » Обсуждение статей » Отправка писем через SMTP с авторизацией

Страниц (1): [1]
 

1. Deno - 31 Мая, 2013 - 15:21:32 - перейти к сообщению
Взял исходник http://www.php.su/articles/?cat=email&page=007:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function get_data($smtp_conn)
  4.  {
  5. $data="";
  6.  while($str = fgets($smtp_conn,515))
  7.  {
  8. $data .= $str;
  9.  if(substr($str,3,1) == " ") { break; }
  10.  }
  11.  return $data;
  12.  }
  13.  
  14. $header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
  15. $header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <login@mail.ru>\r\n";
  16. $header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
  17. $header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <login@mail.ru>\r\n";
  18. $header.="X-Priority: 3 (Normal)\r\n";
  19. $header.="Message-ID: <172562218.".date("YmjHis")."@mail.ru>\r\n";
  20. $header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Сергей')))."?= <qwe@asd.ru>\r\n";
  21. $header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n";
  22. $header.="MIME-Version: 1.0\r\n";
  23. $header.="Content-Type: text/plain; charset=windows-1251\r\n";
  24. $header.="Content-Transfer-Encoding: 8bit\r\n";
  25.  
  26. $text="привет, проверка связи.";
  27.  
  28. $smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);
  29.  if(!$smtp_conn) {print "соединение с серверов не прошло"; fclose($smtp_conn); exit;}
  30. $data = get_data($smtp_conn);
  31. fputs($smtp_conn,"EHLO mail.ru\r\n");
  32. $code = substr(get_data($smtp_conn),0,3);
  33.  if($code != 250) {print "ошибка приветсвия EHLO"; fclose($smtp_conn); exit;}
  34. fputs($smtp_conn,"AUTH LOGIN\r\n");
  35. $code = substr(get_data($smtp_conn),0,3);
  36.  if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;}
  37.  
  38. fputs($smtp_conn,base64_encode("login")."\r\n");
  39. $code = substr(get_data($smtp_conn),0,3);
  40.  if($code != 334) {print "ошибка доступа к такому юзеру"; fclose($smtp_conn); exit;}
  41.  
  42.  
  43. fputs($smtp_conn,base64_encode("password")."\r\n");
  44. $code = substr(get_data($smtp_conn),0,3);
  45.  if($code != 235) {print "не правильный пароль"; fclose($smtp_conn); exit;}
  46.  
  47. fputs($smtp_conn,"MAIL FROM:login@mail.ru\r\n");
  48. $code = substr(get_data($smtp_conn),0,3);
  49.  if($code != 250) {print "сервер отказал в команде MAIL FROM"; fclose($smtp_conn); exit;}
  50.  
  51. fputs($smtp_conn,"RCPT TO:qwe@asd.ru\r\n");
  52. $code = substr(get_data($smtp_conn),0,3);
  53.  if($code != 250 AND $code != 251) {print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit;}
  54.  
  55. fputs($smtp_conn,"DATA\r\n");
  56. $code = substr(get_data($smtp_conn),0,3);
  57.  if($code != 354) {print "сервер не принял DATA"; fclose($smtp_conn); exit;}
  58.  
  59. fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n");
  60. $code = substr(get_data($smtp_conn),0,3);
  61.  if($code != 250) {print "ошибка отправки письма"; fclose($smtp_conn); exit;}
  62.  
  63. fputs($smtp_conn,"QUIT\r\n");
  64. fclose($smtp_conn);
  65. ?>
  66.  


Подставил все данные, авторизацию прошёл успешно но выдаёт "ошибка отправки письма". В чём может быть проблема?
2. caballero - 31 Мая, 2013 - 17:25:52 - перейти к сообщению
а в чем великий смысл работы с протоколом SMTP напрямую?
3. anton17 - 03 Октября, 2014 - 19:34:34 - перейти к сообщению
А что означает если появляется такая ошибка?
сервер отказал в команде MAIL FROM
4. dcc0 - 03 Октября, 2014 - 19:59:38 - перейти к сообщению
Скорее всего - 550 5.1.3 Bad e-mail address syntax.
Если это mail.ru
(Добавление)
А не, скорее, вот это ближе к реальности:
SMTP is available only with SSL or TLS connection enabled

В общем надо искать способ воспользовться ssl для php,
например, openssl
5. anton17 - 04 Октября, 2014 - 15:49:09 - перейти к сообщению
Да почта mail, а как от нее избавиться?
6. anton17 - 06 Октября, 2014 - 18:39:58 - перейти к сообщению
Вот такую ошибку выдает

550 - The requested command failed because the user's mailbox was unavailable (such as not found))

Это ошибка означает, что mail за спам считает? или что эта ошибка означает
7. dcc0 - 07 Октября, 2014 - 11:49:37 - перейти к сообщению
Это означает, что требуется tls для команды mail from
Типа starttls, только просто его включение ничего не даст, нужно установить защищенное соединение до входа
8. anton17 - 09 Октября, 2014 - 09:49:03 - перейти к сообщению
а можно по подробнее про это? или ссылочку)
9. dcc0 - 09 Октября, 2014 - 15:47:45 - перейти к сообщению
Для начала
http://en[dot]wikipedia[dot]org/wiki/STARTTLS
(Добавление)
Я так понимаю, в общем ситуация такая. Если через telnet,
то после команды starttls нужно еще раз дать ehlo mail.ru,
но соединение с mail.ru обрывается, по всей видимости, на этом этапе нужен handshake
Т.е. вообще получается что нужно так в php: fsockopen("ssl://smtp.mail.ru", 25)
или sslv2 или sslv3
Но я пока не совсем понял, как нужно настроить ssl
В php.ini вроде все включено.
Ошибка вылетает такая:
SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL

Т.е. что не настроено для ssl
(Добавление)
http://php.net/manual/ru/transports.inet.php
10. Мелкий - 09 Октября, 2014 - 17:04:10 - перейти к сообщению
Блин, ответьте на неимоверно логичный вопрос полуторагодичной давности:
caballero пишет:
а в чем великий смысл работы с протоколом SMTP напрямую?
11. dcc0 - 09 Октября, 2014 - 17:06:49 - перейти к сообщению
В общем нашел решение:
Так работает c mail.ru
Меняйте
$smtp_conn = fsockopen("ssl://smtp.mail.ru", 465,$errno, $errstr, 10)

Меликий, я считаю скрипт наверху учебным - в этом весь глубинный смысл.
Человек посмотрел на него, поковырял, изучил ошибки, может, почитал rfc
и спокойно перешел на mail() и MTA типа sendmail, postfix, exim
Вариант 2, какой-то очень экзотический вариант, когда не можно mail и MTA
Я не знаю, что это может быть за ситуация.
12. anton17 - 09 Октября, 2014 - 18:19:53 - перейти к сообщению
dcc0Спасибо большое заработало
13. dcc0 - 09 Октября, 2014 - 18:51:07 - перейти к сообщению
anton17, только все ли в порядке с кодировкой?
По-моему надо переделывать для mail.ru
14. anton17 - 09 Октября, 2014 - 19:04:59 - перейти к сообщению
С кодировкой все хорошо, работает как часы

 

Powered by ExBB FM 1.0 RC1