ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Класс для отправка почты в PHP

Класс для отправка почты в PHP

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

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

Для начала необходимо создать конфигурационные константы:
define("MAILSITENAME", "My Site");
define("MAILCHARSET", "utf8");
define("MAILADMIN", "adminEmail@gmail.com");
В константе MAILSITENAME сохраняется название сайта, с которого будет происходить отправка сообщения.

Константа MAILCHARSET содержит кодировку (utf8).

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

Как известно, объект - это совокупность данных (свойств) и функций (методов) для их обработки. В свойствах данного класса будет содержатся одна переменная $send_error, которая отвечает за результат оправки. По умолчанию равна FALSE:
var $send_error = FALSE;
Далее будут следовать необходимые функции, и начнем с функции инициализации заголовков:
function compile_headers() {
$this->subject = "=?" . MAILCHARSET . "?b?" . base64_encode($this->subject) . "?=";
$from = "=?" . MAILCHARSET . "?b?" . base64_encode(MAILSITENAME) . "?=";
$this->mail_headers = "MIME-Version: 1.0" . "\n";
$this->mail_headers .= "Content-type: text/plain; charset=\"" . MAILCHARSET . "\"" . "\n";
$this->mail_headers .= "Subject: " . $this->subject . "\n";
$this->mail_headers .= "To: " . $this->to . "\n";
$this->mail_headers .= "From: \"" . $from . "\" <" . MAILADMIN . ">" . "\n";
$this->mail_headers .= "Return-Path: <" . MAILADMIN . ">" . "\n";
$this->mail_headers .= "X-Priority: 3" . "\n";
$this->mail_headers .= "X-Mailer: PHP" . "\n";
}
Далее следует функция отправки сообщения:
function send($to, $subject, $message) {
$this->to = $to;
$this->subject = $subject;
$this->compile_headers();
if ($this->to && MAILADMIN && $this->subject) {
if(!@mail($this->to, $this->subject, $message, $this->mail_headers)) {
$this->send_error = true;
}
}
}
Инициализация и отправка сообщения происходит следующим образом:
$mail = new send_mail;
$mail->send('userEmail@gmail.com', 'Заголовок сообщения', 'Содержание сообщения');
if ($mail->send_error) {
echo 'По техническим причинам не удалось отправить сообщение с восстановлением пароля. Попробуйте, пожалуйста, через некоторое время.';
} else {
echo 'Уважаемый посетитель! На ваш E-Mail адрес было отправлено сообщение.';
}
Полностью рабочий код с классом и отправкой сообщения:
<?php
define("MAILSITENAME", "My Site");
define("MAILCHARSET", "utf8");
define("MAILADMIN", "adminEmail@gmail.com");

class send_mail
{
var $send_error = FALSE; // Вывод ошибки
// Создание заголовков
function compile_headers() {
$this->subject = "=?" . MAILCHARSET . "?b?" . base64_encode($this->subject) . "?=";
$from = "=?" . MAILCHARSET . "?b?" . base64_encode(MAILSITENAME) . "?=";
$this->mail_headers = "MIME-Version: 1.0" . "\n";
$this->mail_headers .= "Content-type: text/plain; charset=\"" . MAILCHARSET . "\"" . "\n";
$this->mail_headers .= "Subject: " . $this->subject . "\n";
$this->mail_headers .= "To: " . $this->to . "\n";
$this->mail_headers .= "From: \"" . $from . "\" <" . MAILADMIN . ">" . "\n";
$this->mail_headers .= "Return-Path: <" . MAILADMIN . ">" . "\n";
$this->mail_headers .= "X-Priority: 3" . "\n";
$this->mail_headers .= "X-Mailer: PHP" . "\n";
}
// Функция оправки сообщения
function send($to, $subject, $message) {
$this->to = $to;
$this->subject = $subject;
$this->compile_headers();
if ($this->to && MAILADMIN && $this->subject) {
if(!@mail($this->to, $this->subject, $message, $this->mail_headers)) {
$this->send_error = true;
}
}
}
}

$mail = new send_mail;
$mail->send('useremail@gmail.com', 'Заголовок сообщения', 'Содержание сообщения');
if ($mail->send_error) {
echo 'По техническим причинам не удалось отправить сообщение с восстановлением пароля. Попробуйте, пожалуйста, через некоторое время.';
} else {
echo 'Уважаемый посетитель! На ваш E-Mail адрес было отправлено сообщение.';
}

Комментарии

Николай
ошибка PHP Notice: Undefined property: sender::$mail_headers in
Письмо при этом не отправляется, php 7.3
Дмитрий
$mail->send( 'useremail@gmail.com, 'Заголовок сообщения', 'Содержание сообщения' );
В коде опечатка, после "useremail@gmail.com" не хватает закрывающего одинарного апострофа ('useremail@gmail.com'). Возможно ошибка в этом. Проверил на PHP 7.3 все работает отлично.
Николай
Вот мой запрос
$sender->send($email, 'Восстановление пароля', 'Ваш пароль для входа на сайт - '.$new_pass.'');
Выводит ошибку PHP Notice: Undefined property: sender::$mail_headers in
и письмо не отправляет
Дмитрий
Измените строку:
$this->mail_headers .= "MIME-Version: 1.0" . "\n";
на
$this->mail_headers = "MIME-Version: 1.0" . "\n";
Необходимо убрать конкатенацию, поскольку ранее свойство не было объявлено. Вся суть проблемы заключается в выводе ошибок error_reporting (E_NOTICE). Если данный вывод отключен, соответственно, и сообщения об ошибке не будет. Измените данную строку и все должно заработать.
Администратор
Спасибо большое за комментарии. Обновил полностью статью, изменил код в стиле PSR-2 и исправил все ошибки.

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

Имя:
Текст комментария: