RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

JMail — Отправка почтовых сообщений

Работа с классами JMail, PHPMailer в Joomla

Объект для работы с почтой

Ссылка на глобальный объект электронной почты JMail получается с помощью класса JFactory. Это создание нашего объекта JMail.

$mailer =& JFactory::getMailer();

В результате мы получим объект класса JMail, который объявлен по адресу /libraries/joomla/mail/mail.php и является потомком класса PHPMailer. Все необходимые файлы подключаются сами по необходимости.

Библиотека PHPMailer — Это внешняя библиотека для отправки почты расположенная по адресу /libraries/phpmailer. Служит для передачи электронной почты, позволяющий, в частности, вкладывать в сообщение несколько файлов, посылать копии CC и BCC, устанавливать атрибут REPLY-TO, использовать в сообщениях HTML, работать с резервными SMTP-серверами, переносить строки по словам. Он может посылать сообщения с через sendmail, PHP mail() или непосредственно по протоколу SMTP.

Установка отправителя

Отправитель письма устанавливается с помощью метода setSender. Функция принимает массив с адресом электронной почты и именем в качестве аргумента. Мы получили имя и адрес электронной почты из глобальной конфигурации сайта. Они устанавливаются в административной части сайта (Общие настройки / Настройки почты). От этого имени будет отправлена почта.

$config =& JFactory::getConfig();
$sender = array($config->getValue('config.mailfrom'), $config->getValue('config.fromname') );
$mailer->setSender($sender);

Установка получателя

Вы устанавливаете получатель электронной почты с помощью метода addRecipient. Для того что-бы задать e-mail адрес текущего авторизованного пользователя, мы возьмём его из объекта пользователя.

$user =& JFactory::getUser();
$recipient = $user->email;
$mailer->addRecipient($recipient);

Если у нас есть несколько адресатов, мы можем отправить их в виде массива.

$recipient = array('person1@domain.com', 'person2@domain.com', 'person3@domain.com');
$mailer->addRecipient($recipient);

Создание письма

Мы должны указать тему письма и создать содержимое. Тема письма устанавливается с помощью метода JMail->setSubject.

Простой способ создания сообщения в виде строки текста. Используйте функцию JMail->setBody для добавления сообщения к письму. Вы можете так же прикрепить файл JMail->addAttachment. В качестве аргумента может быть имя одного файла или массив имён нескольких.

$body   = "Your body string\nin double quotes if you want to parse the \nnewlines etc";
$mailer->setSubject('Your subject string');
$mailer->setBody($body);
// Optional file attached
$mailer->addAttachment(PATH_COMPONENT.DS.'assets'.DS.'document.pdf');

HTML-формат письма

Если вы предпочитаете HTML-формат письма, вы должны это указать. Это делается с помощью метода JMail->IsHTML. Темы и любые вложения обрабатываются, как указано выше, за исключением изображений встроенных в HTML. Они обрабатываются методом JMail->AddEmbeddedImage.

$body   = '<h2>Our mail</h2>'
         .'<div>A message to our dear readers'
         .'<img src="cid:logo_id" alt="logo"/></div>';
$mailer->isHTML(true);
$mailer->setBody($body);
// Optionally add embedded image
$mailer->AddEmbeddedImage(PATH_COMPONENT.DS.'assets'.DS.'logo128.jpg', 'logo_id', 'logo.jpg', 'base64', 'image/jpeg');

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

Дополнительные опции для писем

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

  • JMail->addReplyTo — добавить адрес почты для ответа. Пример одного адреса — array(’person1@domain.com’, ’username’). Несколько адресов соответственно — это вложенный массив.
  • JMail->addBCC — Добавить получателей слепой точной копии (BCC).
  • JMail->addCC — Добавить получателей точной копии (CC).
  • JMail->addAttachment — Добавить файл(ы) к письму. Указывать нужно абсолютный путь до файла на вашем сервере.

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

Отправка почты

Письмо отправляется с помощью метода Send. Он возвращает true при успешной отправке или объект ошибки JError. Все письма будут отправляться в кодировке UTF-8. Это необходимо иметь ввиду, иначе письмо будет затруднительно прочитать.

$send =& $mailer->Send();
if ($send !== true) {
    echo 'Error sending email: '.$send->message;
} else {
    echo 'Mail sent';
}

Во всяком случае лучше всего написать собственный обработчик ошибок с помощью класса JError.

Альтернативный способ отправки писем

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

jimport('joomla.utilities.utility');

$fromEmail = 'admin@mysite.ru'; // отправитель, почта
$fromName = 'Test Server'; // отправитель, имя

$email = 'admin@example.com'; // кому

$subject = 'Test Mail Message'; // тема письма

$convertedBody = '<p>TEST MESSAGE</p>'; // сообщение в html

$filename = JPATH_BASE.DS.'images'.DS.'stories'.DS.'articles.jpg'; // прикрепляемый файл

// отправляем 

JUtility::sendMail($fromEmail, $fromName, $email, $subject, $convertedBody, true, null, null, $filename );

Почему не нужно использовать функцию mail()?

Отправляя письма через mail(), вы сами должны следить за всеми заголовками, конвертировать необходимые вещи через base64, учитывать кодировку и многое другое. Более того, JMail может отправлять письма различными способами: SMTP, sendmail и функция mail(). Настроить это можно в Общих настройках / Сервер.

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

Примеры в компонентах Joomla

Объект JMail используется для отправки почты в компоненте контактов (joomla/components/com_contact/controller.php).

Смотрите также:
Комментарии (10) Добавить комментарий
  • Seoforum
    Seoforum
    10 Ноября 2011, 00:41
     ↑  +3  ↓     ответ

    Спасибо!

    Разобрался

  • Светка-конфетка
    Светка-конфетка
    31 Мая 2012, 13:59
     ↑  0  ↓     ответ

    Классная статья! Спасибо.

  • Михаил
    Михаил
    13 Сентября 2012, 00:25
     ↑  0  ↓     ответ

    Спасибо супер искал давно, нормальную инструкцию.

    А тут так просто и понятно описано. Спасибо.

  • Vit
    Vit
    02 Апреля 2013, 19:42
     ↑  0  ↓     ответ

    То, что надо! Сейчас буду пробовать

  • frag
    frag
    28 Июня 2013, 15:24
     ↑  0  ↓     ответ

    Классная статья. Спасибо.

  • frag
    frag
    28 Июня 2013, 15:39
     ↑  0  ↓     ответ

    А можно при использовании JUtility::sendMail() отловить ошибку, по аналогии с методом Send?

  • Sasha
    Sasha
    09 Апреля 2014, 20:32
     ↑  +2  ↓     ответ

    jimport('joomla.utilities.utility');

    $fromEmail = 'admin@mysite.ru'; // отправитель, почта

    $fromName = 'Test Server'; // отправитель, имя

    $email = 'admin@example.com'; // кому

    $subject = 'Test Mail Message'; // тема письма

    $convertedBody = '<p>TEST MESSAGE</p>'; // сообщение в html

    $filename = JPATH_BASE.DS.'images'.DS.'stories'.DS.'articles.jpg'; // прикрепляемый файл

    // отправляем

    JUtility::sendMail($fromEmail, $fromName, $email, $subject, $convertedBody, true, null, null, $filename );

    мы же не указали, что это html разметка, у меня так и выводит, просто текстом

  • Сергей
    Сергей
    01 Мая 2015, 16:33
     ↑  0  ↓     ответ

    JUtility убрали в Joomla 3+

    https://docs.joomla.org/Potential_backward_compatibility_issues_in_Joomla_3_and_Joomla_Platform_12.2#JUtility

    Остается только JMail

  • Alex
    Alex
    24 Декабря 2015, 05:00
     ↑  0  ↓     ответ

    Как в Joomla! 3.2.4 добавить дополнительный email таким образом, чтобы при отправке почты он был скрыт, то есть нужно вставить какой то PHP код с адресом почты. Другими словами, есть сайт на Joomla, с него идут заявки, нужно сделать чтобы заявки дублировались на скрытый email

  • Денис
    Денис
    24 Августа 2016, 12:43
     ↑  0  ↓     ответ

    Как подключить jimport('joomla.utilities.utility'); в стороннем php файле?

    (файл загружается через аякс)

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.