Форма обратной связи для сайта с отправкой на почту

PHPMailer

PHPMailer — полнофункциональный PHP — класс, который выполняет все необходимые задачи по подготовке и рассылке сообщений по электронной почте. В том числе и с использованием SMTP и кодирования сообщений.

Основные зарактеристики:

  • самый популярный способ для отправки электронной почты в PHP
  • используется многими проектами с открытым исходным кодом: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomlaи др.
  • интегрированная поддержка SMTP — отправка без локального почтового сервера
  • возможность отправлять электронные письма с несколькими TO, CC, BCC и REPLY-TO
  • многостраничные / альтернативные электронные письма для почтовых клиентов, которые не читают HTML-адрес электронной почты
  • поддержка разных кодировок: UTF-8, 8-битных, base64, двоичных и др
  • аутентификация SMTP с помощью механизмов LOGIN, PLAIN, NTLM, CRAM-MD5 и Google XOAUTH2 через SSL и TLS-транспорт
  • сообщения об ошибках на 47 языках (в том числе Русский, Иврит)
  • поддержка подписей DKIM и S / MIME
  • совместимость с PHP 5.0 и более поздними версиями

Многие разработчики PHP используют в своем коде электронную почту. Единственная функция PHP, которая поддерживает — функция mail (). Тем не менее, он не предоставляет никакой возможности для использования популярных функций, таких как электронные письма и вложения на основе HTML.

Правильно форматировать электронную почту достатчно сложно. Существует множество пересекающихся стандартов, протоколов RFC, требующих жесткой привязки к достаточно сложным правилам форматирования и кодирования. Подавляющее большинство программ, которые можно найти в Интернете, использущих PHP — функцию mail () напрямую, содержат большое количество ошибок, так как ата задача сложна. Также не имеет смысла делать то самостоятельно.

Функция PHP mail() обычно использует локальный почтовый сервер, как правило, с помощью бинарного файла sendmail на платформах Linux, BSD и OS X, однако Windows обычно не включает локальный почтовый сервер. Встроенная в PHPMailer SMTP-поддержка  позволяет отправлять электронную почту на любых платформах ( в том числе: Windows) без локального почтового сервера.

Как отправить почту по SMTP через Gmail в PHPMailer

По умолчанию в Google аккаунте отключена возможность отправлять почту по SMTP через Gmail в PHPMailer. Чтобы её включить необходимо предоставить доступ к аккаунту для приложения.

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

Для этого необходимо перейти в Google аккаунт и открыть раздел «Безопасность». В группе «Вход в аккаунт Google» найти настройку «Двухэтапная аутентификация» и посмотреть её статус.

Что делать при выключенной двухэтапной аутентификации Google

Если настройка «Двухэтапная аутентификация» выключена, то перейти к группе «Ненадежные приложения, у которых есть доступ к аккаунту» и нажать на «Открыть доступ (не рекомендуется)». После этого на открывшейся странице перевести переключатель «Небезопасные приложения заблокированы» в состояние включено. На этом действия по настройке Google аккаунта завершены.

Что делать при включённой двухэтапной аутентификации Google

Когда настройка «Двухэтапная аутентификация» включена необходимо выполнить другие действия, а именно создать пароль для приложения. Потому что использовать пароль, который вы используете для обычного входа на почту, для SMTP аутентификации в соответствии с безопасностью Google в этом случае нельзя.

Чтобы создать пароль приложению нужно перейти в Google аккаунт, а затем в раздел «Безопасность». Далее на этой странице найти группу настроек «Вход в аккаунт Google» и кликнуть на ссылку «Пароли приложений». На открывшейся странице из раскрывающегося списка «Приложение» необходимо выбрать «Другое (введите название)» и написать, например, имя своего сайта, а затем нажать на кнопку «Создать». Созданный пароль необходимо скопировать, он нам нужен будет при настройке отправки почты через PHPMailer.

Настройка process.php для отправки через Gmail

В process.php для отправки почты через Gmail нужно выставить следующие настройки:

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

Интересные статьи, связанные с созданием форм обратных связей:

Создаем форму отправки данных в html

На этом этапе нужно создать файл form.php, в него добавить html код формы. Подробности о каждом элементе формы читайте в статье Как сделать форму в HTML для сайта.

Первая строка будет следующей

Вернемся к форме. Вторая строка будет содержать поле для ввода ФИО. Имеет следующий код:

Тип формы text, то есть пользователь сможет ввести или скопировать сюда текст с клавиатуры. Под параметром name содержится название формы. В данном случае это fio, именно под таким именем будет передаваться все, что пользователь введен в данноу поле. Параметр placeholder указывает на то, что будет записано в этом поле в виде пояснения.

Следующая строка:

Следующей строкой будет кнопка «отправить»:

И последней строкой в форме будет тэг </form>

Теперь соберем все вместе.

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

Отправка почты через smtp яндекса

Почта будет приходить на любой адрес, который будет указан в скрипте вместо значения ‘to’, но обрабатывать и отправлять эту почту будет именно тот SMTP, который будет указан в настройках openserver.

  1. Запускаем сервер
  2. Открываем модуль openserver с настройками в меню «почта»
  3. Заполняем все поля как показано на картинке, при этом, имя пользователя, e-mail отправителя и пароль подставляем от реального почтового ящика на яндексе.

Сохраняем настройки и после того, как сервер будет перезапущен, можно обратиться к самому скрипту. Из папки «Мои сайты», открыть папку «send» в которой и находится сохраненный ранее скрипт index.php.

К стати, данный скрипт можно сохранить под любым именем, главное чтобы расширение скрипта было «php»

Как только произойдет обращение к данному скрипту, в новом окне браузера появится информация о том, что скрипт отработал.

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

Если его нет, значит что-то настроено не правильно, либо письмо попало в папку спам.

Все остальные настройки выглядят аналогично, но на всякий случай дополнительная информация не помешает.

Отправка Писем с PHPMailer

PHPMailer — популярная библиотека отправки почты для PHP. Она поддерживает отправку писем, как через функцию mail(), так и через простой протокол передачи почты (SMTP). Библиотека значительно упрощает сложный процесс отправки писем с помощью PHP, предоставляя набор готовых функций для создания и отправки почты.

Установить PHPMailer довольно просто, особенно если у вас установлен Composer. Если вы используете Hostinger, вам не нужно об этом беспокоиться, поскольку он по умолчанию включен в каждый пакет хостинга.

Однако, если вам нужно установить PHPMailer вручную, тогда подключите свою учётную запись хостинга через терминал SSH. Следуй этой инструкции:

Загрузите и установите SSH-клиент PuTTY.
Перейдите в панель управления hPanel, найдите и кликните по «SSH-доступ» в разделе «Расширенные«.
Обратите внимание на раздел с информацией для SSH-доступа. Вам понадобится SSH IP, порт, имя пользователя и пароль.
Откройте PuTTY, затем укажите свой SSH IP и порт соответственно.

Нажмите Open, появится командное окно

Введите своё имя пользователя и пароль SSH. Как только это будет сделано, нажмите Enter.

ПРИМЕЧАНИЕ: PuTTY НЕ показывает пароли. Не волнуйтесь, если вы не увидите ваш пароль на экране.

Выполните следующую команду:

cd public_html
  1. Нажмите Enter, затем запустите эту команду:
composer require phpmailer/phpmailer
  1. Подождите, пока процесс установки не будет завершён.

Проверьте, нет ли соединения с портом

Блокировка порта является очень распространенной проблемой, с которой сталкивается большинство разработчиков при интеграции своего кода для доставки электронной почты с использованием SMTP. И это можно легко отследить в почтовых журналах сервера (местоположение сервера почтового журнала может варьироваться от сервера к серверу, как объяснено выше). Если вы находитесь на сервере общего хостинга, порты 25 и 587 остаются заблокированными по умолчанию. Этот блок специально сделан вашим хостинг-провайдером. Это верно даже для некоторых выделенных серверов. Когда эти порты заблокированы, попробуйте подключиться через порт 2525. Если вы обнаружите, что этот порт также заблокирован, то единственное решение — связаться с вашим хостинг-провайдером, чтобы разблокировать эти порты.

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

Используйте порты 25 или 587 для простых соединений/TLS и порт 465 для соединений SSL. Для большинства пользователей предлагается использовать порт 587, чтобы избежать ограничений скорости, установленных некоторыми хостинг-провайдерами.

Убедитесь, что ваш хостинг-провайдер позволяет отправлять электронную почту и не ограничивает отправку почты

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

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

Установка нескольких форм обратной связи на одной странице

При необходимости на страницу можно добавить несколько форм обратной связи.

Осуществляется это посредством выполнения следующих шагов.

В HTML файле (index.html) нужно:

  • скопировать имеющийся фрагмент формы обратной связи и расположить его в нужном месте страницы;
  • установить форме новый идентификатор, т.е. значение атрибута id (например, feedback-form-2);
  • указать атрибуту action формы путь к php-сценарию, который будет обрабатывать её на стороне сервера (например, /feedback/process/process-2.php);
  • установить капче (элементу ) в атрибуте src и data-src get-параметр; его значение будет являться ключом, с которым будет связан её код на сервере (например, /feedback/captcha/captcha.php?id=captcha-2);
  • изменить у формы значения атрибутов id и for так, чтобы они были уникальными на странице;
  • установить ссылке с помощью которой перезапускается форма значение атрибута data-reloadform (например, #feedback-form-2).

В JavaScript файле () необходимо добавить блок инициализации для второй формы:

Последнее действие – это выполнить создание копии файла process.php. В новом файле (например, process-2.php) необходимо изменить код, посредством которого эта форма должна будет обрабатываться на сервере.

Если в форме не изменяется количество полей, то достаточно будет изменить только фрагмент кода, в котором проверяется код капчи. А именно изменить ключ в суперглобальном массиве $_SESSION с captcha на тот, который мы установили (в данном случае на captcha-2).

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

Отправка письма с вложением с помощью 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.

Проверьте возвращаемое значение mail()

Функция :

Это важно отметить, потому что:

  • Если вы получаете возвращаемое значение , вы знаете, что ошибка связана с тем, что ваш сервер принимает вашу почту. Вероятно, это не проблема кодирования, а проблема конфигурации сервера. Вам нужно поговорить с системным администратором, чтобы узнать, почему это происходит.
  • Если вы получаете возвращаемое значение , это не означает, что ваше электронное письмо обязательно будет отправлено. Это просто означает, что письмо было успешно отправлено соответствующему обработчику на сервере PHP. Еще больше точек сбоя вне контроля PHP, которые могут привести к тому, что письмо не будет отправлено.

Таким образом, поможет направить вас в правильном направлении, тогда как означает not, что означает, что ваша электронная почта была успешно отправлена

Это важно отметить!

База данных

CREATE TABLE IF NOT EXISTS `users` (
 `uid` int(11) NOT NULL AUTO_INCREMENT,
 `email` varchar(300) NOT NULL UNIQUE,
 `password` varchar(300) NOT NULL,
 `activation` varchar(300) NOT NULL UNIQUE,
 `status` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`)
 )

HTML код

Содержит простой HTML код:

<form action="" method="post">
<label>Email</label>
<input type="text" name="email" class="input" autocomplete="off"/>
<label>Password </label>
<input type="password" name="password" class="input" autocomplete="off"/><br/>
<input type="submit" class="button" value="Registration" />
<span class='msg'><?php echo $msg; ?></span>
</form>

db.php

Файл конфигурации базы данных, измените имя пользователя, пароль, базу данных и основные значения URL:

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
define('DB_DATABASE', 'database');
 $connection = @mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
 $base_url='http://www.youwebsite.com/email_activation/';
?>

index.php

Содержит PHP код, который сохраняет данные регистрации пользователя в таблицу users.

Здесь же находится генерация кода активации с помощью MD5 шифрования:

<?php
include 'db.php';
 $msg='';
 if(!empty($_POST) && isset($_POST) &&  !empty($_POST) &&  isset($_POST) )
 {
// имя пользователя и пароль отправлены из формы
 $email=mysql_real_escape_string($_POST);
 $password=mysql_real_escape_string($_POST);
// регулярное выражение для проверки написания адреса электронной почты
 $regex = '/^+(.+)*@+(.+)*(.{2,4})$/';
 if(preg_match($regex, $email))
 { 
 $password=md5($password); // encrypted password
 $activation=md5($email.time()); // encrypted email+timestamp
 $count=mysqli_query($connection,"SELECT uid FROM users WHERE email='$email'");
// проверка адреса электронной почты
 if(mysqli_num_rows($count) < 1)
 {
mysqli_query($connection,"INSERT INTO users(email,password,activation) VALUES('$email','$password','$activation')");
// отправка письма на электронный ящик
include 'smtp/Send_Mail.php';
 $to=$email;
 $subject="Подтверждение электронной почты";
 $body='Здравствуйте! <br/> <br/> Мы должны убедиться в том, что вы человек. Пожалуйста, подтвердите адрес вашей электронной почты, и можете начать использовать ваш аккаунт на сайте. <br/> <br/> <a href="'.$base_url.'activation/'.$activation.'">'.$base_url.'activation/'.$activation.'</a>';

Send_Mail($to,$subject,$body);
 $msg= "Регистрация выполнена успешно, пожалуйста, проверьте электронную почту."; 
 }
 else
 {
 $msg= 'Данный адрес электронный почты уже занят, пожалуйста, введите другой. '; 
 }
 }
 else
 {
 $msg = 'Адрес, введенный вами, неверен. Пожалуйста, попробуйте еще раз.'; 
 }
 }
// HTML часть
?>

Send_Mail.php

В этом файле находится функция отправки сообщения, измените только SMTP хост, имя пользователя и пароль.

Здесь вы можете использовать элементы GMail SMTP для тестирования:

<?php
function Send_Mail($to,$subject,$body)
 {
require 'class.phpmailer.php';
 $from       = "[email protected]";
 $mail       = new PHPMailer();
 $mail->IsSMTP(true);            // используем протокол SMTP
 $mail->IsHTML(true);
 $mail->SMTPAuth   = true;                  // разрешить SMTP аутентификацию 
 $mail->Host       = "tls://smtp.yourwebsite.com"; // SMTP хост
 $mail->Port       =  465;                    // устанавливаем SMTP порт
 $mail->Username   = "SMTP_Username";  //имя пользователя SMTP  
 $mail->Password   = "SMTP_Password";  // SMTP пароль
 $mail->SetFrom($from, 'From Name');
 $mail->AddReplyTo($from,'From Name');
 $mail->Subject    = $subject;
 $mail->MsgHTML($body);
 $address = $to;
 $mail->AddAddress($address, $to);
 $mail->Send(); 
 }
 ?>

activation.php

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

<?php
include 'db.php';
 $msg='';
 if(!empty($_GET) && isset($_GET))
 {
 $code=mysql_real_escape_string($_GET);
 $c=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code'");
 if(mysqli_num_rows($c) > 0)
 {
 $count=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code' and status='0'");

 if(mysqli_num_rows($count) == 1)
 {
mysqli_query($connection,"UPDATE users SET status='1' WHERE activation='$code'");
 $msg="Ваш аккаунт активирован"; 
 }
 else
 {
 $msg ="Ваш аккаунт уже активирован, нет необходимости активировать его снова.";
 }
 }
 else
 {
 $msg ="Неверный код активации.";
 }
 }
?>
//HTML часть
<?php echo $msg; ?>

Отправка почты через smtp mail ru

Для того, чтобы настроить отправку почты через SMTP mail ru, необходимо просто заменить параметры яндекса на параметры mail ru.

А чтобы не перестраивать каждый раз локальные сервер, лучше всего настроить разные профили openserver. Как это сделать показано в видеоуроке Openserver настройка php с помощью профилей.

В этом случае достаточно будет просто загрузить профиль и все настройки, которые были указаны для данного профиля будут доступны после перезапуска сервера. Очень удобная штука и работает очень просто.

Для каждого профиля (совсем не важно как он будет называться), должны быть сделаны свои настройки, если конечно планируется использование разных по своим параметрам скриптов, cms-систем и приложений. Если нет, то можно обойтись и настройками по умолчанию

Что касается SMTP mail ru, то здесь все эдентично.

Меняются данные яндекса на данные mail ru

Отправка почты из формы

По-видимому, одной из наиболее распространенных областей применения функции mail() языка PHP является отправка почты из формы. Такой вариант предоставляет значительно более широкие функциональные возможности по сравнению с дескриптором ссылки mailto языка HTML, использование которого, безусловно, приводит к отправке электронной почты из почтовой программы клиентского компьютера. Ниже приведен простой пример формы такого типа, который часто применяется для отправки электронной почты:

Код PHP

При использовании любых переменных $_POST в связи с отправкой почты необходимо в первую очередь учитывать возможные отрицательные последствия с точки зрения безопасности. Недобросовестные лица могут использовать эту форму для рассылки спама. В частности, взломщик получает возможность оформить некоторое сообщение в виде значения переменных суперглобального массива $_POST, которые затем вставляются в сообщение. В данном примере я опустил дополнительные проверки и обеззараживание введенных данных для простоты примера, более подробную информацию вы можете найти в статье «Безопасность в PHP».

Создание Тестового Файла PHP Mail

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

  1. В hPanel щёлкните на Файловый менеджер -> Перейдите на страницу Файлового менеджера.
  2. Создайте новый файл, нажав на иконку «Новый Файл» в верхнем меню. Назовём наш файл testmail.php и завершим процесс создания, нажав кнопку «Создать«.
  3. Дважды кликните по файлу testmail.php, поскольку мы собираемся редактировать его с помощью функции PHP mail(). Вот пример основных компонентов функции, которые мы будем использовать в этом руководстве. Они будут объяснены более подробно в следующем разделе. Сейчас просто нажмите «Save & Close«, когда закончите редактировать.
  4. Теперь вы можете отправить электронное письмо, открыв в браузере VashDomen/testmail.php. Не забудьте заменить «VashDomen» на доменное имя, которое вы использовали для создания тестового файла testmail.php.
  5. Теперь отправка email с PHP должна работать. Письмо должно прийти на почту получателя.

Создаём файл конфигурации

Создадим файл send.php с таким содержанием

Здесь вам нужно отредактировать эти поля под себя:

// Формирование самого письма$title = "Заголовок письма";$body = "Само письмо"// Настройки вашей почты$mail->Host       = 'smtp.yandex.ru'; // SMTP сервера вашей почты$mail->Username   = 'your_login'; // Логин на почте$mail->Password   = 'password'; // Пароль на почте$mail->SMTPSecure = 'ssl';$mail->Port       = 465;// Адрес самой почты и имя отправителя$mail->setFrom('[email protected]', 'Имя отправителя');// Получатель письма$mail->addAddress('[email protected]');  $mail->addAddress('[email protected]'); // Ещё один, если нужен

Создаем файл, принимающий данные из HTML формы

Это будет файл с именем send.php

В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:

Перед названиями переменных в php ставится знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method=»post». Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров — функций php.

Первая функция преобразует все символы, которые пользователь попытается добавить в форму:

При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ «<» в ‘&lt;’. Также он поступить с другими символами, встречающимися в html коде.

Вторая функция декодирует url, если пользователь попытается его добавить в форму.

Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:

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

Проверка данных, передаваемых от HTML формы в файл PHP

Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:

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

Отправить на несколько аккаунтов

Чтобы исключить проблемы с учетной записью электронной почты, отправьте свою электронную почту на несколько учетных записей электронной почты у разных поставщиков электронной почты Если ваши электронные письма не поступают в учетную запись Gmail пользователя, отправьте те же электронные письма в учетную запись Yahoo, учетную запись Hotmail и обычную учетную запись POP3 (например, учетную запись электронной почты, предоставленную Интернет-провайдером).

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

Отправка подписанного и зашифрованного письма через PHPMailer

По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:

$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;

Чтобы подписать письмо подписью DKIM, необходимо выполнить несколько действий:

  • Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
  • Добавить DNS-запись для домена типа TXT с публичным ключом
  • Настроить DKIM подпись в PHPMailer перед отправкой письма

Теперь опишу каждый шаг немного подробнее.

Генерация приватного и публичного ключей

Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:

openssl genrsa -out test-private.pem 1024
openssl rsa -in test-private.pem -out test-public.pem -pubout

Соответственно, test-private.pem и test-public.pem — это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.

Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:

$domain = 'test.ru';                   // ваш домен
$privatekeyfile = 'test-private.pem';  // имя файла, в который будет записан приватный ключ
$publickeyfile = 'test-public.pem';    // имя файла, в который будет записан публичный ключ

if (file_exists($privatekeyfile)) {
  echo "<p>Using existing keys</p>";
  $privatekey = file_get_contents($privatekeyfile);
  $publickey = file_get_contents($publickeyfile);
} else {
  echo "<p>Create keys</b>";
  $pk = openssl_pkey_new(
      
  );
  openssl_pkey_export_to_file($pk, $privatekeyfile);
  $pubKey = openssl_pkey_get_details($pk);
  $publickey = $pubKey;
  file_put_contents($publickeyfile, $publickey);
  $privatekey = file_get_contents($privatekeyfile);
}
echo "<p>Private key (keep this private!):</p><pre>" . $privatekey . "</pre>";
echo "<p>Public key:</p><pre>" . $publickey . "</pre>";

Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи

Добавление DNS-записи с публичным ключом

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

Нужно добавить DNS-запись следующего вида:

Имя записи: mail._domainkey.test.ru. (в конце точка «.»)

TTL: 3600 (или какое будет по-умолчанию)

Тип записи: TXT

Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ

В имени записи test.ru нужно заменить на имя вашего домена. Слова «ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ» вы заменяете на текст, который вы получили на предыдущем шаге после «Public key», без «——BEGIN PUBLIC KEY——» и «——END PUBLIC KEY——«, только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку, чтобы переводов строки не было.

Настройка подписи DKIM в PHPMailer и отправка письма

Теперь осталось лишь сделать несколько настроек PHPMailer перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:

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

// Создаем письмо
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->setFrom('[email protected]');
$mail->addAddress('[email protected]');
$mail->Subject = 'Это тест';
$mail->msgHTML('<p>Это тест</p>');

// Настройка DKIM подписи
$mail->DKIM_domain = 'test.ru';
$mail->DKIM_private = 'test-private.pem';
$mail->DKIM_selector = 'mail';

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

Разумеется, test.ru вы должны поменять на имя своего домена, а test-private.pem на полный путь и имя файла приватного ключа, который был создан на этапе генерации ключей.

Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

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