Дружба OkayCMS и модуля для SMTP

в 9:41, , рубрики: cms, php, smtp, Разработка веб-сайтов

После того, как почтовые сервисы перешли на свою строгую политику, многие клиенты стали жаловаться, что письма с интернет-магазина падают как минимум в спам, а в худшем случае, хостинг просто блочит письмо и не отправляет клиенту. В связи с этим, мы стали прикручивать на сайты популярную библиотеку PHPMailer, которая позволяет гибко настроить отправку почты. Как оказалось, в рамках простой CMS данная библиотека выглядит «мини-монстром» так как содержала в себе файлов больше, чем папка со всеми контроллерами системы.

В итоге мы составили кое-какой алгоритм подключения этого дела к системе Okay.

Итак, шаг номер раз: скачиваем библиотеку PHPMailer с гита.
Шаг номер два: загружаем папку библиотеки в папку api самой системы и подключаем ее к ней.

Для этого нам надо сделать вот такие манипуляции:

В классе Notify.php подключаем библиотеку вот таким образом:

require('PHPMailer/class.phpmailer.php');
include('PHPMailer/class.smtp.php');

После этого меняем стандартную функцию mail на вот такую:

public function SMTP($to, $subject, $message,$headers){
        $mail = new PHPMailer();

        $mail->IsSMTP(); // telling the class to use SMTP
        $mail->Host       = ''.$this->settings->smtp_server.''; // SMTP server
        $mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
        $mail->SMTPAuth   = true;                  // enable SMTP authentication
        $mail->Port       = $this->settings->smtp_port;                    // set the SMTP port for the GMAIL server
        $mail->Username   = ''.$this->settings->smtp_user.''; // SMTP account username
        $mail->Password   = ''.$this->settings->smtp_pass.'';        // SMTP account password
        $mail->SetFrom($this->settings->smtp_user, $this->settings->user_pseudo);
        $mail->AddReplyTo($this->settings->smtp_user,$this->settings->user_pseudo);
        $mail->Subject    = $subject;
     
        $mail->MsgHTML($message);
        $mail->addCustomHeader("MIME-Version: 1.0n");

        $recipients = explode(',',$to);
        if(!empty($recipients)){
            foreach($recipients as $i=>$r){
                $mail->AddAddress($r);
            }
        }
        else{
            $mail->AddAddress($to);
        }


        if(!$mail->Send()) {
            @file_put_contents('error_log.txt',$mail->ErrorInfo);
        }
    }

    
    function email($to, $subject, $message, $from = '', $reply_to = '')
    {
    	$headers = "MIME-Version: 1.0n" ;
    	$headers .= "Content-type: text/html; charset=UTF-8; rn";
    	$headers .= "From: $fromrn";
    	if(!empty($reply_to))
	    	$headers .= "reply-to: $reply_torn";
    	
    	$subject = "=?utf-8?B?".base64_encode($subject)."?=";
        
        if($this->settings->use_smtp){
            $this->SMTP($to, $subject, $message, $headers);
        }
        else{
            @mail($to, $subject, $message, $headers);
        }

    }

И по факту, исполняющая часть у вас готова. Здесь добавлен регулятор в виде конструкции if, который позволит админу самому переключать способ отправки, это либо функиция mail, либо протокол SMTP.

После этого «допилим» административную часть, и добавим поля:

Идем в папку backend/design/html и открываем файл settings.tpl, в конец которого добавляет вот такой кусок кода:

<div class="block layer">
       <h2>Настройки SMTP почты</h2>
        <ul>
            <li>

                <label class="property" >SMTP Почта</label>
                <select name="use_smtp">
                    <option value="1" {if $settings->use_smtp == 1}selected=""{/if}>Да</option>
                    <option value="0" {if $settings->use_smtp == 0}selected=""{/if}>Нет</option>
                </select>

                <label class="property" >SMTP Server</label>
                <input name="smtp_server" class="okay_inp" value="{$settings->smtp_server}" type="text" />

                <label class="property" >SMTP Port</label>
                <input name="smtp_port" class=" okay_inp " value="{$settings->smtp_port}" type="text" />

                <label class="property" >SMTP Пользователь</label>
                <input name="smtp_user" class=" okay_inp " value="{$settings->smtp_user}" type="text" />

                <label class="property" >SMTP Пароль</label>
                <input name="smtp_pass" class=" okay_inp " value="{$settings->smtp_pass}" type="text" />

                <label class="property" >Имя отправителя</label>
                <input name="user_pseudo" class=" okay_inp " value="{$settings->user_pseudo}" type="text" />
            </li>
        </ul>
    </div> 

После чего получаем вот такой вид внешне:

И добавляет обработчик данных полей в файл backend/SettingsAdmin.php

   $this->settings->smtp_server = $this->request->post('smtp_server');
            $this->settings->smtp_port = $this->request->post('smtp_port');
            $this->settings->smtp_user = $this->request->post('smtp_user');
            $this->settings->smtp_pass = $this->request->post('smtp_pass');
            $this->settings->use_smtp = $this->request->post('use_smtp');
            $this->settings->user_pseudo = $this->request->post('user_pseudo');

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

Краткий список действий будет таков:

1. Зарегистрировать почту для домена (например на яндексе)
2. Переключить MX записи почтовой службы на хостинге
3. Узнать у хостинга, открыт ли 465-й порт на сервере, иначе смысла отправлять письма не будет
4. Указать логин и пароль в админке
5. Пользоваться подписанным ящиком, и отправлять письма от «подписанного» отправителя

Автор: m1hasik

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js