php отправка почты через smtp mail
Отправка писем через SMTP на PHP 2 способа
if (!server_parse($socket, «220», __LINE__)) return false;
Не могу отправить HELO!
‘;
fclose($socket);
return false;
>
fputs($socket, «AUTH LOGIN\r\n»);
if (!server_parse($socket, «334», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘
Не могу найти ответ на запрос авторизаци.
Логин авторизации не был принят сервером!
Пароль не был принят сервером как верный! Ошибка авторизации!
‘;
fclose($socket);
return false;
>
fputs($socket, «MAIL FROM: \r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘
Не могу отправить комманду MAIL FROM:
‘;
fclose($socket);
return false;
>
fputs($socket, «RCPT TO: \r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘
Не могу отправить комманду RCPT TO:
‘;
fclose($socket);
return false;
>
fputs($socket, «DATA\r\n»);
if (!server_parse($socket, «354», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘
Не могу отправить комманду DATA
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘
Не смог отправить тело письма. Письмо не было отправленно!
‘;
fclose($socket);
return false;
>
fputs($socket, «QUIT\r\n»);
fclose($socket);
return TRUE;
>
Проблемы с отправкой почты!
Проблемы с отправкой почты!
fputs($socket, «AUTH LOGIN\r\n»);
if (!$this->_parseServer($socket, «334»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>
fputs($socket, «MAIL FROM: «.$this->smtp_username.»\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: MAIL FROM’);
>
fputs($socket, «DATA\r\n»);
if (!$this->_parseServer($socket, «354»)) <
fclose($socket);
throw new Exception(‘Error of command sending: DATA’);
>
Вызываем теперь класс с параметрами
require_once «SendMailSmtpClass.php»; // подключаем класс
Материал взят частично с сайтов:
Php отправка почты через smtp mail
(PHP 4, PHP 5, PHP 7, PHP 8)
mail — Отправляет электронную почту
Описание
Отправляет электронную почту.
Список параметров
Получатель, или получатели письма.
Тема отправляемого письма.
Тема должна соответствовать » RFC 2047.
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Если передан массив, то его ключи будут именами заголовка, а значения значениями.
До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Возвращаемые значения
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
Версия | Описание |
---|---|
7.2.0 | Параметр additional_headers может принимать значения типа массив. |
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
Пример #3 Отправка письма с дополнительными заголовками, переданными массивом
В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).
Пример #4 Отправка письма с дополнительными аргументами командной строки.
Пример #5 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Birthday Reminders for August
Вменяемая инструкция к PHPMailer “Отправка писем и файлов на почту”
Apr 23, 2019 · 4 min read
PHPMailer обновился и инструкция к прошлой версии не актуальна, хотя вы также можете использовать прикреплённые файлы в той инструкции. Работать будет.
Прошло несколько лет, но у вас всё также нет выхода, и PHPMAILER — это самый простой способ отправлять со своего сайта письма на почту.
О чем эта инструкция.
Это инструкция по добавлению на ваш сайт PHPMailer и отправки писем с прикреплёнными файлами к вам на почту без перезагрузки страницы.
1. Скачиваем PHPMailer
Переходим на сайт https://github.com/PHPMailer/PHPMailer и скачиваем последнюю версию
Во всём архиве нам нужны только 3 файла:
Всё остальн о е, что хранится на Github — на*уй не нужно, можете удалять.
2. Удаляем из файлов весь хлам
Этот пункт вы можете пропустить. Он не является обязательным
Файлы, написанные разработчиками PHPMailer, содержат немереное количество мусора, состоящего из одних комментариев (зачем?!). Вес этих трёх файлов вместе с комментариями равен 196кб, после удаления комментов вес составит 72кб. Почти в 3 раза…
Я предлагаю удалить все комментарии в файлах с помощью какого-нибудь “PHP минификатора”. Можете использовать любой, я взял (первый попавшийся) http://php-minify.com
Процедуру повторяете со всеми тремя файлами.
Для наглядности файл Exception.php
3. Перемещаем файлы в проект
И теперь помещаем эти 3 файла в наш проект. Я создал специально для этих файлов папку под названием phpmailer
4. Создаём файл конфигурации
Создадим файл send.php с таким содержанием
Здесь вам нужно отредактировать эти поля под себя:
Нужно использовать не пароль от самой почты, а “Пароль приложения”. В настройках вашей почты, будь то Gmail, Yandex или Mailru— есть раздел “Пароли приложений”, где вы можете специально создать отдельный сгенерированный пароль для PHPMailer.
Сохраняем этот файл send.php и помещаем его в корень сайта
В примере указаны настройки для Яндекса. Вы можете использовать любую почту для отправки. Для изменения почты отправки, к примеру, на Gmail — нужно изменить эти поля:
$mail->Host = ‘smtp.gmail.com’; // SMTP сервер
$mail->SMTPSecure = ‘ssl’; // шифрование
$mail->Port = 465; // Порт
5. Создаём HTML форму
Теперь поместим эту форму в нужное место на вашем сайте
Обратите внимание на onsubmit. Там вторым аргументом должно быть указано имя файла, то есть send.php.
6. Прописываем JavaScript
Отправка писем через SMTP с авторизацией на php
В этой статье я хочу показать как можно сделать отправку писем из php через smtp сервер на примере smtp.yandex.ru
Иногда бывает такое, что на хостинге запрещено отсылать письма стандартными средствами — mail(), такое в основном бывает на бесплатных хостингах 🙂 Так же бывает необходимость слать почту через smtp и на серверах, по ряду различных причин.
Приступим к реализации, для выполнения отправки через smtp потребуется возможность работы php с сокетами. Код получился большой и для удобства я его оформил в отдельный класс, который можно скачать тут.
Ниже пример использования класса:
Обновление 30.09.2014
В последнее время Яндекс не работает через простой сокет, только через SSL, поэтому следует использовать вот такой код для вызова класса:
Обновление 1.10.2014
Обновлен класс. Теперь корректно происходит работа с почтовым сервером mail.ru по SSL протоколу.
Так же для корректной работы с mail.ru необходимо в заголовках письма в отправителе указывать e-mail, с которого происходит отправка, например:
Если авторизация происходит через e-mail ipatovsoft@mail.ru, то заголовок должен выглядеть следующим образом:
Обновление 2.10.2014
Класс подредактирован, теперь работает и с gmail.com через протокол SSL
Пример:
Так же вы можете почитать об обновленном классе и работе через протокол ssl в новой статье: Отправка писем через SMTP с авторизацией по протоколу SSL на php.
Обновление 13.03.2018: Класс обновился, подробнее тут: Новая версия класса SendMailSmtpClass
Отправка электронных писем с помощью библиотеки PHPMailer языка PHP
Функционала mail() достаточно для выполнения большинства стандартных задач, связанных с отправкой электронных писем, но зачастую она не обеспечивает требуемую гибкость.
Для работы mail() требуется сконфигурированный локальный сервер, в то время как PHPMailer поддерживает протокол SMTP, который могут использовать аутентифицированные пользователи.
Рассмотрим ещё несколько преимуществ использования PHPMailer:
К слову, PHPMailer используют многие CMS, созданные на языке PHP: например, WordPress, Joomla! и Drupal.
Установка библиотеки PHPMailer
Для установки PHPMailer можно использовать менеджер пакетов (композер), выполнив следующую команду:
composer require phpmailer/phpmailer
Отправка электронных писем с локального сервера с помощью PHPMailer
Ниже представлен простой код для отправки электронного письма с локального сервера через библиотеку PHPMailer:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
//From email address and name
$mail->From = «from@yourdomain.com»;
$mail->FromName = «Full Name»;
//To address and name
$mail->addAddress(«recepient1@example.com», «Recepient Name»);
$mail->addAddress(«recepient1@example.com»); //Recipient name is optional
//Address to which recipient will reply
$mail->addReplyTo(«reply@yourdomain.com», «Reply»);
//CC and BCC
$mail->addCC(«cc@example.com»);
$mail->addBCC(«bcc@example.com»);
//Send HTML or Plain Text email
$mail->isHTML(true);
$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;
Представленный код с комментариями наглядно демонстрирует все действия, которые нужно выполнить для отправки письма.
Отправка письма с вложениями
В приведённом ниже коде показано, как отправить письмо с вложениями с помощью PHPMailer:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer;
$mail->From = «from@yourdomain.com»;
$mail->FromName = «Full Name»;
$mail->addAddress(«recipient1@example.com», «Recipient Name»);
//Provide file path and name of the attachments
$mail->addAttachment(«file.txt», «File.txt»);
$mail->addAttachment(«images/profile.png»); //Filename is optional
$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;
Чтобы прикрепить файлы к письму, необходимо вызвать метод addAttachment объекта PHPMailer, который в качестве аргумента принимает строку с адресом файла. Для прикрепления нескольких файлов нужно вызвать этот метод соответствующее число раз.
Устранение проблем в коде
В зависимости от типа системы, наиболее распространенной ошибкой при использовании встроенной функции mail() в фоновом режиме является следующая:
Mailer Error: Could not instantiate mail function.
Если нужно получить больше сведений о возникшей ошибке, можно добавить следующий код в блок catch<> :
Как правило, ошибки использования функции mail() связаны с тем, что почтовый сервер не был сконфигурирован. В этом случае функция error_get_last вернёт следующее:
Array (
⠀⠀⠀⠀ [type] => 2
⠀⠀⠀⠀ [message] => mail(): Failed to connect to mailserver at «localhost» port 25, verify your «SMTP» and «smtp_port» setting in php.ini or use ini_set()
⠀⠀⠀⠀ [file] => OUR_PATH \vendor\phpmailer\phpmailer\src\PHPMailer.php
⠀⠀⠀⠀ [line] => 863
`)
Чтобы избежать этой весьма распространённой проблемы, рекомендуется использовать протокол SMTP.
Отображение сообщений об ошибках на требуемом языке
В папку language также можно добавить любой другой язык из 43 доступных.
Использование протокола SMTP
Для отправки электронных писем можно использовать почтовый сервер другого хоста, но сперва необходимо пройти аутентификацию. То есть для отправки писем через почтовый сервер Gmail необходимо иметь учётную запись в этом сервисе.
SMTP – протокол запроса на отправку электронного письма, используемый почтовыми клиентами. После того, как почтовый сервер проверит электронное письмо, он отправит его на указанный почтовый сервер.
Ниже приведен пример отправки письма через почтовый сервер Gmail с клиентского домена. Поскольку мы используем SMTP-протокол, локальный почтовый сервер не требуется:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
//Enable SMTP debugging.
$mail->SMTPDebug = 3;
//Set PHPMailer to use SMTP.
$mail->isSMTP();
//Set SMTP host name
$mail->Host = «smtp.gmail.com»;
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;
//Provide username and password
$mail->Username = «name@gmail.com»;
$mail->Password = «super_secret_password»;
//If SMTP requires TLS encryption then set it
$mail->SMTPSecure = «tls»;
//Set TCP port to connect to
$mail->Port = 587;
$mail->From = «name@gmail.com»;
$mail->FromName = «Full Name»;
$mail->addAddress(«name@example.com», «Recepient Name»);
$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;
Сервер Gmail использует TSL-шифрование поверх SMTP, поэтому в коде было установлено соответствующее значение для свойства объекта PHPMailer. Перед отправкой по протоколу SMTP необходимо указать имя хоста, номер порта, тип шифрования и пройти аутентификацию, а также предоставить имя пользователя и пароль. Если в Gmail была включена функция двухфакторной аутентификации, доступ к SMTP через имя пользователя и пароль будет закрыт. Для получения доступа необходимо внести дополнительные настройки.
Извлечение писем через протокол POP3
Библиотека PHPMailer поддерживает отправку писем по методу аутентификации POP перед SMTP. Иначе говоря, вы сможете пройти аутентификацию через POP и отправлять почту через SMTP. К сожалению, в PHPMailer реализована только возможность отправки электронных писем, поэтому получать почту по протоколу POP3 с использованием библиотеки не получится.
Заключение
Если вы являетесь PHP-разработчиком, вы будете часто сталкиваться с необходимостью программной отправки электронных писем. Конечно, можно использовать сторонние сервисы (Mandrill или SendGrid) или написать свою собственную библиотеку, но лучшим инструментом для решения этой задачи пока по-прежнему остаётся PHPMailer.