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

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

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

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) {
    $email = ltrim($email, '');
    fputs($socket, "RCPT TO: \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;
}
Рассказать друзьям:


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

  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. Только что пробовала этот скрипт с яндексом. Никаких ошибок не выдаёт, но отправляет пустое письмо.
      В чём может быть проблема?
      Обычное письмо отправляет нормально, с вложением — нет.

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

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

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

*