Отправка email с php mail и phpmailer: полное руководство

Популярная почтовая библиотека

Существует множество способов доставки писем. Обычно отправляют электронную почту двумя способами:

  • используя встроенную в PHP функцию Mail;
  • используя стороннюю библиотеку, такую как PHPMailer с SMTP.

Перед началом использования программы понадобится следующее:

Веб-хостинг.
Учетная запись электронной почты.
Включенная функция PHP Mail.
Включенная функция SMTP.
Домен с записи Hostinger MX.

Mail в PHP позволяет отправлять электронную почту с помощью локальной программы sendmail. Каждый раз, когда пользователь запускает сервис почты, он вызывает эту локальную программу, обычно настраиваемую системным администратором. Можно включить или отключить эту функцию в разделе «Электронная почта» -> «Раздел управления почтовой службой».

PHPMailer — популярная библиотека, поддерживающая отправку почты через функцию PHP Mail или SMTP.

Алгоритм работы:

Чтобы использовать PHPMailer с Hostinger SMTP, сначала необходимо создать идентификатор в разделе «Учетная запись электронной почты» на панели веб-хостинга. У пользователя будет четыре поля: имя пользователя учетной записи электронной почты, пароль, SMTP-хост, порт SMTP.
После этого начинают установку PHPMailer. Один из простых способов сделать это — использовать Composer, который предварительно интегрирован в планы общего хостинга, поэтому подключаются через SSH и выполняют следующую команду: cd public_html.
Далее запускают: composer requires phpmailer и ждут несколько минут, пока установка завершится и PHPMailer появится в созданном каталоге поставщиков. Для доставки используется SMTP. Эта строка импортирует класс PHPMailer в глобальное пространство имен и включает в себя различные библиотеки.
Отправляют HTML-сообщение. Его содержимое будет взято из файла message.html, расположенного в том же каталоге. Это позволяет форматировать текст и дает большую функциональность по сравнению с обычными текстовыми сообщениями.

Отправка письма с вложением с помощью PHPMailer

Здесь всё довольно просто, нужно лишь использовать метод addAttachment. Приведу пример, заодно продемонстрировав еще несколько дополнительных возможностей:

// Подключаем библиотеку PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/Exception.php';

// Создаем письмо
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->setFrom('[email protected]', 'Иван Иванов');     // от кого
$mail->addReplyTo('[email protected]', 'Иван Иванов');  // обратный адрес
$mail->addAddress('[email protected]', 'Вася Петров');    // кому
$mail->Subject = 'Тест';                           // тема
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);  // получаем "тело" письма из файла
$mail->AltBody = 'Письмо обычным текстом';  // письмо обычным текстом, если клиент не поддерживает html
$mail->addAttachment('my_file.txt');        // прикрепляем один файл
$mail->addAttachment('phpmailer.jpg');      // прикрепляем второй файл

// Отправляем
if ($mail->send()) {
  echo 'Письмо отправлено!';
} else {
  echo 'Ошибка: ' . $mail->ErrorInfo;
}

Адресов получателей можно добавить несколько с помощью addAddress. Или, если необходимо, можно наоборот, очистить все адреса получателей методом clearAddresses(). Очистить все вложения можно с помощью clearAttachments().

Так же можно использовать AddEmbeddedImage чтобы добавить в письмо вложение (обычно изображения), которое предназначено для использования в html-коде и не будет доступно для скачивания. Пример использования картинки в письме, не доступной для скачивания:

// Подключаем библиотеку PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer/PHPMailer.php';

//Создаем письмо
$mail = new PHPMailer;
$mail->IsHTML(true);
$mail->setFrom('[email protected]', 'Иван Иванов');
$mail->addAddress('[email protected]', 'Вася Петров');
$mail->Subject = 'Test';
$mail->AddEmbeddedImage('phpmailer.jpg','testImage');
$mail->Body = '<p>Изображение в html-коде <img src="cid:testImage"></p>';

// Отправляем
$mail->send();

Таким образом, вы можете отправлять письма с изображениями, которые есть только в теле письма, но их нельзя скачать как вложение. Эти изображения можно использовать в любом месте html-кода письма, нужно лишь указывать вместо url-адреса cid изображения, который вы использовали в AddEmbeddedImage.

Отправить email автоматически

Рис. 5 — Диаграмма бизнес-процесса по отправке приветственного сообщения контакту

  1. Добавьте начальный элемент на диаграмму процесса.

    1. Чтобы настроить однократный или регулярный автоматический запуск процесса в заданное время, воспользуйтесь элементом Стартовый таймер.

    2. Чтобы настроить автоматический запуск процесса после определенных изменений в Creatio, например, после добавления нового контакта (Рис. 6), воспользуйтесь начальным элементом Сигнал.

      Рис. 6 — Пример настройки элемента Сигнал

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

  2. Рис. 8 — Передача в поле Кому Id контакта, активировавшего начальный элемент Сигнал

  3. В зависимости от желаемого результата выберите один из следующих вариантов:

    1. Если вы хотите, чтобы в письме использовались параметры процесса или макросы, то добавьте на диаграмму процесса элемент, который может получить нужную информацию из базы данных Creatio.

    2. Например, если в письмо нужно подставлять имя и электронный адрес нового контакта, то разместите элемент Читать данные (Рис. 9) на диаграмме процесса и вычитайте данные контакта, добавление которого инициировало запуск процесса. Данные будут записаны в исходящие параметры элемента, которые можно использовать как макросы в теле письма.

      Рис. 9 — Пример настройки свойств элемента Читать данные

  4. Сохраните процесс.

Отправление писем ввиде HTML при помощи PHP и PHPMailer

Формирование HTML письма – это одна из самых сложных задач при отправке почты средствами PHP. Настройка MIME заголовков и построение HTML – нелегкая задача и требует дополнительных знаний и исследований. Однако, PHPMailer сделает вашу жизнь проще, далее, мы покажем как это реализуется.

Важное замечание относительно почты ввиде HTML

Прежде чем мы приступим к отправке таких писем, я хотел бы, чтобы вы поняли, что важно знать о том, каким образом должны подключаться изображения и стили CSS, и т.д. Простое правило состоит в том, чтобы хранить эти файлы на сервере, а в письме давать полные ссылки на них

Если вы сходите сума и добавляете все эти файлы к письму, то готовьтесь к головной боли. Например, тело моего письма выглядит примерно так:

Как вы видете, я сделал каждый URL полным, а не сокращенным относительно моего документа. Если этого не сделать, то ваши изображения не будут грузиться и пользователь их не увидит!

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

Дополнительные «тела» письма

Никогда не полагайтесь только на HTML при отправке писем, если ваше сообщение очень важное. Вы должны позаботиться о получателе и помимо HTML письма прикрепить и только text-only (только текст) версию сообщения, поскольку некоторые почтовые клиенты не умеют показывать HTML письма

Мы можем достигнуть такого эффекта добавляя дополнительные тела письма функциейAltBodyкласса PHPMailer. Давайте добавим текстовую версию вашего сообщения. Как только мы добавляем несколько тел письма – PHPMailer автоматически сформирует многослойное письмо.

Отправка писем через SMTP с помощью PHPMailer на примере Yandex и Google

Можно так же отправить письмо через другой почтовик, например, через Яндекс. Код будет выглядеть примерно так:

// Подключаем библиотеку PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

// Создаем письмо
$mail = new PHPMailer();
$mail->isSMTP();                   // Отправка через SMTP
$mail->Host   = 'smtp.yandex.ru';  // Адрес SMTP сервера
$mail->SMTPAuth   = true;          // Enable SMTP authentication
$mail->Username   = 'login';       // ваше имя пользователя (без домена и @)
$mail->Password   = 'password';    // ваш пароль
$mail->SMTPSecure = 'ssl';         // шифрование ssl
$mail->Port   = 465;               // порт подключения

$mail->setFrom('[email protected]', 'Иван Иванов');    // от кого
$mail->addAddress('[email protected]', 'Вася Петров'); // кому

$mail->Subject = 'Тест';
$mail->msgHTML("<html><body>
                <h1>Здравствуйте!</h1>
                <p>Это тестовое письмо.</p>
                </html></body>");
// Отправляем
if ($mail->send()) {
  echo 'Письмо отправлено!';
} else {
  echo 'Ошибка: ' . $mail->ErrorInfo;
}

Отправка писем через Google имеет один нюанс: нужно в аккаунте google разрешить доступ ненадежным приложениям. Для этого нужно зайти в свой аккаунт https://myaccount.google.com, перейти в безопасность, зайти в раздел «Ненадежные приложения, у которых есть доступ к аккаунту» и там переключить в «Разрешено». На момент написания статьи это страница https://myaccount.google.com/u/0/lesssecureapps.

Дальше в php-программе отправка писем через PHPMailer происходит аналогично как через yandex, нужно только заменить настройки SMTP так:

$mail->Host   = 'smtp.gmail.com';  // Адрес SMTP сервера
$mail->SMTPAuth   = true;          // Enable SMTP authentication
$mail->Username   = 'login';       // ваше имя пользователя
$mail->Password   = 'password';    // ваш пароль
$mail->SMTPSecure = 'ssl';         // шифрование ssl
$mail->Port   = 465;               // порт подключения

Если первый раз запускаете программу отправки через smtp, тогда желательно перед отправкой дополнительно использовать $mail->SMTPDebug = 1; чтобы получать все сообщения клиента и smtp-сервера, т.е. на экран выведется весь процесс подключения, авторизации и т.д., что очень полезно для отладки вашей программы.

История изменений

версия 2.11 (28.06.2016)

Устранение ошибки. В теме сообщения и в именах адресатов подчерк «_» заменялся на пробел » «. Например «Тема_2» менялось на «Тема 2». То же самое было и в именах адресатов.
Сейчас эту ошибку устранил — сделал кодирование заголовков с помощью base64.

версия 2.1 (17.11.2014)версия 2.0 (18.10.2013)

Решил уйти от совместимости со старыми версиями PHP, теперь скрипт работает с PHP 5 и выше.

Кодировка по умолчанию теперь UTF-8

Обратите внимание, кодировка скрипта тоже UTF-8.

Переработан механизм формирования письма и заголовков. Исправлены проблемы с прикреплением файлов с русскими именами.

После выполнения скрипта можно узнать статус отправки письма

$m->status_mail — при удачной отправке здесь будет TRUE, при ошибке FALSE
$m->status_mail — здесь текст ошибки или удачной отправки

Модернизирована отправка HTML письма. Теперь к html версии письма можно добавить альтернативную текстовую.
Для чего это нужно? Если почтовая программа получателя не умеет обрабатывать html или пользователь в настройках запретил обработку html,
то будет отображаться альтернативная текстовая версия. В современном интернете это не очень актуально, так как все сейчас видят письма в HTML,
но все почтовые программы по прежнему формируют письмо именно с альтернативным текстом.

Кодирование письма в base64. Теперь кодирование в base64 включено по умолчанию, очень советую так и оставить, но кому не нравится смогут переключиться в обычный 8bit.

Возможность отправки разных писем за одно соединение, либо одного письма, но индивидуально для некоторых.
Поясню. Если вам нужно отправить письмо нескольким получателям, то вы можете как и раньше перечислить их всех с помощью
$m->To(«[email protected]»);
$m->To(«[email protected]»);
В этом случае письмо будет отправлено всем этим адресатам и в поле TO (кому) будут все они перечислены и все получатели будут видеть кому еще было отправлено письмо.
В этой версии появилась возможность отправлять несколько индивидуальных писем за одно соединение.
Сколько таких индивидуальных писем можно отправить за раз, все зависит от лимитов вашего SMTP сервера. Некоторые сервера не разрешают отправлять более пяти писем за раз, другие 100-200 разрешают.
Если отправляете индивидульные письма не через SMTP, то в данном случае просто будет вызвана несколько раз функция mail() — так что на нее тоже есть ограничения.

Совместимость с версией 1.6.1.
Для перехода с предыдущих версий на 2.0 учтите слудующее.
$m=new Mail(); — Если вы запускали класс без указания кодировки, то в предыдущих версиях письма формировались в windows-1251, сейчас такая команда запускает UTF-8.
Если вам по прежнему нужно использовать windows кодировку, укажите ее $m=new Mail(«windows-1251»);
И второй момент. Получение лога по умолчанию не работает. Если вы используете $m->Get();, то сейчас вам нужно сначала включить накопление лога.
Для этого до отправки письма включите лог $m->log_on(true); и после этого $m->Get() сработает как прежде.

В остальном совместимость должна остаться.

версия 1.6.1 (02.10.2013)

Добавлена возможность встраивать картинки внутрь html
Для этого как и раньше прикрепляете картинки к письму
Например две картинки
$m->Attach( «1.jpg», «», «image/jpeg» );
$m->Attach( «2.jpg», «», «image/jpeg» );
А в самом html тексте письма вставляете картинки так

Например
$m->Body( ‘Текст текст И т.д.’, «html» );

Обратите внимание, тип сообщения должен быть html

версия 1.6.0 (09.12.2011)

Добавлена возможность добавлять имена к почтовым ящикам
Действует в From, To и ReplyTo
Имя добавляется через разделитель ‘;’ например
$m->To( «Максим;[email protected]» );

версия 1.5.1 (07.02.2011)версия 1.5 (28.02.2010)

Добавлена возможность отправлять почту через SMTP.
Подключается с помощью новой команды smtp_on().

версия 1.4 (24.02.2010)

  • адаптация к русской кодировке
  • возможность переименовывать прикрепленный файл
  • возможность отправлять письма в формате html
  • изменения в вызове некоторых функций

Запуск скрипта

PHPMailer предлагает пользователю дополнительные функции, которые можно попробовать в официальном репозитории GitHub. Также, если он использует WordPress, то может легко создать контактную форму с помощью плагинов.

Используют PHPMailer не только для отправки сообщений. Можно создать контактную форму, где посетители или пользователи связываются с сайтом. Ниже приведен конечный результат создания формы.

Порядок запуска скрипта:

  1. Создают файл testphpmailer.php и заполняют поля SMTP, которые были получены ранее.
  2. Выполняют скрипт, введя YourDomain.com/testphpmailer.php в браузере, появится сообщение.
  3. Как только пользователь его отправит, то получит подтверждение, что содержимое будет доставлено в ящик электронной почты, указанный в поле Address.
  4. Если контактная форма PHPMailer не работает, для проверки функции Mail PHP добавляют следующую строку, чтобы узнать причину проблемы: $ mail-> SMTPDebug = 2.

Original answer

I wasn’t quite sure as to what the question was, but am under the impression that a copy of the message is to be sent to the person who filled in the form.

Here is a tested/working copy of an HTML form and PHP handler. This uses the PHP function.

The PHP handler will also send a copy of the message to the person who filled in the form.

You can use two forward slashes in front of a line of code if you’re not going to use it.

For example: will not execute.

PHP handler (mail_handler.php)

To send as HTML:

If you wish to send mail as HTML and for both instances, then you will need to create two separate sets of HTML headers with different variable names.

http://php.net/manual/en/function.mail.php

Footnotes:

In regards to HTML5

You have to specify the URL of the service that will handle the submitted data, using the action attribute.

As outlined at https://www.w3.org/TR/html5/forms.html under 4.10.1.3 Configuring a form to communicate with a server. For complete information, consult the page.

Therefore, will not work in HTML5.

The proper syntax would be:

  • or
  • .

Note that will be the extension of the type of file used to handle the process. This could be a , , , file extension etc.

Consult the following Q&A on Stack if sending mail fails:

Отправка e-mail в PHP

<?php $to = «[email protected]»; $subject = «Robot — Робот»; $message = «Message, сообщение!»; mail ($to, $subject, $message);?>

Как видите, всё интуитивно понятно: кому отправлять, какая тема и само сообщение. Если Вы используете пакет Denwer, то после запуска скрипта, Вы сможете найти файл в директории «tmp/!sendmail«, в котором и содержатся данные Вашего письма. Открыть эти файлы можно либо в блокноте, но лучше открыть их в какой-нибудь почтовой программе (например, The Bat или Microsoft Outlook).

Я не даром написал вперемешку русский и английский текст, чтобы проверить кодировку. Очень часто она распознаётся неправильно, и в результате, пользователи видят «абракадабру«. Чтобы этого избежать необходимо задать кодировку. И как раз для кодировки, а также для других особых параметров и существует четвёртый аргумент функции mail():

<?php $to = «[email protected]»; $subject = «Robot — Робот»; $message = «Message,\n сообщение!»; $headers = «From: MyRusakov.ru <[email protected]>\r\nContent-type: text/plain; charset=utf-8 \r\n»; mail ($to, $subject, $message, $headers);?>

Теперь давайте расшифрую то, что здесь написано. В переменной headers мы задали следующие параметры: в поле «От кого» будет стоять «[email protected]» (то есть сообщения можно отправлять далеко не от своего имени). Сообщение также является обычным текстовым (text/plain) в кириллической кодировке (windows-1251), то есть в нашей с Вами родной кодировке, в которой имеется русский язык и английский. И, кстати, «\n» — это переход на новую строку (аналог <br /> в HTML).

<?php $to = «[email protected]»; $subject = «Robot — Робот»; $message ; $headers = «From: MyRusakov.ru <[email protected]>\r\nContent-type: text/html; charset=utf-8 \r\n»; mail ($to, $subject, $message, $headers);?>

Почему ошибка?

Это очень частый вопрос, где я с полной уверенностью могу сказать: 60% причин ошибок — это ваш хостинг, 30% — ваша почта, 9% — вы неверно указали данные от почты, а 1% причин —ты, сука, даун, который решил изменить код, а потом начинаешь искренне удивляться, почему ничерта не работает.

Чтобы узнать, в чём причина, нужно раскомментировать вот эту строчку кода (убрать //):

//$mail->SMTPDebug = 2

Теперь в браузере нужно открыть консоль (F12) > вкладка “console” и отправить сообщение. У вас должна появиться новая строчка (список), которую нужно раскрыть:


Причина: Error: authentication failed: Invalid user or password! , то есть неверно указаны данные почты.

Если для вас эти строчки, как иероглифы, и уверены, что ошибки в написании данных почты нет, то отправляете два письма: одно в тех.поддержку вашего хостинга, второе в тех.поддержку вашей почты с таким содержанием:

Привет. Пытаюсь настроить PHPMailer, но в логах у меня ошибка:*СЮДА ВСТАВЛЯЕТЕ ЭТИ СТРОЧКИ ИЗ КОНСОЛИ*

Через некоторое время они ответят и письма начнут нормально уходить.

Подведем итог

Этот обучающий курс должен дать вам хороший толчек в том, чтобы сделать свою жизнь проще при работе с почтой. И все это – благодаря превосходной библиотеке PHPMailer. Теперь вы можете посылать почту незадумываясь о заголовках и прочих трудностях.

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

Я надеюсь, что вы найдете время посетить сайт класса PHPMailer и почитать документацию к нему и FAQ

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

Post Views:
11 557

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: