Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Отправка Content type через smtp
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Отправка Content type через smtp

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

1. xTODx - 04 Августа, 2015 - 00:01:57 - перейти к сообщению
Всем привет, сразу скажу, гуглин, кое-что нашёл

Вот что есть
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. function send_smtp($login, $pwd, $from,$to,$subject,$message){
  4.  
  5.         header('Content-Type: text/plain;');
  6.         error_reporting(E_ALL ^ E_WARNING);
  7.         ob_implicit_flush();
  8.  
  9.         $address = 'mail.site.com.ua'; // адрес smtp-сервера
  10.         $port    = 25;          // порт (стандартный smtp - 25)
  11.        
  12.         try {
  13.                
  14.                 // Создаем сокет
  15.                 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  16.                 if ($socket < 0) {
  17.                         throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
  18.                 }
  19.  
  20.                 // Соединяем сокет к серверу
  21.                 echo 'Connect to \''.$address.':'.$port.'\' ... ';
  22.                 $result = socket_connect($socket, $address, $port);
  23.                 if ($result === false) {
  24.                         throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
  25.                 } else {
  26.                     echo "OK\n";
  27.                 }
  28.                
  29.                 // Читаем информацию о сервере
  30.                 read_smtp_answer($socket);
  31.                
  32.                 // Приветствуем сервер
  33.                 write_smtp_response($socket, 'EHLO '.$login);
  34.                 read_smtp_answer($socket); // ответ сервера
  35.                
  36.                 echo 'Authentication ... ';
  37.                        
  38.                 // Делаем запрос авторизации
  39.                 write_smtp_response($socket, 'AUTH LOGIN');
  40.                 read_smtp_answer($socket); // ответ сервера
  41.                
  42.                 // Отравляем логин
  43.                 write_smtp_response($socket, base64_encode($login));
  44.                 read_smtp_answer($socket); // ответ сервера
  45.                
  46.                 // Отравляем пароль
  47.                 write_smtp_response($socket, base64_encode($pwd));
  48.                 read_smtp_answer($socket); // ответ сервера
  49.                
  50.                 echo "OK\n";
  51.                 echo "Check sender address ... ";
  52.                
  53.                 // Задаем адрес отправителя
  54.                 write_smtp_response($socket, 'MAIL FROM:<'.$from.'>');
  55.                 read_smtp_answer($socket); // ответ сервера
  56.                
  57.                 echo "OK\n";
  58.                 echo "Check recipient address ... ";
  59.                
  60.                 // Задаем адрес получателя
  61.                 write_smtp_response($socket, 'RCPT TO:<'.$to.'>');
  62.                 read_smtp_answer($socket); // ответ сервера
  63.                
  64.                 echo "OK\n";
  65.                 echo "Send message text ... ";
  66.                
  67.                 // Готовим сервер к приему данных
  68.                 write_smtp_response($socket, 'DATA');
  69.                 read_smtp_answer($socket); // ответ сервера
  70.                
  71.                 // Отправляем данные
  72.                 $message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя"
  73.                 $message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения"
  74.                 write_smtp_response($socket, $message."\r\n.");
  75.                 read_smtp_answer($socket); // ответ сервера
  76.                
  77.                 echo "OK\n";
  78.                 echo 'Close connection ... ';
  79.                
  80.                 // Отсоединяемся от сервера
  81.                 write_smtp_response($socket, 'QUIT');
  82.                 read_smtp_answer($socket); // ответ сервера
  83.                
  84.                 echo "OK\n";
  85.                
  86.         } catch (Exception $e) {
  87.                 echo "\nError: ".$e->getMessage();
  88.         }
  89.        
  90.         if (isset($socket)) {
  91.                 socket_close($socket);
  92.         }
  93.        
  94.         }
  95. // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
  96.         function read_smtp_answer($socket) {
  97.                 $read = socket_read($socket, 1024);
  98.                
  99.                 if ($read{0} != '2' && $read{0} != '3') {
  100.                         if (!empty($read)) {
  101.                                 throw new Exception('SMTP failed: '.$read."\n");
  102.                         } else {
  103.                                 throw new Exception('Unknown error'."\n");
  104.                         }
  105.                 }
  106.         }
  107.        
  108.         // Функция для отправки запроса серверу
  109.         function write_smtp_response($socket, $msg) {
  110.                 $msg = $msg."\r\n";
  111.                 socket_write($socket, $msg, strlen($msg));
  112.         }
  113.  

так то всё отправляет, только вот без htmlНедовольство, огорчение
нужно отправить заголовок
вот что пытался добавить исходя из прочтённого перед отправкой данных, не выходит, просто виснет(
PHP:
скопировать код в буфер обмена
  1.  
  2. // Заголовки
  3.                 write_smtp_response($socket, 'Content-type: text/html; charset=utf-8l');
  4.                 read_smtp_answer($socket); // ответ сервера
  5.  
2. Мелкий - 04 Августа, 2015 - 10:22:31 - перейти к сообщению
И параметры mail вручную форматируют, и multipart/mixed сами пишут, и даже вот, пишут что-то странное напрямую на сокетах.
Чем только не занимаются, лишь бы не взять какую-нибудь стандартную, давно отлаженную библиотеку. PHPMailer тот же, например.
3. xTODx - 04 Августа, 2015 - 11:20:26 - перейти к сообщению
Мелкий пишет:
И параметры mail вручную форматируют, и multipart/mixed сами пишут, и даже вот, пишут что-то странное напрямую на сокетах.
Чем только не занимаются, лишь бы не взять какую-нибудь стандартную, давно отлаженную библиотеку. PHPMailer тот же, например.

спасибо, в следующий раз буду использовать её, сейчас же вопрос в другом.
как задать заголовок?
4. Мелкий - 04 Августа, 2015 - 11:39:34 - перейти к сообщению
read_smtp_answer делает socket_read. Дополнительной настройки нет. Значит это тупой блокирующий вызов. Он будет ждать ответ сервера пока не протухнет соединение. А сервер, очевидно, ничего не отвечает, т.к. ждёт информацию от вас.
Добавьте заголовок к имеющимся Subject и To.
5. xTODx - 05 Августа, 2015 - 08:12:36 - перейти к сообщению
Мелкий пишет:
read_smtp_answer делает socket_read. Дополнительной настройки нет. Значит это тупой блокирующий вызов. Он будет ждать ответ сервера пока не протухнет соединение. А сервер, очевидно, ничего не отвечает, т.к. ждёт информацию от вас.
Добавьте заголовок к имеющимся Subject и To.

спасибо, пошёл читать PHPMailer

 

Powered by ExBB FM 1.0 RC1