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

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

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

Данная статья посвящена отправке e-mail через SMTP с авторизацией по протоколу SSL с помощью скрипта на php.

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

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

require_once «SendMailSmtpClass.php»; // подключение класса

$mailSMTP = new SendMailSmtpClass(‘test@yandex.ru’, ‘****’, ‘ssl://smtp.yandex.ru’, ‘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 <test@test.ru>\r\n»; // от кого письмо
$result = $mailSMTP->send(‘test@yandex.ru’, ‘Тема письма’, ‘Текст письма’, $headers); // отправляем письмо
// $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
if($result === true){
echo «Письмо успешно отправлено»;
}else{
echo «Письмо не отправлено. Ошибка: » . $result;
}

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

При работе с сервером Mail.ru данный класс тоже подходит. Требуется указать ссылку на хост с ssl и обратиться к порту 465.
Но для полноты корректности работы с Mail.ru в headare письма необходимо указывать отправителя, того же с адреса которого происходит авторизация на сервере или его не указывать вовсе.
Код отправки письма для Mail.ru выглядит вот так:

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

$mailSMTP = new SendMailSmtpClass(test@mail.ru’, ‘****’, ‘ssl://smtp.mail.ru’, ‘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 <test@mail.ru>\r\n»; // от кого письмо !!! тут e-mail, через который происходит авторизация
$result = $mailSMTP->send(‘test@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(‘test@gmail.com’, ‘*****’, ‘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 <test@gmail.com>\r\n»; // от кого письмо
$result = $mailSMTP->send(‘test@yandex.ru’, ‘gmail’, ‘Текст письма’, $headers); // отправляем письмо
// $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
if($result === true){
echo «Письмо успешно отправлено»;
}else{
echo «Письмо не отправлено. Ошибка: » . $result;
}
Дополнения

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

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’);
}
}
Если в теле сообщения не корректный текст то проверяем кодировку.

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

Так же дополнением можно отправлять и файлы, вот таким кодом:

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

$mailSMTP = new SendMailSmtpClass(‘xxx@mail.ru’, ‘xxx’, ‘ssl://smtp.mail.ru’, ‘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»; // от кого письмо !!! тут 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;
}

SendMailSmtpClass   — сам модуль