Блог

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

  • Евгений Ц.
  • Нет комментариев

Всем хороши почтовые сервисы, за исключением одного: нет возможности отправить письмо в html формате, оформлене письма ограничено встроенным редакотром. А что если хочется, например, отправить красиво оформленное коммерческое предложние в фирменном стиле? Можно, конечно, зарегистрироваться в каком-нибудь сервисе e-mail рассылок, но для отправки нескольких писем, это не лучший путь.

Применив немного фантазии, для этих целей можно воспользоваться админ панелью MODX. Для удобства создания и редактирования тела письма можно создать отдельный ресурс и отправлять по e-mail его содержимое.

1. Создадим плагин для вывода элементов интерфейса.

Он будет выводить кнопку "E-mail" и окно для ввода данных.

PHP

<?php
if ($mode!="upd") return;
$eventName = $modx->event->name;
switch($eventName) {
    case 'OnDocFormPrerender':
    $type=$resource->get('description');
    if ($type!='email') return;
    $name=$modx->getOption('site_name');
    $sendermail=$modx->getOption('emailsender');
    $res = $modx->getObject('modResource',array('pagetitle' => 'mailResource'));
    $resId=$res->id;
    $resUrl = $modx->makeUrl($resId,'web');
       $modx->regClientStartupHTMLBlock("
        <script type='text/javascript'>
               Ext.onReady(function () {
                document.querySelector('label[for=\"modx-resource-longtitle\"]').innerHTML='Тема письма';
               	var mailButton = new Ext.Button({
               		text: 'E-mail',
               		width: 82,
               		handler: function () {
               			winForm();
               		}
               	});
               	var tb = Ext.getCmp('modx-action-buttons');
               	tb.remove('modx-abtn-help');
               	tb.insert(2,mailButton);
               	tb.doLayout();
               });

               function winForm() {
               	var mailForm = new Ext.FormPanel({
               		xtype: 'modx-formpanel',
               		columnWidth: 1,
               		layout: 'form',
               		id: 'my_form',
               		bodyPadding: 50,
               		labelWidth: 150,
               		items: [{
               			xtype: 'textfield',
               			name: 'from',
               			value: '".$sendermail."',
               			fieldLabel: 'От кого',
               			anchor: '80%',
               		}, {
               			xtype: 'textfield',
               			name: 'name',
               			fieldLabel: 'Имя отправителя',
               			value: '".$name."',
               			anchor: '80%'
               		}, {
               			xtype: 'textfield',
               			name: 'to',
               			fieldLabel: 'Кому',
               			anchor: '80%'
               		}, {
               			xtype: 'hidden',
               			name: 'id',
               			value: '".$id."'
               		}]
               	});
               	var mailWin = new Ext.Window({
               		id: 'mail_window',
               		title: 'Отправить по e-mail',
               		width: 600,
               		height: 250,
               		layout: 'fit',
               		items: [mailForm],
               		buttons: [{
               			text: 'Оправить',
               			cls: 'primary-button',
               			handler: function () {
               				var formData = JSON.stringify(mailForm.getForm().getValues());
               				Ext.Ajax.request({
               					url: '".$resUrl."',
               					params: {
               						json: formData
               					},
               					success: function (data) {
               						Ext.MessageBox.alert('Сообщение', data.responseText);
               					}
               				});
               			}
               		}, {
               			text: 'Закрыть',
               			scope: this,
               			handler: function () {
               				mailWin.close();
               			}
               		}]
               	});
               	mailWin.show();
               }
    	</script>");        
    break;
}

2. Создадим сниппет для отправки почты.

Сниппет для большей наглядности назовем mailSnippet. Он будет отправлять содержимое ресурса по e-mail.

PHP

<?php
if (!$modx->user->isAuthenticated('mgr')) return;
$res=json_decode($_POST['json']);
if (!$res->from || !$res->to) return "Заполните все поля";
$resource = $modx->getObject('modResource',$res->id);
$longtitle=$resource->get('longtitle');
$content=$resource->get('content');
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_FROM, $res->from);
$modx->mail->set(modMail::MAIL_FROM_NAME, $res->name);
$modx->mail->address('to', $res->to);
$modx->mail->set(modMail::MAIL_SUBJECT, $longtitle);
$modx->mail->set(modMail::MAIL_BODY, $content);
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
    $modx->mail->reset();
    return "Ошибка: ".$modx->mail->mailer->ErrorInfo;
}
$modx->mail->reset();
return "Письмо отправлено";

3. Создадим ресурс.

Назовем его mailResource, и поместим туда сниппет. Если вы захотите использовать другое название, то замените его в плагине, в строке 10.

[[!mailSnippet]]

4. Создадим ресурс, который будем отправлять.

Назовем его "Рассылка". В поле "Описание" вставляем слово "email" - это кодовое сдово, которое говорит плагину о том, что эту страницу мы будем отправлять по почте.

Так же у обоих ресурсов установим "Скрыть из меню" и снимем чекбоксы "Доступен для поиска" и "Опубликован". Шаблон - пустой.

Сохраняем ресурс, обновляем страницу и видим это:

Если вы будете использовать TinyMCE, то обязательно установите параметрам convert_urls, relative_urls и remove_script_host значения false, иначе он порежет абсолютные пути к изображениям.

Набиваем письмо, в поле longtitle вводим заголовок и сохраняем ресурс. Обратите внимание, что после каждого редактирования письма и перед его отправкой ресурс нужно сначала сохранить.

Жмем кнопку E-mail и видим диалоговое окно:

Ну а что делать дальше, думаю всем понятно. На этом вроде все.

Комментарии ()

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

    *Ваш email адрес не будет опубликован.

    Введите сумму 4 + 4 =