[EVO] Возможность MODX работать полностью через SMTP

составляю небольшой список доработок что б настроить MODX полностью для работы с SMTP.


Итого этапы работы:
1 Добавить в системные настройки параметры так что б можно было выбирать mail или smtp:

public $Mailer = 'smtp';
public $Host = 'smtp.yandex.ru';
public $Port = 587;
public $SMTPSecure = 'tls';
public $SMTPAuth = true;
public $Username = 'no-reply@domen.ru';
public $Password = '----------';


Далее заменить в Eform и Shopkeeper
далее нашёл в assets\snippets\eform\eform.inc.php строку
$mail->IsMail();
и заменил на
$mail->IsSMTP();
всего их там 5 штук
надо в файле assets/snippets/shopkeeper/classes/class.SHKmanager.php найти строку(416)
$mail->IsMail();
и заменил на
$mail->IsSMTP();

Это все просто теперь думаю какие события забыл еще пока то что помню
— востановление пароля через плагин FML
— создание нового менеджера
— создание нового веб пользователя
— добавить параметр в JotX

что еще забыл?

думаю было бы полезно сделать данный функционал темболее что работы там не много

23 комментария

avatar
Jot, WebLogin, WebSignup.
avatar
На примере Jot. Дописал в конце файла:
include_once "manager/includes/controls/class.phpmailer.php";
function php_mail($email, $subject, $body) {
	global $modx;
	$mail = new PHPMailer();
	$mail->IsMail();
	$mail->IsHTML(false);
	$mail->From      = $modx->config['emailsender'];
	$mail->FromName  = $modx->config['site_name'];
	$mail->Subject   = $subject;
	$mail->Body      = $body;
	$mail->AddAddress($email);
	$mail->Send();
}

и заменил
mail()
на
php_mail()
avatar
пасиб но там по логике нужно еще добавить проверку на способ отправки )
что б можно было или так или так на выбор)
avatar
С JotX все проще там уже подключен phpmailer ) потому только добавил условие и нужные параметры) осталось только тестировать
avatar
В настройки уже вынес )
осталось теперь по коду проставить проверку mail или smtp и в зависимости от этого отправлять )
avatar
Настроил уже работу eForm через SMTP с учетом системных настроек думаю сегодня так же успею доделать и остальные сниппеты и системные отправки
avatar
Тема супер, а как настроить TXNewsletters для работы через smpt и ssl?
avatar
поидее можно нужно найти где он там отправляет и заменить mail на smtp )
пока первоочередно это сделать для стандартных снипетов да и системных уведомлений
avatar
удалось TXNewsletters запустить через smtp и ssl? что-то пока не нашёл в конфиге
avatar
Однозначно нужная вещь… Почтовый сервер теперь не нужен..-)
avatar
Все готово можно тестировать
avatar
а где тестить?) установить сборку с гитхаб?
avatar
avatar
А еще можете подсказать плюсы работы через smtp? это нужно чтоб вообще отказаться от mail на сервере? и как быть когда много разных сайтов на сервере (клиентские)… для каждого сайта лучше свой отдельный доступ к smtp или можно через один отправлять?
avatar
Угумс если свой VPS то да что б вообще запретить mail
Lkя клиенских сайтов лучше для каждого свой маил а то как то с одного не красиво отправлять
avatar
понятно) надо подумать… как разом все сайты перевести на smtp))
avatar
Небольшой пример кода как добавить функцию smtp к внешним модулям или снипетам которых нет по умолчанию в сборке

Было:
$mail = mail($to, $subject, $body, $headers);

Стало:
//add smtp from Dmi3yy
    global $modx; //добавить если нету
    if ($modx->config['email_method'] == 'smtp') {
      include_once MODX_MANAGER_PATH . "includes/controls/class.phpmailer.php";
      $mail = new PHPMailer();
      
      $mail->IsSMTP();// отсылать используя SMTP
      $mail->Host  = $modx->config['email_host']; // SMTP сервер
      $mail->SMTPAuth = true;  // включить SMTP аутентификацию
      $mail->Username = $modx->config['email_smtp_sender']; // SMTP username
      $mail->Password = $modx->config['email_pass']; // SMTP password
      $mail->From     = $modx->config['email_smtp_sender'];
      
      $mail->CharSet = $modx->config["modx_charset"]; 
      $mail->IsHTML(true);    
      $mail->FromName = $modx->config["site_name"];
      $mail->Subject = $subject;
      $mail->Body = $body;
      $mail->AddAddress($to);
      $mail->Send();
      
    }else{
      $mail = mail($to, $subject, $body, $headers);
    }


Нужно обратить внимание на global $modx если раньше нигде не вызывается то добавить

в остальном думаю вопросов не возникнет )
собственно проверяем какой тип отправки выбран и тот и используем)
avatar
А не лучше ли

include_once MODX_MANAGER_PATH . "includes/controls/class.phpmailer.php";
      $mail = new PHPMailer();
if ($modx->config['email_method'] == 'smtp') {
      $mail->IsSMTP();// отсылать используя SMTP
      $mail->Host  = $modx->config['email_host']; // SMTP сервер
      $mail->SMTPAuth = true;  // включить SMTP аутентификацию
      $mail->Username = $modx->config['email_smtp_sender']; // SMTP username
      $mail->Password = $modx->config['email_pass']; // SMTP password
    }
    ...
Комментарий отредактирован 2013-03-12 14:14:31 пользователем Pathologic
avatar
Вай бага LS если править код 2 раза (

Ну это я для примера просто не везде используется phpmailer даже для отправки mail

и если можно еще раз код а то не совсем понял что еще поменялось кроме расположение include
avatar
Я имел в виду, что без этого phpmailer отправит через mail(), поэтому внес эти строки в условие:
$mail->IsSMTP();// отсылать используя SMTP
      $mail->Host  = $modx->config['email_host']; // SMTP сервер
      $mail->SMTPAuth = true;  // включить SMTP аутентификацию
      $mail->Username = $modx->config['email_smtp_sender']; // SMTP username
      $mail->Password = $modx->config['email_pass']; // SMTP password

То есть я предлагаю все почтовые операции выполнять через phpmailer.
avatar
А ну верно встречается обычно или с подключенным phpmailer тогда его еще раз подключать не нужно и там меньше кода правиться
можно глянуть как в eForm поменял там как раз так и было
а вот FML и системые уведомления были просто на mail
avatar
Не лучшей ли идеей было бы выпилить отовсюду

include_once MODX_MANAGER_PATH."includes/controls/class.phpmailer.php";
				# send abuse alert
					$mail = new PHPMailer();
					//mail or smtp by Dmi3yy
					if ($smtp == 'smtp') {


Добавить в api что то вроде:

$modx->sendMail($to,$boby.....);


И уже в этом методе определять как отсылать.
avatar
Лучше согласен но первостепенной задачей было заставить работать )
так как нужно было довольно срочно на нескольких проектах )

ну а как будет время можно и отрефакторить код :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.