Отправка писем через SMTP с авторизацией на php

Отправка писем через SMTP с авторизацией на phpВ этой статье я хочу показать как можно сделать отправку писем из php через smtp сервер на примере smtp.yandex.ru
Иногда бывает такое, что на хостинге запрещено отсылать письма стандартными средствами — mail(), такое в основном бывает на бесплатных хостингах :) Так же бывает необходимость слать почту через smtp и на серверах, по ряду различных причин.

Приступим к реализации, для выполнения отправки через smtp потребуется возможность работы php с сокетами. Код получился большой и для удобства я его оформил в отдельный класс, который можно скачать тут.

Ниже пример использования класса:

// пример использования
require_once "SendMailSmtpClass.php"; // подключаем класс

$mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'smtp.yandex.ru', 'Evgeniy'); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');

// заголовок письма
$headers= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
$headers .= "From: Evgeniy <admin@vk-book.ru>\r\n"; // от кого письмо
$result =  $mailSMTP->send('zhenikipatov@yandex.ru', 'Тема письма', 'Текст письма', $headers); // отправляем письмо
// $result =  $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма');
if($result === true){
    echo "Письмо успешно отправлено";
}else{
    echo "Письмо не отправлено. Ошибка: " . $result;
}

Обновление 30.09.2014
В последнее время Яндекс не работает через простой сокет, только через SSL, поэтому следует использовать вот такой код для вызова класса:

$mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Evgeniy', 465);

Обновление 1.10.2014
Обновлен класс. Теперь корректно происходит работа с почтовым сервером mail.ru по SSL протоколу.
Так же для корректной работы с mail.ru необходимо в заголовках письма в отправителе указывать e-mail, с которого происходит отправка, например:
Если авторизация происходит через e-mail ipatovsoft@mail.ru, то заголовок должен выглядеть следующим образом:

$headers .= "From: Evgeniy <ipatovsoft@mail.ru>\r\n"; // от кого письмо

Обновление 2.10.2014
Класс подредактирован, теперь работает и с gmail.com через протокол SSL
Пример:

$mailSMTP = new SendMailSmtpClass('ipatovsoft@gmail.com', '*****', 'ssl://smtp.gmail.com', 'Evgeniy', 465);

Так же вы можете почитать об обновленном классе и работе через протокол ssl в новой статье: Отправка писем через SMTP с авторизацией по протоколу SSL на php.

Обновление 13.03.2018: Класс обновился, подробнее тут: Новая версия класса SendMailSmtpClass

Рассказать друзьям:


Оценить:
(7 оценок, среднее: 5,00 из 5)

Отправка писем через SMTP с авторизацией на php: 112 комментариев

  1. Добрый день, а вот у меня не работает на mail.ru, ошибка выходит did’t send.
    Если возможно попробуйте протестировать на мое мыло.

  2. Здравствуйте. Все гуд. Но когда пишешь ОТ КОГО например «Денис» у яндекса отображается Денис, то когда нажимаешь на само письмо, мол типо подробнее, то там вместо имени кракозябры…не понимаю почему.

    1. Я с таким не сталкивался, попробуйте поэксперементировать с кодировкой текста. возможно яндексу нужна win-1251, можно задать с помощью функции iconv

  3. У меня такая проблема…
    Я изменил порт на 465
    Хост указал ssl://smtp.yandex.ru

    Письмо не отправлено. Ошибка: Autorization error

    1. Попробовал сейчас совершить отправку по ssl — все работает. Вы так задавали адрес и порт? :

      $mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Evgeniy', 465);

  4. раньше работало норм а теперь выдает ошибку MAIL FROM. на всех серверах, что это может значит, как исправить?

    1. Это потому, что яндекс почтовик теперь работает только по ssl
      можете отправлять вот так теперь(задать ssl в хосте и порт должен быть 465):

      $mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Evgeniy', 465); // создаем экземпляр класса

  5. admin, мэйл.ру тоже начал работать через ssl но ему почему то не получается отправить!
    Подскажешь?

    1. Добрый день.
      Сейчас попробовал, действительно через мейл не работает. Сегодня попробую поправить, об результатах сообщу вечером.

    2. Я разобрался с mail.ru. Можно реализовать отправку через него по SSL протоколу.
      Mail оказался привередливее Яндекса. Во-первых, когда происходит представление почтовому серверу — запрос «HELO», необходимо передавать хост, с которого происходит отправка. Это необходимо подправить в самом классе:
      Строку:

      fputs($socket, "HELO " . $this->smtp_host . "\r\n");

      Необходимо заменить на такую:

      $host_name = "vk-book.ru"; // хост с которого происходит отправка письма
      fputs($socket, "HELO $host_name\r\n");

      Во-вторых, обязательно в заголовках письма в отправителе «From» указывать ящик, с которого происходит авторизация:
      То есть, вот эту строку:

      $headers .= "From: Evgeniy <admin@vk-book.ru>\r\n"; // от кого письмо

      Необходимо, либо вообще удалить, либо заменить на такую:

      $headers .= "From: Evgeniy <ipatovsoft@mail.ru>\r\n"; // от кого письмо

      Где, ipatovsoft@mail.ru — это почта с которой я авторизовывался.

      Если будут еще вопросы пишите )
      Сейчас это ввсе в виде комментария, но в ближайшем будущем, я это перенесу в статью.

  6. admin, как всегда вы на высоте без всякого сомнения! Спасибо супер работает.
    Давайте может найдем панацею и сделаем еще и для Gmail.
    Настройки у них такие же ssl://smtp.gmail.com но та же ошибка MAIL FORM.

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

    У вас в свободном доступе сейчас класс который работает лучше через PHPMailer со всеми своими библиотеками :)

    1. Ага, хорошая идея с гуглом. я вчера тоже об этом подумал, только некогда было разбираться. Сегодня вечером покопаюсь, о результатах отпишусь ближе к ночи.

  7. Добрый день!
    С mail.ru работает нормально, но возник вопрос: как прикрепить файл(ы) к письму?
    Спасибо!

  8. admin, Просто супер! жду не дождусь.

    Скажите пожалуйста, не по теме, как сделать счетчик на PHP который считал бы только людей реальных. Игнорировал роботов или парсинг страницы с какой-то программы. Знаю это реально, подскажите ?

    1. Чуть чуть не так вырозился. Счетчик который считает не людей а показы страниц!
      Я нашел вот такой код. Это про счетчик.

      $se_mask = «(Yandex|Googlebot|StackRambler|Yahoo Slurp|WebAlta|msnbot)»;
      if (!ereg($se_mask,$_SERVER[‘HTTP_USER_AGENT’])) {
      тут код +1 показ к странице.
      }

      проверяем робот ли к нам пришел, если НЕТ то +1 к показу. Но вот ereg в php 5.3.0 уже не используется.

    2. Нашел решение! Как думаете прокатит ?

      $se_mask = «(Yandex|Googlebot|StackRambler|Slurp|MSNBot|Teoma|Scooter|ia_archiver
      |Lycos|Mail.Ru|Aport|WebAlta|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google
      |Adsbot-Google|MSNBot-NewsBlogs|MSNBot-Products|MSNBot-Media|Yahoo Slurp|msnbot)»;
      if (!preg_match($se_mask,$_SERVER[‘HTTP_USER_AGENT’])) {
      echo ‘YES’;
      } else {
      echo ‘NOT’;
      }

      1. Думаю, что должно прокатить. По хорошему, было бы не плохо сделать скрипт на сайт, который будет в течении, например, месяца собирать в базу все юзер агенты посетителей блога. И потом на основе этих данных уже можно будет составить более точное регулярное выражение. Поскольку не известно какие точно юзер агенту у ботов.
        А так на вскидку я бы добавил в Ваш код еще перевод полученного юзер агента в нижний регистр и в регулярке бы все данные написал с маленькой букву. Поскольку данные могут меняться, и если хотя бы один символ сменит регистр уже регулярка не сработает.

    3. Я подправил класс, теперь и с gmail.com работает, проверял с трех ящиков. Попробуйте, работает нормально?

  9. Огромное спасибо автору поста!
    Если бы хотя ты половина русских программистов оформляла свои посты подобным образом (подробные комментарии простыми словами), Мир бы точно стал лучше!

  10. При отправке писем переносы строк в сообщении игнорируются и письмо (текст) приходит без переносов.

    Пожалуйста, помогите мне разобраться в этой ситуации.

  11. Здравствуйте, ну никак не могу запустить на mail.ru.
    В классе исправил:

    #$server_name = $_SERVER["SERVER_NAME"];
    fputs($socket, "HELO mail.ru\r\n");
    if (!$this->_parseServer($socket, "250"))
    {
    fclose($socket);
    throw new Exception('Error of command sending: HELO'."\n");
    }
    else
    {
    echo "HELO is OK"."\n";
    }

    Вызов класса вот такой:

    function SentMyMail($from, $to, $subj, $text, $file)
    {
    require_once "SendMailSmtpClass.php"; // подключаем класс
    $mailSMTP = new SendMailSmtpClass('login@mail', 'password', 'ssl://smtp.mail.ru', 'login@mail.ru', 465);
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: UITRK \r\n";
    $result = $mailSMTP->send($to, $subj, $file, $headers);
    if($result === true){
    echo "Message sent successfully!";
    }else{
    echo "Message was not sent. Error: " . $result;
    }
    }

    Вывод результата такой(Я подправил немного вывод для ясности ситуации):

    HELO is OK
    LOGIN is OK
    smtp_username is OK
    Message was not sent. Error: Autorization error password
    +OK POP3 server at mail.ru signing off

    1. Когда происходит приветствие почтового сервера, нужно указывать свой хост, а не майл.ру
      То есть в сроке

      fputs($socket, "HELO mail.ru\r\n");

      вместо mail.ru пропишите свой хост, с которого происходит обращение. Там же было в классе:

      $server_name = $_SERVER["SERVER_NAME"];
      fputs($socket, "HELO $server_name\r\n");

      1. Скрипт я запускаю из под Debian и там он ругается на этот параметр. Не может его получить. Просвятите меня, если не трудно, этот параметр получается от почты к которой я подключаюсь или этот параметр должен отправлять мой сервер на mail.ru?

      2. На сколько я понял, параметр $_SERVER[«SERVER_NAME»] возвращается только в вэб режиме. Подскажите как мне быть в моем случае, у меня скрипт запускается через командную строку.

        1. Замените его любой другой строкой, например ‘ivan’. А лучше, хостом с которого отправляете, например ‘mail.ru’.

  12. Добавил SSL как в примере и вот «Письмо не отправлено. Ошибка: 24.Unable to find the socket transport «ssl» — did you forget to enable it when you configured PHP?»

      1. Спасибо за помощь, проблема решена.
        $server_name = $_SERVER[«SERVER_NAME»];
        fputs($socket, «HELO $server_name\r\n»);
        заменил на:
        fputs($socket, «EHLO mail.ru\r\n»);

        И все заработало)

    1. Я с такой ошибкой сталкивался, тебе нужно в настройках конфигурации самого PHP подключить модуль работы с SSL.
      Вот здесь есть мануал для видоуз)) http://open-server.ru/forum/viewtopic.php?f=1&t=1093
      Что делал для решения:
      1) Раскоментил строку в php.ini extension=php_openssl.dl
      2) Скачал необходимые библиотеки libeay32.dll и ssleay32.dll, забросил их в директорию C:\WINDOWS\system32\inetsrv
      3) Добавил Пути к php и php/ext в path
      4) Ребутил сервер и винду
      5) Скачал и установил openSSl в виде инсталлера

      Попробуй, должно помочь)

  13. На Debian все работает отлично. Не получается запустить скрипт на Windows, как я понимаю проблема с сертификатом. Не знаете как победить такую ошибку?

    PHP Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
    error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in D:\script_temp.php on line 209

      1. Это не на отправку, а на прием ругается.

        $pop_conn = fsockopen("ssl://pop.mail.ru", 995,$errno, $errstr, 10);
        $code =fgets($pop_conn,1024);
        check_code($code, 'The connection is established', 'Failed to connect to server');

        Извиняюсь что сразу код не вставил. Ругается на 1 строку

  14. Здравстввуйте. Помогите, пожалуйста. Проблема с обратной связью для пользователей. Отправку сообщений через SMTP настроил успешно, но сообщение,которое приходит на e-mail, отображается крякозябрами в виде:
    пїЅпїЅпїЅпїЅпїЅпїЅ,

    пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ

    Что сделать нужно, чтобы это исправить?

    1. Здравствуйте,
      Это проблема с кодировкой.
      В примере письмо отправляется в кодировке UTF-8. И текст письма должен иметь такую же кодировку. В какой кодировке ваш сайт, какая кодировка у скриптов? Если используете windows-1251, то попробуйте задать в заголовках письма такую же:

      $headers .= "Content-type: text/html; charset=cp1251\r\n";

      или

      $headers .= "Content-type: text/html; charset=windows-1251\r\n";

      1. На сайте кодировка windows-1251,в базе данных письма в той же кодировке. На сайте все правильно отображается. А в письмах по емейл — нет. А где нужно в заголовках письма добавить эти строки? Где они находятся?

        1. Это меняется в коде отправки. Код будет выглядеть вот так:

          // пример использования
          require_once "SendMailSmtpClass.php"; // подключаем класс

          $mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'smtp.yandex.ru', 'Evgeniy'); // создаем экземпляр класса
          // $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');

          // заголовок письма
          $headers= "MIME-Version: 1.0\r\n";
          $headers .= "Content-type: text/html; charset=windows-1251\r\n"; // кодировка письма
          $headers .= "From: Evgeniy \r\n"; // от кого письмо
          $result = $mailSMTP->send('zhenikipatov@yandex.ru', 'Тема письма', 'Текст письма', $headers); // отправляем письмо
          // $result = $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма');
          if($result === true){
          echo "Письмо успешно отправлено";
          }else{
          echo "Письмо не отправлено. Ошибка: " . $result;
          }

          В коде жирным выделил строку ,в которой задается кодировка

          1. А где этот код находится, в каком файле? не могу найти…

          2. Это я написал весь код отправки для вашей кодировки. Код из статьи. Вы же говорите, что у вас отправка происходит — код который вы использовали при отправки, просто необходимо подправить — заменить только одну строку.
            Если Вы копировали код из статьи поищите так такую строку:

            $headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма

            И замените на такую:

            $headers .= "Content-type: text/html; charset=windows-1251\r\n"; // кодировка письма

  15. Спасибо за труд, работает прекрасно.

    ЗЫ. есть возможность отправлять и прикреплять файлы к письму?

    1. Здравствуйте, пока файлы с помощью этого класса отправлять нельзя. Как время будет посвободней, допишу.

  16. Выдает такую ошибку: РџРёСЃСЊРјРѕ РЅРµ отправлено. Ошибка: Autorization errorРџРёСЃСЊРјРѕ успешно отправлено

    Хотя письмо отправляется

  17. Добрый день! Я уже достаточно давненько ознакомился с Вашим классом и во многом изменил его под свои нужды. Разобрался, как отправлять письма с mail, gmail, yandex, rambler, qip, yahoo… Но уже длительное время бьюсь с почтовым сервисом HOTMAIL — безрезультатно!
    Для меня это уже стало принципиальным делом… Сможете ли Вы, используя или изменив свой класс, отправить письмо с этого почтового сервиса? И возможно ли это в принципе?

  18. Доброго времени суток!
    Использовал Ваш код для отправки форм с сайта На тестовом бесплатном хостинге всё работает При переносе на другой хост того же хостера код перестал работать Подскажите как вывести ошибки из вашего класса

  19. Огромное спасибо за класс. У меня на хостинге ограничение на phpmail, а вы выручили! Теперь шлю через яндекс.

  20. Здравствуйте. Попробовал Ваш класс, все работает с маил ру, единственное — тема письма приходит вот в таком виде: «=?utf-8?B?0YLQtdC80LA==?=»
    Пробовал заголовок и в утф и в виндовс 1251 и предварительно перекодировав текст темы в утф — тоже самое. Если тема на английском — то все ок. Где посмотреть, подскажите?

  21. Нашел где косяк: в файле SendMailSmtpClass.php заменил
    «$contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «=?=\r\n»;»
    на
    «//$contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «?=\r\n»;»
    т.е. убрал один лишний символ «=» и все стало хорошо.

    Автору спасибо за класс, возьму на вооружение!

  22. Спасибо огромное, все работает. Правда сообщения попадают в папку «спам». Вы не знаете с чем это связано и как это обойти?

  23. Большое спасибо за скрипт !
    Только вот не понятно откуда берётся переменная $responseServer на 126 строчке, у меня на неё ругается .

  24. Сделал всё, как Вы указали. Вот print_r экземпляра класса:
    ===============

    SendMailSmtpClass Object
    (
    [smtp_username] => endocrinologist@ya.ru
    [smtp_password] => **********
    [smtp_host] => ssl://smtp.yandex.ru
    [smtp_from] => Администрация MultyTask
    [smtp_port] => 465
    [smtp_charset] => utf-8
    )

    Но при попытке отправить письмо, жалуется на строку $result:
    Строка:
    $result = $mailSMTP->send($authArr['info']['email'], $SUBJECT, $TEXT, $headers);
    А вот жалоба:
    Parse error: syntax error, unexpected T_VARIABLE in V:\home\multytasker.ru\www\php_sendConfirm.php on line 24

    Уже все запятые, точки, точки с запятой проверил — не работает. Привожу пример кода:

    require_once "SendMailSmtpClass.php";
    require_once "_mainframes.inc";
    $mailSMTP = new SendMailSmtpClass($SMTP_USER, $SMTP_PASSWORD, $SMTP_SSL_YANDEX, $SMTP_NAME, 465);
    $SUBJECT = "Подтверждение E-mail";
    $TEXT = <<<EOD
    Текст1|\nЭтот текст после 'n'|
    А этот после переносаА этот после 'br', но до переноса
    А этот после 'br' и переноса
    EOD;
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
    $headers .= "From: ". $SMTP_NAME ." \r\n";
    $result = $mailSMTP->send($authArr['info']['email'], $SUBJECT, $TEXT, $headers);
    if($result === true)
    {
    echo '{"stat":1, "response":"Письмо отправлено"}';
    } else
    {
    echo '{"stat":0, "response":"Письмо не отправлено", "error":"'.$result.'"}';
    }

    1. Вроде бы разобрался. Само как-то ликвидировалось. Но возникла другая проблема — не отправляет вовсе, а через 30 секунд прерывает. Вот текст ошибки:

      Fatal error: Maximum execution time of 30 seconds exceeded in V:\home\multytasker.ru\www\SendMailSmtpClass.php on line 127

      А вот функция в классе, которая ее вызывает:

      private function _parseServer($socket, $response) {
      while (@substr($responseServer, 3, 1) != ' ') {
      if (!($responseServer = fgets($socket, 256))) { // это строка 127
      return false;
      }
      }
      if (!(substr($responseServer, 0, 3) == $response)) {
      return false;
      }
      return true;

      }

      Кстати, работаю с Денвера

      1. Поманипулировал с портами, работает без ошибок, но не работает авторизация. Через яндекс. Пробовал разные вариации smtpХост-Порт (ssl-25, NOssl-25, ssl-2525, NOssl-2525). В одних случаях говорит, что пароль неверный (хотя он верный). В других — снова зависал до set_time_limit…
        Но вот комбинация ssl-25 выдавало такую ошибку
        {"stat":0, "response":"Письмо не отправлено", "error":"0."}
        Вот это самое 0. и есть $result, которая обращается к mailSMTP->send().
        Помогите разобраться с проблемой

        1. Короче, все проблемы решил сам. Сам написал функцию по отправке, которая возвращает массив с данными. Всё работает. И без всякого ssl…

          1. Добрый день, можете поделится с народом которому интересно как вы это сделали?

  25. Огромное спасибо за информацию!
    Есть один вопрос, как отправить сразу на пару емейлов письмо?
    я думал можно так:

    $result = $mailSMTP->send('1email@gmail.com, 2email@gmail.com', 'gmail', $message, $headers);

    но так не работает, я просто дублирую строку

    $result = $mailSMTP->send('1email@gmail.com,', 'gmail', $message, $headers);
    $result = $mailSMTP->send('2email@gmail.com', 'gmail', $message, $headers)

    Так нормально или может есть какието другие способы?

  26. Письмо (html) отправляется только один раз потом ошибка: письмо не отправлено
    на какой адрес и с какого адреса его не шли

  27. Автору-респект! Завелся- с «копи-паста».

    Вопрос. А как имя получателя ввести?

  28. Очень полезное и удобное решение, однако заметил такую проблему, что письма приходят с полем КОМУ: undisclosed-recipients:;
    Так и не понял с чем связано. Получателя указываю правильно. Большая просьба дать ответ.

  29. Согласен, огромное спасибо, функция очень выручила, но без напильника не обошлось ))
    Оказывается gmail сейчас не дает просто так подключаться посторонним устройствам и в соответствии со своей политикой безопасности (где-то у них это прочитал) в таком случае выводят сообщение как-будто бы пароль не подходит, НО если включить на экран все ответы сервера, то в них он выдает ссылку на страницу описания проблемы и настроек, там можно нажать «включить доступ всем устройствам» (как-то так она называется) и тогда джимейл начнет пускать к себе скрипт, без этого у меня не работало. Остальные без проблем.

  30. В библиотеке содержится ошибка.
    В поле subject стоит лишний знак «=».
    вот в этой строке:
    $contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «=?=\r\n»;

    Должно быть так:

    $contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «?=\r\n»;

    то есть лишним оказывается символ ‘=’ в конце строки перед знаком вопроса.

    Из-за этой ошибки неправильно показывалась тема письма в thunderbolt.

    После исправления — все стало нормально.

    1. Владимир, я тебе отсосать готов за твой совет)) Спасибо)) Гребаные клиенты с гребаным тундерболтом.

  31. День добрый, подскажите пожалуйста что не так?, вот сам код..


    // пример использования
    require_once "SendMailSmtpClass.php"; // подключаем класс

    $mailSMTP = new SendMailSmtpClass('elekak2014@yandex.ru', '*********', 'ssl://smtp.yandex.ru', 'kromka', 465);
    // $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');

    $name = stripslashes($_POST['name']);
    $phone = stripslashes($_POST['phone']);
    $subject = 'Заявка с сайта - kromka.info!';
    $message = '

    Заявка с сайта

    Имя: '.$name.'
    Телефон : '.$phone.'

    ';

    // заголовок письма
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
    $headers .= "From: kromka \r\n"; // от кого письмо
    $result = $mailSMTP->send('elekak2012@yandex.ru', $subject, $message, $headers); // отправляем письмо
    // $result = $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма');
    if($result === true){
    echo "Письмо успешно отправлено";
    }else{
    echo "Письмо не отправлено. Ошибка: " . $result;
    }

    в файле класс ничего не менял.., при отправке пишет
    Письмо не отправлено. Ошибка: -22032.Unable to find the socket transport «ssl» — did you forget to enable it when you configured PHP?

    Заранее благодарен

  32. ВЫдаёт вот такое кто нибудь сталкивался ?

    Письмо не отправлено. Ошибка: 84855720.Unable to find the socket transport «ssl» — did you forget to enable it when you configured PHP?

  33. Всем привет, возможно кому-то поможет:
    Код не будет работать через консоль или по CRON, т.к. в 64й строке класса используется глобальная переменная СЕРВЕР (которой нет при запуске из консоли или по Крону).
    Для решения проблемы — вручную исправьте 64ю строку на что-то подобное:
    $server_name = ‘yoursite.zone’;

  34. Спасибо за код, работает супер!
    А как прикрепить картинку в тело письма, пробовал вставлять как HTML приходит битая картинка

  35. Доброго времени.

    Спасибо за код и его подробное описание.
    Подскажите как правильно отправить сообщение в несколько строк, принудительно выполнив перенос Amount = $tag2?

    <?php
    require_once "SendMailSmtpClass.php";
    $mailSMTP = new SendMailSmtpClass('00000@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Payment');
    $tag1 = "123";
    $tag2 = "456";
    $message1 = "Account = $tag1\nAmount = $tag2";
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: Payment \r\n»;
    $result = $mailSMTP->send(‘00000@yandex.ru’, ‘Тема письма’, $message1, $headers);
    if($result === true){
    echo «Письмо успешно отправлено»;
    }else{
    echo «Письмо не отправлено. Ошибка: » . $result;
    }

  36. Хорошая работа, admin.
    Рабочий код.
    Но я нашёл одну ошибку в системе.
    При отправлении небольшого письма, всё нормально.
    Но при содержимом письма, текста превышающего 1150 символов, у меня выходит ошибка.
    «Письмо не отправлено. Ошибка: E-mail didn’t sent»
    Вот здесь
    $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
    если в район ‘Текст письма’ вставлять текст более 1150 символов, например 2000 символов, у меня письмо отказывается отправляться. Проверял на сервере gmail и yandex.
    Можно ли обойти эти ограничения?
    Вся надежда на вас. Хочется отправлять полноценные письма. Ведь наши программы «The Bat» как-то отправляют большие письма…

    1. в Perl собрал скрипт, и там такая же проблема. Отправляет только маленькие письма.
      Help, подскажите где искать. Это у всех так? Может это мой провайдер что-то обрезает…

    2. Если у вас какая-то проблема, нужно сначала смотреть свой фаервол.
      Проблема решена! Можно удалить комментарий.

      …под дороге заметил:
      1) сервер Gmail при подставлении другого адреса From письмо отправляет, но подставу не показывает (Показывает истинный адрес отправителя)
      2) Mail.ru при подставлении другого адреса From письмо не отправляет вообще, выдаёт ошибку.
      вот бы как-нибудь перехитрить их, хочется чтобы мой адрес в письмах светился :)

  37. Добрый день! В чём может быть проблема? Ошибка:
    Gateway Time-out

    The gateway did not receive a timely response from the upstream server or application.

    Apache/2.2.15 (CentOS) Server at http://www.site.ru Port 80

    Код:
    // пример использования
    require_once «SendMailSmtpClass.php»; // подключаем класс

    $mailSMTP = new SendMailSmtpClass(‘1@gmail.com’, ‘***’, ‘ssl://smtp.gmail.com’, ‘Сергей’, 465);

    // заголовок письма
    $headers= «MIME-Version: 1.0\r\n»;
    $headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма
    $headers .= «From: Evgeniy \r\n»; // от кого письмо
    $result = $mailSMTP->send(‘1@yandex.ru’, ‘Тема письма’, ‘Текст письма’, $headers); // отправляем письмо
    // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
    if($result === true){
    echo «Письмо успешно отправлено»;
    }else{
    echo «Письмо не отправлено. Ошибка: » . $result;
    }

  38. Gmail не работает — ошибка: Autorization error
    $mailSMTP = new SendMailSmtpClass(‘login@gmail.com’, ‘root’, ‘ssl://smtp.gmail.com’, ‘Sergey’, 465);

  39. Добрый день! А как добавить скрытую копию к письму? (скрытого получателя?)
    Я прописала в заголовке письма
    $headers .= «From: \r\n»;
    $headers .= «Bcc: \r\n»;
    Письмо приходит непосредственно получателю, но тому, кто указан в скрытой копии -нет.

    1. Добрый день, smtp не отправляет письма получателям, которые прописаны в заголовках $headers. Эта информация нужна для отображения в письме получателя. Чтобы отправить скрытую второму получателю, просто продублируйте письмо

  40. Мой код
    require_once ‘SendMailSmtpClass.php’; // подключаем класс

    $mailSMTP = new SendMailSmtpClass(‘Nik@yandex.ru’, ‘******** ’ , ‘ ssl://smtp.yandex.ru’, ‘Робот’, 465);
    В последней строке получаю ошибку Parse error: syntax error, unexpected ‘@’, expecting ‘)’В чем может быть проблема?

  41. Никогда обычно не оставляю комментарии, но спасибо большое, очень выручил! Все наглядно и понятно, завелось с первого раза!

      1. Получается, что нужно перейти, к примеру, к mail.ru и там уже настроить аватарку? А после отправить письма по их smtp?

  42. СПАСИБО! Все работает! А то у меня mail.ru не хотел письма принимать, тк. у меня обычный обработчик mail() PHP был. Теперь принимает как миленький!))
    Только теперь нарисовалась другая беда, все почтавики нормально отображали мое письмо со всеми html тегами, а мыло -хрен, все криво косо да еще и фон пропал. Теперь нужно разбираться с этим

  43. Не знаю. Может пропустил в комментариях подобную ошибку, но проблема в следующем:
    После копирования в директорию класса в последней функции:
    private function _parseServer($socket, $response) {
    while (@substr($responseServer, 3, 1) != ‘ ‘) {
    if (!($responseServer = fgets($socket, 256))) {
    return false;
    }
    }
    if (!(substr($responseServer, 0, 3) == $response)) {
    return false;
    }
    return true;

    }
    }
    VS Studio подчеркивает и выдает ошибку :
    Undefined variable $responseServer
    причем подчеркивает только первую переменную. В процедурном коде обычно добавлял глобальную переменную в связи с данной ругалкой. Что делать в классах, пока не понимаю.
    Ну и при отправке письма через yandex почту, так же получаю сообщение:
    Письмо не отправлено. Ошибка: 0.php_network_getaddresses: getaddrinfo failed: ���� ���� ����������.
    Видно, что не может получить адрес, но откуда? Тоже пока не понятно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code