mailer

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
gamark
Сообщения: 13
Зарегистрирован: 2010.12.02, 16:50

mailer

Сообщение gamark »

хочу прикрутить мэйлер к блогу. /index.php/site/contact по такому адресу у меня форма обратной связи. Я все правильно запланировал?
1) скачать отсюда http://www.yiiframework.com/extension/mailer/ мейлер
2)в конфиге написать чтото вроде:

Код: Выделить всё

<?php
'components'=>array(
   'mailer' => array(
      'class' => 'application.extensions.mailer.EMailer',
      'pathViews' => 'application.views.email',
      'pathLayouts' => 'application.views.email.layouts'
   ),
   // ...
} 
3)в контроллере написать чтото вроде:

Код: Выделить всё

<?php
$message = 'Hello World!';
Yii::app()->mailer->Host = 'smtp.yiiframework.com';
Yii::app()->mailer->IsSMTP();
Yii::app()->mailer->From = 'wei@pradosoft.com';
Yii::app()->mailer->FromName = 'Wei';
Yii::app()->mailer->AddReplyTo('wei@pradosoft.com');
Yii::app()->mailer->AddAddress('qian@yiiframework.com');
Yii::app()->mailer->Subject = 'Yii rulez!';
Yii::app()->mailer->Body = $message;
Yii::app()->mailer->Send(); 
если все правильно понял, то вопрос такой: как мне указать нужный контроллер(у меня тут дыра в знаниях)? файла с роутингом у меня нет. Мне кажется удобно будет создать контроллер с единственным экшином index(например EmailController.php) и в него воткнуть код приведенный выше.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

Что значит как указать нужный контроллер? Соответствующий контроллер вызывается в момент когда пользователь переходит по УРЛ.

Для большего понимания попробуйте для начала переписать акшин contact из базового каркаса приложения, для работы с mailer
gamark
Сообщения: 13
Зарегистрирован: 2010.12.02, 16:50

Re: mailer

Сообщение gamark »

Все понял свой косяк, нужно ковырять SiteController/actionContact спасибо) а алгоритм установки мейлера верный?
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

да.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

Это расширение базируется на кривом убожестве PHPMailer. Очень рекомендую отказаться от него в пользу Swift Mailer.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

Svyatov писал(а):Это расширение базируется на кривом убожестве PHPMailer. Очень рекомендую отказаться от него в пользу Swift Mailer.
что в нем конкретно плохое?
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

Как минимум то, что вместо Exception'ов он выводит ошибки через echo :D
gamark
Сообщения: 13
Зарегистрирован: 2010.12.02, 16:50

Re: mailer

Сообщение gamark »

а что хорошего в свифте? есть какие-то сложности с интеграцией?
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

gamark писал(а):а что хорошего в свифте? есть какие-то сложности с интеграцией?
Свежее и качественнее реализация, имхо. Как минимум он корректно возвращает ошибки, а не выводит их :)

Интегрировать проще простого. Вот инструкция:
1. кидаешь Swift Mailer в какую-нибудь папку на сервере, можно и extensions, но я клал в отдельную от приложения;
2. прописываешь вверху конфига main.php (можно в index.php в корне, как больше нравится) что-то вроде:

Код: Выделить всё

// SwiftMailer include start
spl_autoload_unregister(array('YiiBase', 'autoload'));
require_once ('SwiftMailer/swift_required.php');
spl_autoload_register(array('YiiBase', 'autoload'));
// SwiftMailer include end   
3. после чего можно сделать какой-то общий метод типа этого:

Код: Выделить всё

public static function sendEmail($email, $subject, $message)
{
        try
        {
            // Mail.ru
            $transport = Swift_SmtpTransport::newInstance('smtp.mail.ru', 25)
                                            ->setUsername('user@mail.ru')
                                            ->setPassword('password');

            /* // Gmail
            $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
                                            ->setUsername('user@gmail.com')
                                            ->setPassword('password');
             */

            $mailer = Swift_Mailer::newInstance($transport);
            
            $message = Swift_Message::newInstance()
                                    ->setSubject($subject)
                                    ->setFrom(array('user@mail.ru' => 'Username'))
                                    ->setTo(array($email))
                                    ->setBody($message, 'text/html', 'utf-8');

            if (!$mailer->send($message))
            {
                die('error'); // это для примера
            }
        }
        catch (Exception $e)
        {
            die('error'); // это для примера
        }
} 
4. ну или соответственно юзать в любом другом методе.

Вроде ничего сложного :)
В примере используется метод отправки через SMTP.
gamark
Сообщения: 13
Зарегистрирован: 2010.12.02, 16:50

Re: mailer

Сообщение gamark »

Спасибо за подробное описание и совет. действительно phpmailer выводит ошибки ужасно, да и староват он.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

Svyatov писал(а):
gamark писал(а):а что хорошего в свифте? есть какие-то сложности с интеграцией?
Свежее и качественнее реализация, имхо. Как минимум он корректно возвращает ошибки, а не выводит их :)

Интегрировать проще простого. Вот инструкция:
1. кидаешь Swift Mailer в какую-нибудь папку на сервере, можно и extensions, но я клал в отдельную от приложения;
2. прописываешь вверху конфига main.php (можно в index.php в корне, как больше нравится) что-то вроде:

Код: Выделить всё

// SwiftMailer include start
spl_autoload_unregister(array('YiiBase', 'autoload'));
require_once ('SwiftMailer/swift_required.php');
spl_autoload_register(array('YiiBase', 'autoload'));
// SwiftMailer include end     
3. после чего можно сделать какой-то общий метод типа этого:

Код: Выделить всё

public static function sendEmail($email, $subject, $message)
{
        try
        {
            // Mail.ru
            $transport = Swift_SmtpTransport::newInstance('smtp.mail.ru', 25)
                                            ->setUsername('user@mail.ru')
                                            ->setPassword('password');

            /* // Gmail
            $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
                                            ->setUsername('user@gmail.com')
                                            ->setPassword('password');
             */

            $mailer = Swift_Mailer::newInstance($transport);
            
            $message = Swift_Message::newInstance()
                                    ->setSubject($subject)
                                    ->setFrom(array('user@mail.ru' => 'Username'))
                                    ->setTo(array($email))
                                    ->setBody($message, 'text/html', 'utf-8');

            if (!$mailer->send($message))
            {
                die('error'); // это для примера
            }
        }
        catch (Exception $e)
        {
            die('error'); // это для примера
        }
} 
4. ну или соответственно юзать в любом другом методе.

Вроде ничего сложного :)
В примере используется метод отправки через SMTP.
Вам не кажется что такой метод подключения ломает логику фреймворка и так делать не стоит?
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

А в чем поломка логики фреймворка? Безусловно можно это оформить в виде расширения, если есть время, но честно говоря не вижу проблем и в таком применении.

Какая конкретно логика ломается?
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

Логика в настройке и подключении компонентов.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

AbS_ писал(а):Логика в настройке и подключении компонентов.
Цитирую http://www.yiiframework.com/features/
Friendly with third-party code: Yii is carefully designed to work well with third-party code. For example, you can use code from PEAR or Zend Framework in your Yii application.
В чем проблема? Yii совершенно не обязывает любую стороннюю библиотеку оборачивать в компонент или расширение. Не стоит мыслить так "коробочно".
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

ну так я о чем и говорю. Его следует обернуть и подключать как расширение. А не вот вот варварски.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: mailer

Сообщение Svyatov »

AbS_ писал(а):ну так я о чем и говорю. Его следует обернуть и подключать как расширение. А не вот вот варварски.
Еще раз перечитай мой ответ выше :)
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: mailer

Сообщение AbS_ »

Перечитал, понял что пропустил предлог "не".
но все равно настаиваю на своем что лучше подключать все в одном стиле. Так будет лучше и вам и тем кто будет сопровождать ваш код.
Я думаю нет ни каких причин что бы не обернуть этот класс в компонент, и использовать как обычный компонент Yii. Да Yii не обязывает это делать, но это как правила хорошего тона.

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

Короче :) предлагаю не спорить. Мы высказали и выслушали мнения друг друга, предлагаю на этом и закончить.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: mailer

Сообщение BuCeFaL »

был в такой ситуации только майлер с зенда. Вынес как расширения и получил возможность использовать гетеры сетеры + ведения лога отосланных сообщений еще ряд преимуществ. Правда чтуь не так как тут.
Yii::app()->мой-компонент->mail()
так же уведомления могут быть не только через емейлы.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: mailer

Сообщение BuCeFaL »

зачем каждый раз прописывать данные SMTP если можно это сделать 1 раз при инициализации компонента.
gamark
Сообщения: 13
Зарегистрирован: 2010.12.02, 16:50

Re: mailer

Сообщение gamark »

Fatal error: Class 'CException' not found in C:\vhosts\mb\html\framework\YiiBase.php on line 335 вот такое выдает мне интерпритатор. ругается на добавленное в конфиг

Код: Выделить всё

spl_autoload_unregister(array('YiiBase','autoload'));
            Yii::import('application.vendor.swift.swift_required', true);
            spl_autoload_register(array('YiiBase','autoload')); 
ничего не понимаю :? в чем проблема?

так что лучше оформлять компонентом?
Ответить