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

SMTP с авторизацией по протоколу SSL. Введение

Отправка писем через SMTP с авторизацией по протоколу SSL на phpЭта статья является продолжением ранее написанной, на тему Отправка писем через SMTP с авторизацией на php. В предыдущей статье я выкладывал исходники класса, который писал для своих нужд, работа которого заключалась в отправке писем через smtp Яндекса. Но статья стала популярной и многие читатели блога, стали присылать вопросы по работе класса. Главной проблемой стала работа через протокол SSL. А в последнее время эта проблема стала возникать еще чаще, поскольку все популярные почтовые сервера перешли на работу по защищенному протоколу SSL. В связи с этим я немного дописал класс, он теперь способен работать и по SSL, обновленную версию можете скачать тут.

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

SMTP с авторизацией по протоколу SSL. Яндекс

Для работы с почтовым сервером Яндекс ни чего не изменилось, единственное, что при вызове класса, необходимо указывать ссылку на хост, работающий через SSL и изменился номер порта: был 25, стал 465. Выглядит код отправки теперь вот так:

// пример использования
require_once "SendMailSmtpClass.php"; // подключаем класс
 
$mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Evgeniy', 465);
// $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;
}

SMTP с авторизацией по протоколу SSL. Майл

Для работы с почтовым сервером Mail.ru обновленный класс тоже подходит, как и в случае я Яндексом, тут необходимо также указать ссылку на хост с ssl и ображаться к порту 465.
Помимо этого, для корректной работы с Mail.ru в заголовках письма необходимо указывать отправителя, точно такого же с которого происходит авторизация на сервере или e-mail отправителя не указывать вовсе.
Код отправки письма через почтовый сервер Mail.ru выглядит вот так:

// пример использования
require_once "SendMailSmtpClass.php"; // подключаем класс
 
$mailSMTP = new SendMailSmtpClass('ipatovsoft@mail.ru', '****', 'ssl://smtp.mail.ru', 'Evgeniy', 465); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');
 
// заголовок письма
$headers= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
$headers .= "From: Evgeniy <ipatovsoft@mail.ru>\r\n"; // от кого письмо !!! тут e-mail, через который происходит авторизация
$result =  $mailSMTP->send('zhenikipatov@yandex.ru', 'Тема письма', 'Текст письма', $headers); // отправляем письмо
// $result =  $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма');
if($result === true){
    echo "Письмо успешно отправлено";
}else{
    echo "Письмо не отправлено. Ошибка: " . $result;
}

SMTP с авторизацией по протоколу SSL. Gmail

Для работы с почтовым сервером gmail.com, необходимо указывать ссылку на хост, работающий через SSL и номер порта 465. Выглядит код отправки теперь вот так:

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

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

На этом пока все, жду комментариев о работе обновленного класса.

Дополнения

19.10.2014 Иван Ткаченко подсказал, что можно расширить возможности класса и отправлять письмо сразу нескольким получателям, за это ему большое спасибо!
Для отправки нескольким получателям через «,» заменить
Это:

fputs($socket, "RCPT TO: \r\n");
    if (!$this->_parseServer($socket, "250")) {
    fclose($socket);
    throw new Exception('Error of command sending: RCPT TO');
}

На это:

$email_to_array = explode(',', $mailTo);
    foreach($email_to_array as $key => $email) {
    $emails = ltrim($email, '');
    fputs($socket, "RCPT TO: <$emails>\r\n");
    if (!$this->_parseServer($socket, "250")) {
        fclose($socket);
        throw new Exception('Error of command sending: RCPT TO');
    }
}

05.08.2016 Сегодня в комментарии подсказали по поводу проблемы с кодировкой, спасибо за это Евгению:
«Для тех у кого в теле и сабже полученного письма кракозябры — проверьте кодировку сервера по умолчанию и кодировку в которой написан сам скрипт. У меня windows-1251 так что прежде чем вызывать метод send использую»

$from_user=iconv("windows-1251", "utf-8" ,$from_user);
$subject =iconv("windows-1251", "utf-8" , $subject);
$message =iconv("windows-1251", "utf-8" , $message);

22.11.2016 Сегодня в комментарий добавили полезный код, который позволяет отправлять, с помощью класса, не только текст, но и файлы. Спасибо большое, за этот код Анжелике. Ниже код:

можно отправлять не только одно письмо но и файлы прикреплять к письму:
// пример использования
require_once «SendMailSmtpClass.php»; // подключаем класс

$mailSMTP = new SendMailSmtpClass(‘xxx@mail.ru’, ‘xxx’, ‘ssl://smtp.mail.ru’, ‘NameSender’, 465); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’);

// заголовок письма
$headers= «MIME-Version: 1.0\r\n»;
//$headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма
//$headers .= «From: Anjelika \r\n»; // от кого письмо !!! тут e-mail, через который происходит авторизация

$subject = «пробуем отправить файл»;
$message =»Сообщение в теле письма при отправке файла»; // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.
$filename = «имя файла например формата.zip»; // название файла
$filepath = «./sending/полный путь к файлу.zip»; // месторасположение файла
//исьмо с вложением состоит из нескольких частей, которые разделяются разделителем
$boundary = «—-«.md5(uniqid(time())); // генерируем разделитель
$headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»\r\n»; // кодировка письма// разделитель указывается в заголовке в параметре boundary
$headers .= «From: NameSender \r\n»;
$multipart = «—$boundary\r\n»;
$multipart .= «Content-Type: text/html; charset=windows-1251\r\n»;
$multipart .= «Content-Transfer-Encoding: base64\r\n»;
$multipart .= «\r\n»;
$multipart .= chunk_split(base64_encode(iconv(«utf8», «windows-1251″, $message))); // первая часть само сообщение
// Открыли файл
$fp = fopen($filepath,»r»);
if (!$fp)
{
print «Не удается открыть файл22»;
exit();
}
$file = fread($fp, filesize($filepath)); // чтение файла
fclose($fp);
$message_part = «\r\n—$boundary\r\n»;
$message_part .= «Content-Type: application/zip; name=\»$filename\»\r\n»;
$message_part .= «Content-Disposition: attachment\r\n»;
$message_part .= «Content-Transfer-Encoding: base64\r\n»;
$message_part .= «\r\n»;
$message_part .= chunk_split(base64_encode($file));
$message_part .= «\r\n—$boundary—\r\n»; // второй частью прикрепляем файл, можно прикрепить два и более файла
$multipart .= $message_part;

$result = $mailSMTP->send(‘xxx@xxx.ru’, $subject, $multipart, $headers); // отправляем письмо
// $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
if($result === true){
echo «Письмо успешно отправлено»;
}else{
echo «Письмо не отправлено. Ошибка: » . $result;
}
Рассказать друзьям:


Оценить:
(14 оценок, среднее: 4,86 из 5)

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

  1. На майл ру постоянно ругается на авторизацию. Якобы пароль не проходит, но пароль передается правильный.

      1. С хостинга сайта. И еще вопрос небольшой. Прикрутил форму для отправки, но в отправленном письме нет вкладки получатели только от кого, тема письма и само письмо. В коде изменений не проводил. Только данные заменил переменными.

        1. Незаметил сразу небыло заголовка
          $headers .= «To: =?windows-1251?Q??= \r\n»;

          Спасибо. Очень хороший скрипт. Прикрутил к сайту.

  2. Добрый день.
    Хочу использовать Ваш скрипт в интернет магазине с отправкой клиентом писем с их заказом. Письмо будет отправляться с одного ящика. С ним и буду работать в дальнейшем. Так вот возник вопрос — какой ящик выбрать (mail, yandex, google) — т.е. с каким ящиком в последующем будет меньше проблем(настройка, изменение данных, включение ССЛ и т.д.) (есть такая информация) ?

    Буду признателен за ответ.

    1. Здравствуйте.
      Я сам всегда использую Яндекс, с mail.ru и gmail.com сталкивался только при тестировании класса.
      По работе с Яндекс ни чего плохого сказать не могу, моим потребностям удовлетворял полностью.

  3. А у меня не проходит даже этап HELO при отправке через яндекс…
    Письмо не отправлено. Ошибка: Error of command sending: HELO
    класс вызываю так:
    $mailSMTP = new SendMailSmtpClass(‘r****n@yandex.ru’, ‘c*****z’, ‘ssl://smtp.yandex.ru’, ‘r****n’, 465);

    1. разобрался. в $server_name из системы не прилетало значение. поставил явно, заработал.

  4. Здравствуйте!
    Сегодня опробовал Ваш класс. Благодарю, Вы меня очень выручили. Все очень хорошо работает!
    Я немного изучил код класса. У меня возник (не очень важный, но все-таки) вопрос:
    Поле: public $smtp_from;
    …оно нигде не используется, но Вы написали, что он нужен при работе с Gmail. Это просто описание устарело или Вы просто забыли добавить, что-то в код?

    1. Я немного обновил класс, раньше это свойство -$smtp_from использовалось для установки имени отправителя. Сейчас оно лишнее, но и вреда ни какого не несет, просто не используется. Спасибо, что обратили внимание, я просто забыл его удалить, в ближайшем будущем я исправлю описание и удалю свойство из класса.

  5. спасибо за код)Админ помоги прикрутить твой класс к скрипту,в пхп я дуб,а тебе разобраться во всем 5 минут. За работу подкину на пивко))

  6. Почему-то не работает с яндексом. Выдает Autorization error. Пароли и логины верные.

    <?php
    require_once "SendMailSmtpClass.php"; // подключаем класс
    $mailSMTP = new SendMailSmtpClass('noreply@citymall-nk.ru', '###', 'ssl://smtp.yandex.ru', 'Admin', 465);
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
    $headers .= "From: Admin \r\n»; // от кого письмо
    $result = $mailSMTP->send(‘n_angelo@mail.ru’, ‘Новая заявка на регистрацию карты’ , ‘Данные для регистрации карты:’, $headers); // отправляем письмо
    if($result === true){
    echo «Письмо успешно отправлено»;
    }else{
    echo «Письмо не отправлено. Ошибка: » . $result;
    }
    ?>

    1. ‘noreply@citymall-nk.ru’ — Это ваш логин на яндексе? Они же вроде только со своим доменом дают логины.
      Нужно вводить логин и пароль от Вашей яндекс почты, привязанная к яндексу почта не подходит.

  7. Для отправки нескольким получателям через «,» заменить
    Это:

    fputs($socket, "RCPT TO: \r\n");
        if (!$this-&gt;_parseServer($socket, "250")) {
        fclose($socket);
        throw new Exception('Error of command sending: RCPT TO');
    }
    

    На это:

    $email_to_array = explode(',', $mailTo);
        foreach($email_to_array as $key =&gt; $email) {
    	$email = ltrim($email, '');
    	fputs($socket, "RCPT TO: \r\n");
    	if (!$this-&gt;_parseServer($socket, "250")) {
    	    fclose($socket);
    	    throw new Exception('Error of command sending: RCPT TO');
    	}
    }
    
      1. Спасибо, ценное дополнение. Я отформатировал ваш код, теперь корректно отображается.

  8. Отправляю почту через sss.yandex, все работает, однако если в тексте письма есть какая-то ссылка, то письмо не доставляется. Почему так?

    1. А как вы отправляете ссылки?
      Я сейчас попробовал — все работает. Вот так делал:

      $text_mail = "
      	Любой текст<br/s>
      	<a href='http://vk-book.ru' rel="nofollow">Перейти на сайт</a>
      ";
      $result =  $mailSMTP->send('zhenikipatov@yandex.ru', 'Тема письма', $text_mail, $headers); // отправляем письмо
      
      1. Оказалось проблема немного в другом. При использовании ssl.gmail — все ОК, но при использовании ssl.yandex — возникают проблемы с доставкой писем. Причем очень выборочно происходит. 2 доставляет, 1 не доставляет. Яндекс гоняет.

      2. А вот что-то, не хочет он жевать ссылки, вообще никак. «Письмо не отправлено. Ошибка: E-mail didn’t sent»
        Яндекс не ест ссылки .
        Гугл ругается на авторизацию, если в настройках гугла «разрешить доступ из небезопасных приложении» то спустя несколько писек аккаунт вообще блокируется.
        Маил так вообще адресату который шлет письмо «ОТ» шлет письмо и информацию о том кто отослал письмо

  9. Работает письма доставляет, спасибо. Только тема почему то приходит такой: =?utf-8?B?0JrQvtGB0LjQutC4=?=
    Как исправить?

    1. А где вы смотрите письмо? почтовый клиент какой-то или через какой-то почтовик браузерный?

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

  10. Здравствуйте. Использую Ваш класс для отправки письма, но почему-то не работает, выдает ответ Письмо не отправлено. Ошибка: Autorization error. Отправляю через gmail
    <?php
    require_once "SendMailSmtpClass.php"; // подключаем класс
    echo $_SERVER["SERVER_NAME"];
    $mailSMTP = new SendMailSmtpClass('vitaly@gmail.com', '****', 'ssl://smtp.gmail.com', 'vitaly', 465); // создаем экземпляр класса
    // $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');

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

  11. Здравствуйте.

    Сделал все как описано. Gmail отправляет письма (правда логинится после того, как разрешил внутри почты это)

    А вот яндекс и мэйл дают ошибку.
    Письмо не отправлено. Ошибка: Autorization error

    Что делать?

  12. Отличный класс!

    А кто знает, по какой причине не работает отправка от «Яндекс.Почта для домена»?

    Все почтовые клиенты же норм работают, просто вместо логина указывается почтовый адрес целиком.

    Для «родного» яндексовского адреса vasya@yandex.ru логином будет vasya
    а для почты_для_домена admin@domain.com логином является целиком весь почтовый адрес.

    от @yandex.ru отправляются нормально, а от @domain.com попадаю в эксепшн
    fputs($socket, base64_encode($this->smtp_password) . «\r\n»);
    if (!$this->_parseServer($socket, «235»)) {
    fclose($socket);
    throw new Exception(‘Autorization error PASS’);
    }

  13. Не могу разобраться с кодом, так как вообще никогда не имел дело с php, хоть и имею не плохие знания по C#) . Я взял код который был у вас для другой статьи
    http://vk-book.ru/prostaya-forma-obratnoj-svyazi-na-php-i-ajax/ и поменял, для теста убрал проверку и вообще данные не передаю в скрипт. Что нужно поменять в
    SendMailSmtpClass ? Так как вообще никто про класс не говорил, видимо там менять и не надо ничего? (я ничего не менял) . Вот код который я использую :

    <?php
    $msg_box = ""; // в этой переменной будем хранить сообщения формы
    $errors = array(); // контейнер для ошибок
    // проверяем корректность полей
    if($_POST['user_name'] == "") $errors[] = "Поле 'Ваше имя' не заполнено!";
    if($_POST['user_email'] == "") $errors[] = "Поле 'Ваш e-mail' не заполнено!";
    if($_POST['text_comment'] == "") $errors[] = "Поле 'Текст сообщения' не заполнено!";

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

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

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

    В ответ приходит сообщение — 110.Connection timed out . Помогите разобраться, т.к сам изучаю C# и ASP.NET и просто времени нет на php, а меня попросили сделать сайт визитку, вот и понадобилась форма обратной связи)

  14. Добрый день! Прошу прощения, если проглядел… а с помощью этого класса вложения к письму подцеплять можно?

  15. C gmail отправляет, но вот только в качестве отправителя стоит ящик, с которого была авторизация. Т.е. отправителем не является тот, кто указан во FROM. Соответственно, если отвечать на такое письмо, то ответ будет на тот ящик, который и отправлял.

    1. Кто-нибудь разобрался с проблемой кодировки? Если письмо шлем через smtp Яндекса, имя отображается в неправильной кодировке, несмотря на заголовок charset utf-8.

  16. Евгений, большое спасибо!
    Отлично работает!
    А до этого через mail() отправлялись заявки на фонтан на сайте, поначалу работало, а на днях протестировал — не доходят письма!
    Думаю, почему перестали приходить заявки, а все просто, онлайн-форма не работает. Выручили вы с этим классом!

    С уважением,
    Камиль

  17. Спасибо, всё отлично работает!
    (yandex.ru, хостинг timeweb, отправка с ящика, который «яндекс-почта для домена»).

    Если надо «просто сообщение» без HTML (который может резаться на разных этапах) — text/plain вместо text/html в заголовке. (И в этом случае перенос на следующую строку «/r/n»).

    Кто-то из комментаторов спрашивал откуда лучше отправлять — mail.ru, gmail.com или yandex.ru — такое чувство, что заметно лучше с yandex.ru. «Никаких артефактов». С майлру и гуглом возможны танцы с бубном.

    Автор блога: в проверочном коде когда люди постят комментарии — есть символ «О» (буква), который выглядит как «ноль». Во избежание лишних «неправильно введен код» — можно бы удалить из числа выводимых символов и О, и ноль.

  18. Все доступы повключал, и защиту гугла выключил и все равно не пускает gmail
    Письмо не отправлено. Ошибка: Autorization error

  19. Добрый день.
    Подскажите пожалуйста. Отправляю через gmail. Тело письма беру из файла с помощью file_get_contents + в переменную добавляю еще строки. Письмо отправляется, но письмо получаю одной строкой, теряются все пустые строки, переходы на другие строки и т.д. Как можно это поправить? Спасибо.

    1. Я столкнулся с такой же проблемой. Проблема решилось, когда я откатил php с версии 5.6 на 5.4. Специально проверил, на php 5.5 нормально работает, а вот с php 5.6 почему то нет.

  20. Отправка на mail.ru, yandex.ru — работает , на g-mail часто не приходит, также не приходят письма на корпоративную почту вида Адрес@Имя_нашего_сайта.ru

  21. Доброго дня.
    Подскажите плз, в чем может быть сложность отправки почты через класс с почтовика rambler.

    постоянно выдает ошибку авторизации. сервер/порт/логин/пароль в норме.
    есть отдельная хитрость в авторизации на рамблере?

  22. Огромное спасибо за труд. Реально решение из коробки! С мейл.ру — корп.ящиком работает на ура.

  23. Спасибо большое! У меня на сайте есть воостановление паролья, а как для этого можно использовать вашу функцию, чтобы автоматический было все?

  24. Огромное спасибо!
    Отправляю почту по протоколу SSL, все сразу заработало.
    Добавил строчку, $headers .= «To: AdminSite \r\n»;
    Без него полученное письмо имело заголовок Кому: undisclosed-recipients:;

  25. Спасибо! Для тех у кого в теле и сабже полученного письма кракозябры — проверьте кодировку сервера по умолчанию и кодировку в которой написан сам скрипт. У меня windows-1251 так что прежде чем вызывать метод send использую

    $from_user=iconv("windows-1251", "utf-8" ,$from_user);
    $subject =iconv("windows-1251", "utf-8" , $subject);
    $message =iconv("windows-1251", "utf-8" , $message);

  26. Здравствуйте.
    У меня на сайте вакансий есть рассылка еженедельных новостей для работодателей. Уже не знаю чем их привлечь. Размещение вакансий сделал бесплатное, на любой срок. Но поток на сайте небольшой. Почитал про рассылки по подпискам. Понял, что я могу для зарегистрировавшихся делать рассылку полезной информации. Отправляю стандартным sendmail с хостинга. Но часто почта попадает в спам.
    Сейчас пробую вашим классным классом — думаю дело пойдет веселее. Спасибо!

  27. Код вполне рабочий и полезный, вот может кому пригодится модифицированный (автор может в тему добавить если посчитает нужным, что бы люди могли пользоваться), можно отправлять не только одно письмо но и файлы прикреплять к письму:
    // пример использования
    require_once «SendMailSmtpClass.php»; // подключаем класс

    $mailSMTP = new SendMailSmtpClass(‘xxx@mail.ru’, ‘xxx’, ‘ssl://smtp.mail.ru’, ‘NameSender’, 465); // создаем экземпляр класса
    // $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’);

    // заголовок письма
    $headers= «MIME-Version: 1.0\r\n»;
    //$headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма
    //$headers .= «From: Anjelika \r\n»; // от кого письмо !!! тут e-mail, через который происходит авторизация

    $subject = «пробуем отправить файл»;
    $message =»Сообщение в теле письма при отправке файла»; // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.
    $filename = «имя файла например формата.zip»; // название файла
    $filepath = «./sending/полный путь к файлу.zip»; // месторасположение файла
    //исьмо с вложением состоит из нескольких частей, которые разделяются разделителем
    $boundary = «—-«.md5(uniqid(time())); // генерируем разделитель
    $headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»\r\n»; // кодировка письма// разделитель указывается в заголовке в параметре boundary
    $headers .= «From: NameSender \r\n»;
    $multipart = «—$boundary\r\n»;
    $multipart .= «Content-Type: text/html; charset=windows-1251\r\n»;
    $multipart .= «Content-Transfer-Encoding: base64\r\n»;
    $multipart .= «\r\n»;
    $multipart .= chunk_split(base64_encode(iconv(«utf8», «windows-1251″, $message))); // первая часть само сообщение
    // Открыли файл
    $fp = fopen($filepath,»r»);
    if (!$fp)
    {
    print «Не удается открыть файл22»;
    exit();
    }
    $file = fread($fp, filesize($filepath)); // чтение файла
    fclose($fp);
    $message_part = «\r\n—$boundary\r\n»;
    $message_part .= «Content-Type: application/zip; name=\»$filename\»\r\n»;
    $message_part .= «Content-Disposition: attachment\r\n»;
    $message_part .= «Content-Transfer-Encoding: base64\r\n»;
    $message_part .= «\r\n»;
    $message_part .= chunk_split(base64_encode($file));
    $message_part .= «\r\n—$boundary—\r\n»; // второй частью прикрепляем файл, можно прикрепить два и более файла
    $multipart .= $message_part;

    $result = $mailSMTP->send(‘xxx@xxx.ru’, $subject, $multipart, $headers); // отправляем письмо
    // $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
    if($result === true){
    echo «Письмо успешно отправлено»;
    }else{
    echo «Письмо не отправлено. Ошибка: » . $result;
    }

      1. К сожалению, скрипт не работает. Хотя начинание поддерживаю.
        Текст письма не добавляет, файл закачивает, но не прикрепляет, а вкладывает внутрь письма.
        Mail.ru видит письмо как спам.
        Есть у кого работающий код?
        оч. нужно.

    1. Только что пробовала этот скрипт с яндексом. Никаких ошибок не выдаёт, но отправляет пустое письмо.
      В чём может быть проблема?
      Обычное письмо отправляет нормально, с вложением — нет.

      Кстати, как я понимаю, для разных типов файлов нужен разный Content-Type? Для картинок, скажем, image/png, для офиссных документов — application/octet-stream и т.п.?

  28. нескольким получателям отправка не работает, использовал код добавленный Иваном Ткаченко.
    получаю «Письмо не отправлено. Ошибка: Error of command sending: RCPT TO»

  29. Опечатка в классе библиотеки, в методе send()
    $contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «=?=\r\n»;
    заменить на
    $contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «?=\r\n»;

    поэтому слетала кодировка заголовка письма

  30. Здравствуйте.

    Я начинающий в JS/jQuery и совершенно не знаю PHP. Мог бы автор или кто-то из читателей объяснить как этот почтовый клиент подключить в одностраничном сайте?

    У меня есть простая форма и скрипт для отправки на клас PHP:

    $(document).ready(function(){
    $(«#form»).submit(function() {
    var form_data = $(this).serialize();
    $.post(‘SendMailSmtpClass.php’,
    success: function() {
    alert(«Ваше сообщение отпрвлено!»);
    });
    });
    });

    Возможно у кого-то уже есть готовый пример? Поделитесь пожалуйста.

    1. Я ещё проще делаю.
      В файле, в котором у Вас форма:

      В «send.php»:
      вначале:
      require_once «SendMailSmtpClass.php»; // подключаем класс
      потом вы достаёте всю нужную информацию из формы (переменная $_POST), формируете письмо и дальше это письмо отправляете как показано в примере..

      Скажем, у вас в форме были поля «name», «phone», «message», отправляете вы с ящика mymail@yandex.ru на ящик admin@mysite.ru

      $mailSMTP = new SendMailSmtpClass(‘mymail@yandex.ru’, ‘пароль’, ‘ssl://smtp.yandex.ru’, ‘Моё имя’, 465);

      Обрабатываем форму:

      if ($_POST[‘name’])
      $name=$_POST[‘name’];
      else $name=»Неизвестный»;

      if ($_POST[‘phone’])
      $phone=$_POST[‘phone’];
      else $phone=»Контакт не указан»;

      $subj=»Сообщение с сайта My Site»;

      if ($_POST[‘message’])
      $message=$_POST[‘message’].» от «.$name.», контакт: «.$phone;
      else $message=»Сообщения нет «;

      Далее прописываете хедеры — в зависимости от того какой вам вариант нужен, их тут много и в примере, и в комментариях. Ну и в конце —

      mail(‘admin@mysite.ru ‘, $subj, $message, implode(«\r\n», $headers));

      1. Спасибо за помощь, Ольга!

        Поскольку я не знаю РНР, у меня остаются непонятными еще много моментов. К примеру:

        «Потом вы достаёте всю нужную информацию из формы» — как достать?

        «Формируя письмо» — как сформировать?

        «Ну и в конце» — в конце чего, файла или класса?

        Ольга, или могли бы вы сбросить пример готового кода мне на почту, чтобы я не ставил глупых вопросов — ouvveee@gmail.com.

        Большое спасибо!

  31. У меня куда более интересный вопрос…
    Если при помощи этой формы отправлять письмо с вложением на почту Yandex — приходит письмо и приходит вложение, всё отлично.
    Если отправлять на почту Mail — приходит письмо, но не приходят вложения.
    Если отправлять на Gmail — вообще интересно. Если из Google Chrome — то приходит вообще полная абракадабрица (как будто boundary смешивается с закодированным 64base текстом и вложениями) без вложений. А если из Оперы, FF или IE — приходит письмо с текстом, но без вложений. То же самое с корпоративной почтой..
    У кого какие догадки почему так?

    1. Здравствуйте, проверьте разделители, которые разделяют в тексте письма закодированные файлы и текст.Разделители должны быть везде одинаковые. А так же в конце письма нужно добавить разделитель с двумя минусами «—» в начале и конце разделителя

      1. В том то и вопрос! Формируется письмо правильно. И до Яндекса доходит в целости и созарнности, а на другие адреса — крэшится!

        Вот например, сформировано было письмо (я только начало вставлю, чтобы не пугать километровыми кодами)

        MIME-Version: 1.0
        Content-Type: multipart/mixed; boundary=c18ce24895aa3ff98272101ebec0eba0
        From: MetaShino
        —c18ce24895aa3ff98272101ebec0eba0
        Content-Type: text/html; charset=utf-8
        Content-Transfer-Encoding: base64

        0JfQsNC/0YDQvtGBINC90LAg0YDQsNGB0YHRh9GR0YIg0YHRgtC+0LjQvNC+0YHRgtC4INGI0LjQ
        vdC+0L/RgNC+0LLQvtC00LAg0YfQtdGA0LXQtyDQv9GA0L7Qs9GA0LDQvNC80YMgTWV0YVNoaW5v
        IAoKCQkJ0JjQvNGPOiBPbGdhIFNoaWYgIDxicj4KCgkJCdCe0YDQs9Cw0L3QuNC30LDRhtC40Y86
        INCg0L7Qs9CwINC4INCa0L7Qv9GL0YLQsCA8YnI+CgoJCQnQotC10LvQtdGE0L7QvTogOTE4NTAz
        MjI5NiA8YnI+CgoJCQlFLW1haWw6IGxhc2FuYS5hcnJvd0B5YW5kZXgucnUgPGJyPgoKCQkJ0JrQ
        vtC80LzQtdC90YLQsNGA0LjQuTog0JrQvtC80LzQtdC90YLQsNGA0LjQuSA8YnI+Cg==

        —c18ce24895aa3ff98272101ebec0eba0
        Content-Type: image/png; name=»Cu2000_46-41.png»
        Content-Disposition: attachment; filename=»Cu2000_46-41.png»
        Content-Transfer-Encoding: base64

        На Яндекс пришло всё в такой же компановке, а на Гугл вот так:

        MIME-Version: 1.0
        Content-Type: multipart/mixed; boundary=c18ce24895aa3ff98272101ebec0eba0
        From: MetaShino

        —c18ce24895aa3ff98272101ebec0eba0
        Content-Type: text/html; charset=utf-8
        Content-Transfer-Encoding: base64

        0JfQsNC/0YDQvtGBINC90LAg0YDQsNGB0YHRh9GR0YIg0YHRgtC+0LjQvNC+0YHRgtC4INGI0LjQ
        vdC+0L/RgNC+0LLQvtC00LAg0YfQtdGA0LXQtyDQv9GA0L7Qs9GA0LDQvNC80YMgTWV0YVNoaW5v
        IAoKCQkJ0JjQvNGPOiBPbGdhIFNoaWYgIDxicj4KCgkJCdCe0YDQs9Cw0L3QuNC30LDRhtC40Y86
        INCg0L7Qs9CwINC4INCa0L7Qv9GL0YLQsCA8YnI+CgoJCQnQotC10LvQtdGE0L7QvTogOTE4NTAz
        MjI5NiA8YnI+CgoJCQlFLW1haWw6IGxhc2FuYS5hcnJvd0B5YW5kZXgucnUgPGJyPgoKCQkJ0JrQ
        vtC80LzQtdC90YLQsNGA0LjQuTog0JrQvtC80LzQtdC90YLQsNGA0LjQuSA8YnI+Cgc18ce24895
        aa3ff98272101ebec0eba0ContentTypeimage/pngnameCu20004641pngContentDispositio
        nattachmentfilenameCu20004641pngContentTransferEncodingbase64

        Вот в этом случае Гугл с какого-то момента начинает «съедать» знаки «=», «-» и «:», пробелы и переносы. В каких-то других случаях выгрызает часть кода base64

        Может, у Гугла есть какие-то особые требования?

        1. Добрый день!
          Аналогичная проблема. И кодировку менял, и кол-во, позиции разделителей. Ничего не помогает.
          Есть решение?

          1. Я лично никакого решения пока не нашла.

  32. Всем доброго времени суток!
    Изучаю PHP, использую IIS. Решил попробовать данный класс выдает:

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

    Из-за чего это может быть?

    1. Дело в том что начиная с php версии 5.6 и выше, изменилась работа с ssl. В *nix системах, необходимо наличие файла cert.pem в директории /etc/ssl.

  33. нужна помощь,только начал заниматься программирование и решил попробовать сделать сайт,так вот нужен код который отправляет письмо с регистрационными данными и ссылкой активации email на почту которую вводил при регистрации !!

  34. Большое спасибо автору за скрипт. Работает с корпоративной почтой на яндекс. Зона .рф. Письма ходят от формы до поучателя нормально. Но на майл.ру (остальное не пробовал) в письме стоит приписка:

    «Мы не можем проверить подлинность отправителя. Рекомендуем вам быть внимательнее при совершении действий, указанных в письме. »

    В заголовках письма:
    Received-SPF: pass
    X-DMARC-Result: fail
    X-Mras: OK
    X-Spam: undefined

    Понятно, что проблема в DMARC.
    DMARC настроен, и если слать письмо из ящика на яндексе через web интерфейс — все хорошо.
    Как можно справиться с DMARC ?

  35. Правильная строка при отправке писем в несколько адресов:
    fputs($socket, «RCPT TO: \r\n»);
    Как указано в примере
    fputs($socket, «RCPT TO: \r\n»);
    Выдает ошибку RCPT

    1. Теги съедены. Короче в тупую не копируйте дополнение для отправки в несколько адресов, а аккуратно перенесите соответствующую строку из класса SendMailSmtpClass

  36. Через яндекс выдает E-mail didn’t sent. В чем может быть дело? У хостера видимо закрыта функция php mail, приходится искать обходные пути. phpmailer не пашет, нашел ваш скрипт, тоже вот не пуляет. Как понять в чем дело, в яндексе, хостере или еще где?

    1. Обратитесь в службу поддержки сервера. Возможно Вас внесли в черный список.

  37. Помогите плиз.
    Выдает Autorization error

    Использую gmail.
    Данные ввел правильно.
    В чем может быть причина?

  38. Добрый день. Прошу помощи. Не отправляются письма с mail.ru. Пишет это: «Ошибка: E-mail didn’t sent». Что делать?

    1. Mail.ru не принимает заголовки From и не отправляет письмо, если получатель в заголовках отличается от логина, под которым происходит авторизация на stmp-сервере:
      $headers .= «From: Evgeniy <ipatovsoft@mail.ru>\r\n»; // от кого письмо !!! тут e-mail, через который происходит авторизация

  39. К сожалению, так и не смог разобраться в причинах по которым файл не прикрепляется к письму. Текст сообщения также отсутствует

  40. По поводу прикрепления файлов:
    1. Когда задаем $boundary — необходимо добавить пару — (тире), я добавил 5 штук, то есть
    $boundary = ——.md5(uniqid(time()));
    2. Затем, при каждой вставке разделителя, добавляем еще — (2 тире)
    $multipart = —$boundary\r\n;
    3. В конце сообщения, когда уже добавили файл, добавляем разделитель с — (2 тире) в начале и конце:
    $message_part .= \r\n—$boundary—\r\n;

    У меня заработало, пробуйте и вы)
    P.S. все кавычки я убрал, чтобы не поехало все

    1. Сделал, как Вы сказали, все равно приходит письмо (как-будто) с вложением, а в теле пусто.
      Кстати, есть ли готовое решение с загрузкой и проверкой на размеры и расширения вложения?

      //>file att

      $filename = $_FILES[‘userfile’][‘name’]; // месторасположение файла
      $filepath = «/var/www/vhosts/it4u.kz/httpdocs/uploads/».$_FILES[‘userfile’][‘name’]; // название файла
      //письмо с вложением состоит из нескольких частей, которые разделяются разделителем
      $boundary = «——«.md5(uniqid(time())); // генерируем разделитель
      $headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»\r\n»; // кодировка письма// разделитель указывается в заголовке в параметре boundary
      //$headers .= «From: NameSender \r\n»;
      $multipart = «—$boundary\r\n»;
      $multipart .= «Content-Type: text/html; charset=utf-8\r\n»;
      $multipart .= «Content-Transfer-Encoding: base64\r\n»;
      $multipart .= «\r\n»;
      $multipart .= chunk_split(base64_encode(iconv(«utf8», «windows-1251″, $mailBody))); // первая часть само сообщение
      // Открыли файл
      $fp = fopen($filepath,»r»);
      if (!$fp)
      {
      print «Не удается открыть файл22»;
      exit();
      }
      $file = fread($fp, filesize($filepath)); // чтение файла
      fclose($fp);
      $message_part = «\r\n—$boundary\r\n»;
      $message_part .= «Content-Type: application/zip; name=\»$filename\»\r\n»;
      $message_part .= «Content-Disposition: attachment\r\n»;
      $message_part .= «Content-Transfer-Encoding: base64\r\n»;
      $message_part .= «\r\n»;
      $message_part .= chunk_split(base64_encode($file));
      $message_part .= «\r\n—$boundary—\r\n»; // второй частью прикрепляем файл, можно прикрепить два и более файла
      $multipart .= $message_part;
      //<file att

  41. Добрый день. Спасибо за код!
    Код работает, пишет, что письмо отправлено. Отправляю сама себе (один и тот же адрес). Пробовала и на другой адрес
    Но письма не приходят. Совсем. В спаме тоже нет.
    В чем может быть проблема?

    1. Добрый день, через какой smtp-сервер пытаетесь отправить письмо?
      Можете показать код отправки( только доступы свои скройте, чтобы ни кто не видел:) )?

  42. Я отправляла через mail.ru. Создала новый ящик, чтобы пароль даже где-то в коде не светился)
    Я сначала в коде:
    if($result === true){
    echo «Письмо успешно отправлено»;
    }else{ …
    Исправила на ==. И у меня результат был, что письмо отправлено, но оно не приходило.
    Вернула ===. Стал результат — didn’t send.
    Поменяла подключение и отправку от имени старого ящика, которому много лет и все заработало.
    Почему? Все пароли проверила, все верно было. Пробовала то один ящик, то другой несколько раз. С новым ящиком не хочет работать, а со старым все ОК. ))

    1. if($result === true) — это условие не влияет на отправку, просто проверяется — была отправка или нет.
      По поводу старого и нового аккаунта у меня идей нет) Может быть кто-нибудь в комментариях подскажет. Странно очень, если один аккаунт работает, то и другой должен работать. Единственное предположение — это то, что в самих настройках аккаунта есть блокировка отправки писем через этот аккаунт со стороннего ресурса

  43. Хороший плагин, отправляем через него уведомления о регистрации на сайте, сначала подключали бесплатный смтп от гугл, но там очень строгие лимиты, пришлось подключать платный, подключили 1 раз, работает уже больше 3х месяцев без проблем, сам смтп сервер от https://smtp.bz/

  44. Здравствуйте. Пользуюсь вашим скриптом! спасибо большое!
    Но у меня возникает ошибка при отправки письма на почту @aol.com
    на все остальные адреса отправляется без ошибок, пользуюсь smtp yandex.
    Ошибка: E-mail didn’t sent
    Строка 144 в файле SendMailSmtpClass.php

    fputs($socket, $contentMail.»\r\n.\r\n»);
    if (!$this->_parseServer($socket, «250»)) {
    fclose($socket);
    throw new Exception(«E-mail didn’t sent»);
    }

    1. Добрый день, а просто с яндекса получается отправить письмо на почтовый ящик @aol.com?

  45. Добрый день!
    Не отправляет почту исользуя SMTP гугла.
    Ошибка: Письмо не отправлено. Ошибка: Autorization error
    Код:
    // пример использования
    require_once $_SERVER[‘DOCUMENT_ROOT’] . ‘SendMailSmtpClass.php’; // подключаем класс

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

    Прошу помощи.
    Вижу что ошибка с авторизацией, но пробовал на разных аккаунтах.

    Спасибо.

    1. Добрый день!
      Попробуйте в коде класса подправить строку: fputs($socket, «HELO $server_name\r\n»);
      В ней нужно заменить HELO на EHLO. Иногда smtp-сервера настроены на разное приветствие

  46. Добрый день! Ребята, подскажите в чем может быть дело: на gmail вложение приходит отлично, а на yandex и mail — пустое, 0 кб. Трассировка ни к чему не привела, ошибок нет

Добавить комментарий для Сергей Отменить ответ

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

*

code