Статьи

Отправка писем с подтверждением с помощью Phalcon и Swift

Сегодня отправка электронных писем считается основной функциональностью любого веб-приложения. Обычно отправляется электронное письмо, чтобы уведомить пользователя о какой-либо активности на веб-сайте, например, когда он регистрирует учетную запись, обновляет информацию или обнаруживает новых друзей. В этом коротком руководстве я покажу вам, как быстро отправлять электронные письма через Gmail из примера приложения Phalcon. Вы можете скачать полный исходный код с GitHub . Мы создадим функциональность, которая позволит нам отправить электронное письмо с подтверждением и реагировать на щелчок указанного электронного письма с подтверждением.

Шаг 1: Установите Phalcon, Phalcon Tools

Установить Phalcon легко, если вы просто будете следовать инструкциям на их сайте. Не забудьте также установить инструменты Phalcon !

Если вы используете Vagrant, вы также можете установить весь комплект в коробку, следуя этому руководству .

Шаг 2: Начальная настройка нашего приложения

Мы успешно настроили среду разработки. Теперь мы приступаем к созданию каркаса нашего приложения. Откройте терминал (в Linux и Mac) или командную строку (cmd в Windows) и введите в папке, где хранятся ваши веб-проекты, следующую команду:

    phalcon project sendmail

Это создаст следующую структуру файлов и папок:

структура проекта sendmail

Попробуйте это. Откройте веб-браузер и введите http://127.0.0.1/sendmail/ или адрес виртуального хоста, который вы указали для своего проекта. Если все в порядке, как на рисунке ниже, перейдите к шагу 3.

введите описание изображения здесь

Шаг 3: Начальная настройка

Сначала нужно настроить несколько вещей:

  1. Подключение к базе данных (app / config / config.php)
  2. Каталоги моделей, представлений и контроллеров
  3. URL базового приложения
  4. Конфигурация почтового сервера

Все конфигурации хранятся в файле config.php

config.php

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

Что касается «почты», здесь я оставил драйвер установленным в SMTP. Я настроил хост на использование smtp.gmail.com Я установил порт 465 через SSL, а from

Шаг 4: Схема и конфигурация базы данных

Следующая схема показывает 2 таблицы, которые мы будем использовать:

     CREATE TABLE IF NOT EXISTS `users` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
          `username` varchar(40) NOT NULL,
          `email` varchar(40) NOT NULL,
          `password` char(60) NOT NULL,
          `mustChangePassword` char(1) DEFAULT NULL,
          `fullName` varchar(50) NOT NULL,
          `active` char(1) DEFAULT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `email_confirmations` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
          `usersId` int(10) unsigned NOT NULL,
          `code` char(32) NOT NULL,
          `createdAt` int(10) unsigned NOT NULL,
          `modifiedAt` int(10) unsigned DEFAULT NULL,
          `confirmed` char(1) DEFAULT 'N',
          PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

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

Примечание об отношениях здесь:

  • Модель «пользователи» имеет много «email_confirmations».
  • Модель «email_confirmations» принадлежит «пользователям»

Имейте это в виду на потом.

Шаг 5: Модели и проверка

Модель — это класс, который расширяет Phalcon \ Mvc \ Model. Он должен быть размещен в каталоге моделей. Файл модели должен содержать один класс; его имя класса должно быть в обозначении верблюда и должно соответствовать имени таблицы базы данных. Если вместо этого вы хотите иметь модель User и таблицу базы данных «users», вам необходимо использовать метод getSource для настройки этого.

Теперь мы дадим Phalcon Tools сгенерировать код для нас. Используя командную строку и перейдя в каталог вашего проекта, выполните следующую команду:

     phalcon model users
    phalcon model email_confirmations

Давайте проверим пример сгенерированного класса Users

введите описание изображения здесь

В приведенном выше коде мы проверяем, проверяется ли поле входа на соответствие правилу Email. Кроме того, мы гарантируем, что логин уникален. Обратите внимание на оператор return, который проверяет, вернул ли валидация какие-либо сообщения валидации.

Давайте проверим сгенерированный класс EmailConfirmations

подтверждение электронной почты

Следующий код представляет собой очень простой каркас, и я только объясню, как должны выглядеть afterCreate()initialize()

  1. Метод initialize() В этом методе Phalcon автоматически генерирует отношение hasMany.
         public function initialize(){
            $this->belongsTo('usersId', 'Users', 'id', array(
                'alias' => 'user'
            ));
        }

Первый параметр указывает поле локальной модели EmailConfirmations в отношении; второй указывает имя ссылочной модели (Пользователи), а третий — имя поля в ссылочной модели. alias$emailConfirmationInstance->user

  1. Метод afterCreate() Обратите внимание, что мы используем абстрактную функциональность для отправки электронной почты — служба электронной почты находится в нашем инжекторе зависимостей и делает это отдельно от самой модели.
             public function afterCreate(){
                $this->getDI()->getMail()->send(
                    array($this->user->email => $this->user->username),
                    'Please confirm your email',
                    'confirmation',
                    array( 'confirmUrl' => '/confirm/' . $this->code.'/'. $this->user->email)
                );
            }

afterCreate()beforeValidationOnUpdate()

Шаг 6: Контроллер и Библиотека

В следующем коде представлен очень простой каркас контроллера, и я объясню, как должны выглядеть действия view()create()

     class SessionController extends ControllerBase{
            public function indexAction() {}
            public function signupAction(){}
            public function loginAction() {}
            public function confirmEmailAction(){}
    }

signupAction()confirmEmailAction() Вы можете увидеть полный файл на SessionController.php .

Эта часть приложения реализована в компоненте «Почта» .

         require_once __DIR__ . '/../../vendor/Swift/swift_required.php';
        class Mail extends Phalcon\Mvc\User\Component
        {

            protected $_transport;

            public function getTemplate($name, $params){}
            public function send($to, $subject, $name, $params){}  
        }

Здесь я использую почтовую библиотеку Swift . Установите его через composer или просто включите в папку vendor, как в связанном репозитории GitHub (см. Здесь ). Этот класс расширяет Phalcon\Mvc\User\Component Теперь мы регистрируем этот класс в контейнере служб:

         <?php
        //app/config/service.php
        //Mail service uses Gmail;
        $di->set('mail', function(){
                return new Mail();
        });

Функция getTemplate

     public function send($to, $subject, $name, $params)
    {
        //Settings
        $mailSettings = $this->config->mail;
        $template = $this->getTemplate($name, $params);
        // Create the message
        $message = Swift_Message::newInstance()
              ->setSubject($subject)
                              ->setTo($to)
              ->setFrom(array(
                  $mailSettings->fromEmail => $mailSettings->fromName
              ))
              ->setBody($template, 'text/html');
              if (!$this->_transport) {
                $this->_transport = Swift_SmtpTransport::newInstance(
                    $mailSettings->smtp->server,
                    $mailSettings->smtp->port,
                    $mailSettings->smtp->security
                )
                  ->setUsername($mailSettings->smtp->username)
                  ->setPassword($mailSettings->smtp->password);
              }
              // Create the Mailer using your created Transport
            $mailer = Swift_Mailer::newInstance($this->_transport);
            return $mailer->send($message);
        }

Шаг 7: просмотр

Я использую строительные леса на основе библиотеки Twitter Bootstrap. Хотя строительные леса и являются временным решением, это не значит, что они не могут хорошо выглядеть!

Имейте в виду, что при использовании скаффолдинга с начальной загрузкой Phalcon будет генерировать только теги HTML с соответствующими классами HTML — вы можете включить статические ресурсы, такие как изображения и CSS, поэтому перейдите в корневой каталог своего проекта и отредактируйте файл app \ views \ index.volt , добавив строку таблицы стилей:

         <head>
        <title>Phalcon PHP Framework</title>
        {{stylesheet_link ('http//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css',false)}} 
        {{stylesheet_link ('css/css.css')}} 
        </head>
        <body>
            {{ content() }}
        </body>

Этот конкретный пример использует шаблонизатор Volt. Volt — это сверхбыстрый и дружественный к дизайну язык шаблонов, написанный на C для PHP. Он предоставляет вам набор помощников для простого написания представлений. Более подробная информация доступна в официальных документах .

Далее создайте форму регистрации. Типичное представление будет включать использование компонента Phalcon\Tag

регистрация формы

Время попробовать. Откройте браузер, зайдите в приложение и перейдите в [app url] / signup.

регистрационная форма

… И затем проверьте учетную запись электронной почты этого пользователя, чтобы убедиться, что электронное письмо было успешно отправлено:

подтвердить аккаунт

Отлично! Наше письмо было отправлено! Нажмите подтвердить, чтобы активировать аккаунт, и все!

Вывод

И это все, что нужно для отправки сообщений электронной почты с Phalcon и Gmail. Конечно, вы можете настроить свои почтовые сообщения так, как вам хочется, чтобы почта была более привлекательной.

Для получения дополнительной информации о Phalcon ознакомьтесь с онлайн-документацией . Спасибо за чтение — оставьте свой отзыв и комментарии ниже.