Перейти к содержимому


Фото
* * * * * 2 голосов

Отправка писем через сторонний SMTP

smtp phpmailer

Best Answer n0a , 04.05.2017 - 18:55

Тема старая, PHPMailer уже давно обновился. Выкладываю рабочую инструкцию:

 

1. Скачиваем PHPMailer и кладем в корень сайта: https://github.com/PHPMailer/PHPMailer и переименовываем PHPMailer-master в PHPMailer. Для тех, кто работает по ssh: 

$ git clone https://github.com/PHPMailer/PHPMailer

2. Заменяем содержимое api/Notify.php на следующее:

<?php

/**
 * Simpla CMS
 *
 * @copyright	2011 Denis Pikusov
 * @link		http://simplacms.ru
 * @author		Denis Pikusov
 *
 */
class Notify extends Simpla {

    function email($to, $subject, $message, $from = '', $reply_to = '') {
        if (!$this->config->phpmailer_enable) {
            $headers = "MIME-Version: 1.0\n";
            $headers .= "Content-type: text/html; charset=utf-8; \r\n";
            $headers .= "From: $from\r\n";
            if (!empty($reply_to))
                $headers .= "reply-to: $reply_to\r\n";

            $subject = "=?utf-8?B?" . base64_encode($subject) . "?=";

            @mail($to, $subject, $message, $headers);
        } else {
            require_once 'PHPMailer/PHPMailerAutoload.php';

            $mailer = new Phpmailer();

            $mailer->IsHTML(true);
            $mailer->SMTPDebug = 0;
            $mailer->CharSet = "utf-8";

            $mailer->IsSMTP();
            $mailer->Host = $this->config->phpmailer_host;
            $mailer->Port = $this->config->phpmailer_port;

            if ($this->config->phpmailer_ssl == true) {
                $mailer->SMTPSecure = "ssl";
            }

            $mailer->SMTPAuth = true;
            $mailer->Username = $this->config->phpmailer_user;
            $mailer->Password = $this->config->phpmailer_password;


            $mailer->AddAddress($to);
            $mailer->From = $mailer->Username; // $from
            $mailer->FromName = "do-not-reply";
            $mailer->Sender = $mailer->Username;
            $mailer->Subject = $subject;
            $mailer->Body = $message;
            
            $mailer->Send();
        }
    }

    public function email_order_user($order_id) {
        if (!($order = $this->orders->get_order(intval($order_id))) || empty($order->email))
            return false;

        $purchases = $this->orders->get_purchases(array('order_id' => $order->id));
        $this->design->assign('purchases', $purchases);

        $products_ids = array();
        $variants_ids = array();
        foreach ($purchases as $purchase) {
            $products_ids[] = $purchase->product_id;
            $variants_ids[] = $purchase->variant_id;
        }

        $products = array();
        foreach ($this->products->get_products(array('id' => $products_ids)) as $p)
            $products[$p->id] = $p;

        $images = $this->products->get_images(array('product_id' => $products_ids));
        foreach ($images as $image)
            $products[$image->product_id]->images[] = $image;

        $variants = array();
        foreach ($this->variants->get_variants(array('id' => $variants_ids)) as $v) {
            $variants[$v->id] = $v;
            $products[$v->product_id]->variants[] = $v;
        }

        foreach ($purchases as &$purchase) {
            if (!empty($products[$purchase->product_id]))
                $purchase->product = $products[$purchase->product_id];
            if (!empty($variants[$purchase->variant_id]))
                $purchase->variant = $variants[$purchase->variant_id];
        }

        // Способ доставки
        $delivery = $this->delivery->get_delivery($order->delivery_id);
        $this->design->assign('delivery', $delivery);

        $this->design->assign('order', $order);
        $this->design->assign('purchases', $purchases);

        // Отправляем письмо
        // Если в шаблон не передавалась валюта, передадим
        if ($this->design->smarty->getTemplateVars('currency') === null) {
            $this->design->assign('currency', reset($this->money->get_currencies(array('enabled' => 1))));
        }
        $email_template = $this->design->fetch($this->config->root_dir . 'design/' . $this->settings->theme . '/html/email_order.tpl');
        $subject = $this->design->get_var('subject');
        $this->email($order->email, $subject, $email_template, $this->settings->notify_from_email);
    }

    public function email_order_admin($order_id) {
        if (!($order = $this->orders->get_order(intval($order_id))))
            return false;

        $purchases = $this->orders->get_purchases(array('order_id' => $order->id));
        $this->design->assign('purchases', $purchases);

        $products_ids = array();
        $variants_ids = array();
        foreach ($purchases as $purchase) {
            $products_ids[] = $purchase->product_id;
            $variants_ids[] = $purchase->variant_id;
        }

        $products = array();
        foreach ($this->products->get_products(array('id' => $products_ids)) as $p)
            $products[$p->id] = $p;

        $images = $this->products->get_images(array('product_id' => $products_ids));
        foreach ($images as $image)
            $products[$image->product_id]->images[] = $image;

        $variants = array();
        foreach ($this->variants->get_variants(array('id' => $variants_ids)) as $v) {
            $variants[$v->id] = $v;
            $products[$v->product_id]->variants[] = $v;
        }

        foreach ($purchases as &$purchase) {
            if (!empty($products[$purchase->product_id]))
                $purchase->product = $products[$purchase->product_id];
            if (!empty($variants[$purchase->variant_id]))
                $purchase->variant = $variants[$purchase->variant_id];
        }

        // Способ доставки
        $delivery = $this->delivery->get_delivery($order->delivery_id);
        $this->design->assign('delivery', $delivery);

        // Пользователь
        $user = $this->users->get_user(intval($order->user_id));
        $this->design->assign('user', $user);

        $this->design->assign('order', $order);
        $this->design->assign('purchases', $purchases);

        // В основной валюте
        $this->design->assign('main_currency', $this->money->get_currency());

        // Отправляем письмо
        $email_template = $this->design->fetch($this->config->root_dir . 'simpla/design/html/email_order_admin.tpl');
        $subject = $this->design->get_var('subject');
        $emails = explode(';', $this->settings->order_email);

        foreach ($emails as $email)
            $this->email(trim($email), $subject, $email_template, $this->settings->notify_from_email);
    }

    public function email_comment_admin($comment_id) {
        if (!($comment = $this->comments->get_comment(intval($comment_id))))
            return false;

        $this->design->assign('comment', $comment);

        // Отправляем письмо
        $email_template = $this->design->fetch($this->config->root_dir . 'simpla/design/html/email_comment_admin.tpl');
        $subject = $this->design->get_var('subject');
        $emails = explode(';', $this->settings->comment_email);

        foreach ($emails as $email)
            $this->email(trim($email), $subject, $email_template, $this->settings->notify_from_email);
    }

    public function email_password_remind($user_id, $code) {
        if (!($user = $this->users->get_user(intval($user_id))))
            return false;

        $this->design->assign('user', $user);
        $this->design->assign('code', $code);

        // Отправляем письмо
        $email_template = $this->design->fetch($this->config->root_dir . 'design/' . $this->settings->theme . '/html/email_password_remind.tpl');
        $subject = $this->design->get_var('subject');
        $this->email($user->email, $subject, $email_template, $this->settings->notify_from_email);

        $this->design->smarty->clearAssign('user');
        $this->design->smarty->clearAssign('code');
    }

    public function email_feedback_admin($feedback_id) {
        if (!($feedback = $this->feedbacks->get_feedback(intval($feedback_id))))
            return false;

        $this->design->assign('feedback', $feedback);

        // Отправляем письмо
        $email_template = $this->design->fetch($this->config->root_dir . 'simpla/design/html/email_feedback_admin.tpl');
        $subject = $this->design->get_var('subject');
        $emails = explode(';', $this->settings->comment_email);

        foreach ($emails as $email)
            $this->email(trim($email), $subject, $email_template, "$feedback->name <$feedback->email>", "$feedback->name <$feedback->email>");
    }
}

 

 

3. В конце файла config/config.php добавляем:

 

[phpmailer]
phpmailer_enable = true;
phpmailer_host = "smtp.yandex.ru";
phpmailer_port = 465;
phpmailer_user = "mail@domain";
phpmailer_password = "pass";
phpmailer_ssl = true;
 

Где mail@domain – имя вашей учетной записи на сервере yandex, pass – ваш пароль. После этих изменений все будет работать как часы.

Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
53 ответов в теме

#1 Ensiferum

Ensiferum
  • Пользователь
  • 1 сообщений
  • Программирование
  • Версия CMS:2.x

Опубликовано 23.09.2013 - 12:31

Понадобилось отправить письма через SMTP яндекса. Написал решение через библиотеку Phpmailer. В скрепке архив с файлами (Убрать в конце расширение .php). Надо к текущему сайту лишь добавить папку Phpmailer (в корень) и заменить api/Notify.php

 

В конфиге config/config.php добавить секцию:

[phpmailer]
phpmailer_enable = true;
phpmailer_host = 'smtp.yandex.ru';
phpmailer_port = 25;
phpmailer_user = 'user';
phpmailer_password = 'pass';
phpmailer_ssl = false;
Также переработал отправку сообщений о комментариях и заказах. Если в настройках указать не 1 email, а несколько через точку с запятой - сообщения о комментариях и заказах разойдутся всем.

Прикрепленные файлы:



#2 SkazZzo4nik

SkazZzo4nik
  • Пользователь
  • 23 сообщений

Опубликовано 27.09.2013 - 13:27

Это работает только с яндексом?



#3 Pirog

Pirog
  • Пользователь
  • 3 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x

Опубликовано 06.10.2013 - 05:15

спасибо! все отлично работает!



#4 pedro

pedro
  • Пользователь
  • 26 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Simferopol, Ukraine

Опубликовано 07.10.2013 - 11:45

Это работает только с яндексом?

с любым SMTP!



#5 SkazZzo4nik

SkazZzo4nik
  • Пользователь
  • 23 сообщений

Опубликовано 25.10.2013 - 19:59

У меня вот такую ошибку выдает:

SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host. 
Warning: Cannot modify header information - headers already sent by (output started at /home/folder/public_html/name.ru/Phpmailer/Phpmailer.php:586) in /home/folder/public_html/name.ru/view/CartView.php on line 125

Warning: Cannot modify header information - headers already sent by (output started at /home/folder/public_html/name.ru/Phpmailer/Phpmailer.php:586) in


#6 valera

valera
  • Пользователь
  • 22 сообщений

Опубликовано 09.04.2014 - 19:37

Большое спасибо, очень полезная доработка!

Пришлось немного модифицировать конфиг для Яндекса:

[phpmailer]
phpmailer_enable = true;
phpmailer_host = 'smtp.yandex.ru';
phpmailer_port = 465;
phpmailer_user = 'email';
phpmailer_password = 'pass';
phpmailer_ssl = true;
 
и notify:

            $mailer->From = $mailer->Username; // $from
            $mailer->FromName = "robot";
            $mailer->Sender = $mailer->Username;

Иначе не хотело работать...



#7 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 07:11

у меня вот такая ошибка вышла, но в админке в ЗАКАЗЫ поступает, но НЕ отсылается

SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host.
Warning: Cannot modify header information - headers already sent by (output started at /home/site/data/www/site/Phpmailer/Phpmailer.php:586) in /home/site/data/www/site/view/CartView.php on line 122

Warning: Cannot modify header information - headers already sent by (output started at /home/site/data/www/site/Phpmailer/Phpmailer.php:586) in /home/site/data/www/site/index.php on line 33


#8 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 08:07

кусок CartView.php:



			// Отправляем письмо пользователю
			$this->notify->email_order_user($order->id);
	    	
			// Отправляем письмо администратору
			$this->notify->email_order_admin($order->id);
	    	
	    	// Очищаем корзину (сессию)
			$this->cart->empty_cart();
						
			// Перенаправляем на страницу заказа
сторка 122		header('Location: '.$this->config->root_url.'/order/'.$order->url);
		}

кусок от index.php:



// Если все хорошо

if(($res = $view->fetch()) !== false)

{

	// Выводим результат

строка 33	header("Content-type: text/html; charset=UTF-8");	

	print $res;



	// Сохраняем последнюю просмотренную страницу в переменной $_SESSION['last_visited_page']

	if(empty($_SESSION['last_visited_page']) || empty($_SESSION['current_page']) || $_SERVER['REQUEST_URI'] !== $_SESSION['current_page'])

	{

		if(!empty($_SESSION['current_page']) && !empty($_SESSION['last_visited_page']) && $_SESSION['last_visited_page'] !== $_SESSION['current_page'])

			$_SESSION['last_visited_page'] = $_SESSION['current_page'];

		$_SESSION['current_page'] = $_SERVER['REQUEST_URI'];

	}		

}

 

помогите ребята. что не так?



#9 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 08:53

вот строка от Phpmailer.php

    } catch (phpmailerException $e) {
      $this->SetError($e->getMessage());
      if ($this->exceptions) {
        throw $e;
      }
  сторока 586    echo $e->getMessage()."\n";
      return false;
    }


#10 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 10:29

Автор темы 

Был на сайте 27.09.2013 14:11

 

думаю он бросил это дело.

Писал симпле:

 

Denis Pikusov
11:26 (2 ч. назад)
cleardot.gif
 
cleardot.gif
cleardot.gif
кому: мне
cleardot.gif
К сожалению я не могу помочь с чужим кодом, уточните пожалуйста у автора модуля

 
       
А у Вас нету другого решения?
хостинг менять не Хочется, т.к. привык к нему.
 


 
profile_mask2.png
Denis Pikusov
11:49 (1 ч. назад)
cleardot.gif
 
cleardot.gif
cleardot.gif
К сожалению пока нет

 

 

что делать уже незнаю, руки опустились

 

смотрю файлы надо сохранить в utf-8 без БОМа



#11 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 11:09

удалил 586 строку в Phpmailer.php:

  echo $e->getMessage()."\n";

 

ошибка пропала, но не отсылается на почту



#12 Smoke

Smoke
  • Пользователь
  • 19 сообщений

Опубликовано 24.06.2014 - 12:23

kors

 

писал в личку, контактов нет у него.

есть другой метод отправки по СМТП ?



#13 Gloobus

Gloobus
  • Фрилансер
  • 135 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Москва

Опубликовано 27.06.2014 - 08:01

У вас ошибка о невозможности соединиться с SMTP хостом.

Если у кого то работает, а у вас нет, тут варианты:

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

2. Вы ошиблись в параметрах конфигурации (хост, порт, имя пользователя, пароль). Не везде срабатывает в качестве логина username, многие требуют указывать username@domain.ru

 

А по хорошему, SMTP не нужен, достаточно нормального VPS и настроенного DKIM на почтовом сервере - письма уходят без проблем и не попадают в спам



#14 aflower

aflower
  • Пользователь
  • 3 сообщений
  • Версия CMS:2.x

Опубликовано 04.08.2014 - 19:52

у меня так и невышло настроить отправку

SMTP Error: Could not connect to SMTP host.



#15 amigorzn

amigorzn
  • Пользователь
  • 10 сообщений
  • Программирование
  • Версия CMS:2.x

Опубликовано 22.08.2014 - 17:55

[phpmailer]
phpmailer_enable = true;
phpmailer_host = "smtp.yandex.ru";
phpmailer_port = 465;
phpmailer_user = "вашеимя@yandex.ru";
phpmailer_password = "пароль";
phpmailer_ssl = true;

 

кавычки двойные с учетом измененив notifi

и как тут писали.

c 47 строки по 49 (у меня) меняем на

 

$mailer->From = $mailer->Username; // $from
$mailer->FromName = "robot";
$mailer->Sender = $mailer->Username;

 

и все работает



#16 Дмитрий Т.

Дмитрий Т.
  • Пользователь
  • 4 сообщений
  • Версия CMS:2.x
  • Откуда:Кировоград

Опубликовано 23.09.2014 - 15:50

у меня выдает ошибку:

 

Fatal error: Call to undefined method Notify::email_user_registration() in /var/www/cdfance9645/data/www/fancentr.com/view/RegisterView.php on line 38

 

что делать? Подскажите...



#17 AlexanderKi

AlexanderKi
  • Пользователь
  • 103 сообщений
  • Пользователь
  • Версия CMS:2.x

Опубликовано 16.11.2014 - 10:20

у меня пустая страница после отпарвки, и ничего не доходит.



#18 AlexanderKi

AlexanderKi
  • Пользователь
  • 103 сообщений
  • Пользователь
  • Версия CMS:2.x

Опубликовано 16.11.2014 - 11:27

Все, разобрался, спасибо.



#19 crab

crab
  • Пользователь
  • 17 сообщений

Опубликовано 20.06.2015 - 22:38

Пол дня мучался, заработало когда заменил строку

 

phpmailer_host = 'smtp.yandex.ru';

 

на

 

phpmailer_host = 'ssl://smtp.yandex.ru';
 



#20 Maksclub

Maksclub
  • Фрилансер
  • 1 398 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 21.06.2015 - 00:55

Пол дня мучался, заработало когда заменил строку

 

phpmailer_host = 'smtp.yandex.ru';

 

на

 

phpmailer_host = 'ssl://smtp.yandex.ru';
 

http://forum.simplac...ыла-через-stmp/ пол-минуты не мучался и все получилось ;)







Также с меткой «smtp, phpmailer»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых