Почтовая функция sendGrid не работает в yii-framework

Я использовал приведенный ниже код для кодов sendGrid для отправки писем из моего проекта.

require_once(YII_BASE_PATH . "/lib/sendgrid-php/SendGrid.php");
require_once(YII_BASE_PATH . "/lib/sendgrid-php/SendGrid_loader.php");   
$sendgrid = new SendGrid('uname', 'pwd');
        $mail = new SendGrid\Mail();
        $mail->addTo('[email protected]')->
               setFrom('[email protected]')->
               setSubject('Subject goes here')->
               setText('Hello World!')->
               setHtml('<strong>Hello World!</strong>');
       $sendgrid->smtp->send($mail);

Я уже скачал пакет sendGrid и поместил его в папку lib в yii.

если я выполню приведенный выше код, я получу ошибку типа "include(Swift_DependencyContainer.php): failed to open stream: No such file or directory"

если я включил вышеуказанный файл, я получил сообщение об ошибке, так как нужно включить другой файл.

Пожалуйста, совет по этому поводу.


person Ravichandran Jothi    schedule 08.08.2012    source источник
comment
эхо YII_BASE_PATH. Я думаю, что его значение не то, что вы ожидаете.   -  person Leri    schedule 08.08.2012
comment
@PLB YII_BASE_PATH возвращает базовый путь, заданный как определено ('YII_BASE_PATH') или определить ('YII_BASE_PATH', dirname (FILE)); в index.php   -  person Ravichandran Jothi    schedule 08.08.2012
comment
Я не думаю, что проблема связана с YII_BASE_PATH: сработали 2 require_once (ошибка связана с Swift_DependencyContainer.php, а не с SendGrid.php или SendGrid_loader.php).   -  person CedX    schedule 08.08.2012


Ответы (3)


Кажется, что SendGrid полагается на путь включения для загрузки своих зависимостей. Таким образом, вы должны использовать один или несколько

Yii::setPathOfAlias()
Yii::import()

операторы для добавления SendGrid в путь включения. Может быть :

Yii::setPathOfAlias('SendGrid', YII_BASE_PATH'.'/lib/sendgrid-php');
Yii::import('SendGrid.*');

См.: http://www.yiiframework.com/doc/api/1.1/YiiBase#import-detail

Я использую Zend_Mail вместо SendGrid, но у меня была такая же проблема с включением пути. Я решил это, используя эти утверждения:

Yii::setPathOfAlias('zf', '/path/to/zend/library/folder');
Yii::import('zf.*');
Yii::import('zf.Zend.Loader.Autoloader', true);
Yii::registerAutoloader(array('Zend_Loader_Autoloader', 'autoload'));

Я думаю, что решение вашей проблемы аналогично.

person CedX    schedule 08.08.2012
comment
Я удалил require_once и использую Yii::import. Но все еще сталкиваюсь с той же проблемой. Ошибка типа include(/var/www/html/test/project/lib/sendgrid-php/Mail.php): не удалось открыть поток: нет такого файла или каталога - person Ravichandran Jothi; 08.08.2012
comment
да ты прав. файл, расположенный по пути lib\sendgrid-php\SendGrid\Mail.php . ошибка произошла из-за $mail = new SendGrid\Mail(); эта линия. как я могу вызвать этот Mail.php внутри подфлодера SendGrid? - person Ravichandran Jothi; 08.08.2012
comment
Быстрое и грязное исправление (не проверено): Yii::setPathOfAlias('Libs', YII_BASE_PATH.'/lib'); Yii::setPathOfAlias('SendGrid', YII_BASE_PATH.'/lib/sendgrid-php/SendGrid'); Yii::import('SendGrid.*'); Yii::import('Libs.sendgrid-php.SendGrid', true); РЕДАКТИРОВАТЬ: новая проблема заключается в том, что пространство имен SendGrid привязано к папке sendgrid-php/SendGrid. Yii использует псевдонимы путей для разрешения классов в пространстве имен. - person CedX; 08.08.2012
comment
@Ravihandran вы используете PHP 5.3+? - person Swift; 08.08.2012
comment
@Свифт, да. Я использую PHP 5.3+ - person Ravichandran Jothi; 09.08.2012

Вот что работает для меня:

// Define constant which SendGrid uses for referencing the path
define('ROOT_DIR', Yii::app()->basePath . '/lib/sendgrid-php/');
// Prevent swift_required from executing
define('SWIFT_REQUIRED_LOADED', true);

// Import SendGrid and Swift libraries
Yii::import('application.lib.sendgrid-php.SendGrid');
Yii::import('application.lib.sendgrid-php.lib.swift.classes.Swift', true);
Yii::registerAutoloader(array('Swift', 'autoload'));
Yii::import('application.lib.sendgrid-php.lib.swift.swift_init', true);

// Register namespace
Yii::setPathOfAlias('SendGrid', Yii::app()->basePath . '/lib/sendgrid-php/SendGrid/');
person Alexei Tenitski    schedule 28.09.2012

наконец я заставить его работать. для справки я перечисляю шаги (для себя также),

1) нам нужно скачать пакет sendgrid-php с https://github.com/sendgrid/sendgrid-php/downloads

2) Разархивируйте папку и поместите ее в папку проекта, например, «app/mail/».

3) создать один файл .php для почты для отправки почты в этой папке, например "app/mail/mail.php".

4) в этом файле

    <?php
        session_start();
        define("ROOT_DIR", __dir__ . DIRECTORY_SEPARATOR);

        function sendGrid_loader($string) {
            if (preg_match("/SendGrid/", $string)) {
                $file = str_replace('\\', '/', "$string.php");
                require_once ROOT_DIR . $file;
            }
        }

        spl_autoload_register("sendGrid_loader");

        $sendgrid = new SendGrid('sendgrid_username', 'sendgrid_password');
        $mail = new SendGrid\Mail();
    $mail->addTo('[email protected]')->
           setFrom('[email protected]')->
           setSubject('Subject goes here')->
           setText('Hello World!')->
           setHtml('<strong>Hello World!</strong>');
?>

5) мне нужно отправить почту, когда я перенаправляюсь на страницу отправки почты. поэтому я пишу код в файле контроллера в Actionmailsend(),

" header("Location:".AT::getUrl()."/mail/mail.php"); ".

просто перенаправление. это оно. почта успешно отправлена.

  • здесь AT::getUrl() - используется для получения baseurl.

  • он не интегрирован в yii. мы использовали функцию почты, чтобы поместить папку пакета sendGrid в папку проекта yii и использовали ее.

person Ravichandran Jothi    schedule 09.08.2012
comment
К сожалению, ваш ответ не имеет ничего общего с Yii и никак не помогает решить исходную проблему. - person Alexei Tenitski; 28.09.2012