Модуль Drupal для работы с Яндекс.Почтой

Вступление

С недавнего времени Яндекс порадовал такой услугой как почта для домена. Довольно таки полезная услуга. А наличие Яндекс.API для той радости позволяет завести вашим пользователям красивые почтовые адреса. В своей статье я хочу расказать о первых своих успехах в этом деле для сайта на Drupal. В данном случае логичным будет написание модуля.

API


Общение движка сайта с яндексом будет происходить посредством http(s) запросов. Параметры этих запросов описаны в справке, но до начала работ необходимо получить token — некую последовательность символов, которая будет присутствовать в запросе для авторизации действий. Получить её просто — вам нужно залогиниться на сайте Яндекса и затем вставить в адресную строку pddimp.yandex.ru/get_token.xml?domain_name=... где вместо троеточия вставить имя домена. В ответ сервер выдаст xml-документ с токеном.
Я определил для себя несколько заданий для первого этапа. Нам нужно немного операций, а именно:
  • Создание ящика
  • Редактирование данных
  • Удаление ящика
  • Доступность адреса

Для каждого из действий существуют простые запросы. Кроме того на старнице справки присутствуют наборы готовых классов, но я решил написать всё с нуля используя код за основу.

Пишем модуль


Модуль у нас получится довольно простой. Буквально из двух функций-хуков и четырёх вспомогательных функций. У модуля также будет страница администрирования.
Я создал файл yandex_mail_pdd.info и yandex_mail_pdd.module. В первом указал данные для модуля. Файл может выглядеть так:

name = Yandex.Mail API

description = Работа с Яндекс.Почтой
core = 6.x


А вот содержимое второго файла — код нашего модуля.
Определим для начала реакцию движка на адреса. Определим страницу админки и функцию обратного вызова для неё.

Copy Source | Copy HTML
  1. function yandex_mail_pdd_menu() {
  2.   $items = array();
  3.   $items['admin/settings/yandex_mail_pdd'] = array(
  4.     'title' => t('Yandex.Mail Settings'),
  5.     'description' => 'Settings for Yandex.Mail module',
  6.     'page callback' => 'drupal_get_form',
  7.     'page arguments' => array('yandex_mail_pdd_admin'),
  8.     'access arguments' => array('access administration pages'),
  9.     'type' => MENU_NORMAL_ITEM,
  10.    );
  11.   return $items;
  12. }


Теперь нужно создать странцу для администрирования. Это будет функция генерации формы с двумя текстовыми полями(токен и домен) и одним чекбоксом(вывод отладочной информации)

Copy Source | Copy HTML
  1. function yandex_mail_pdd_admin()
  2. {
  3.     $form['ypdd_domain']=array(
  4.         '#type' => 'textfield',
  5.         '#title' => t('Domain'),
  6.         '#description' => t('Your domain.'),
  7.         '#default_value'=>variable_get('ypdd_domain', ''),
  8.         );
  9.     $form['ypdd_token']=array(
  10.         '#type' => 'textfield',
  11.         '#title' => t('Token'),
  12.         '#description' => t('Put here token for your domain'),
  13.         '#default_value'=>variable_get('ypdd_token', ''),
  14.         );
  15.     $form['ypdd_debug']=array(
  16.         '#type' => 'checkbox',
  17.         '#title' => t('Debug'),
  18.         '#description' => t('Output debug information'),
  19.         '#default_value'=>variable_get('ypdd_debug', true),
  20.         );
  21.     return system_settings_form($form);
  22. }


Теперь приступим к написанию функций для общения с Яндексом. Для отправки http(s) запросов есть два пути — cURL и API Drupal. Запросы от второго варианта Яндекс у меня почему то не принимал, поэтому я выбрал первый. Функция проверки занятости логина выглядит так:

Copy Source | Copy HTML
  1. function _pdd_chek_user($login)
  2. {
  3.     $url='https://pddimp.yandex.ru/check_user.xml?login=test&token='.variable_get('ypdd_token', '');
  4.     $ch = curl_init();
  5.     curl_setopt($ch, CURLOPT_HTTPGET, true);
  6.     curl_setopt_array($ch, array(
  7.             CURLOPT_URL => $url,
  8.             CURLOPT_RETURNTRANSFER => true,
  9.             CURLOPT_FOLLOWLOCATION => true,
  10.         ));
  11.     $sxml = new SimpleXMLElement(curl_exec($ch));
  12.     $xml=curl_exec($ch);
  13.     if(variable_get('ypdd_debug', true)) dsm($xml);
  14.     curl_close($ch);
  15.     return $sxml->result;
  16. }


Остальные функции отличаются лишь запросами и другими мелкими деталями. Логика работы такая же. Для того что бы при работе с данными аккаунта пользователя изменения применялись и к ящику воспользуемся хуком hook_user из API Drupal. Примерно так:

Copy Source | Copy HTML
  1. function yandex_mail_pdd_user($op, &$edit, &$account, $category = NULL)
  2. {
  3.     switch($op)
  4.     {
  5.         case 'validate':
  6.         {
  7.             if($edit['op']==t('Save'))
  8.             {
  9.                 $res=_pdd_update_user($account->name, array('password'=>$edit['pass']));
  10.             }
  11.             else
  12.                 $res=_pdd_create_user($edit['name'], $edit['pass']);
  13.             if(isset($res['error']))
  14.             {
  15.                 if($res['error']=='passwd-tooshort')
  16.                     form_set_error('pass', 'Короткий пароль.');
  17.                 if($res['error']=='occupied')
  18.                     form_set_error('name', 'Имя занято.');
  19.             }
  20.         };break;
  21.         case 'delete':
  22.         {
  23.             _pdd_delete_user($account->name);
  24.         };break;
  25.     }
  26. }

Для вывода отладочной информации необходим модуль Devel. Именно оттуда функция dsm().
Собственно вот и вся работа. Конечно, на релиз это не тянет, но как скелет вполне подойдёт. Для доработок уйма пространства. Планирую дописать получение списка писем при входе на сайт и ещё кое какой функционал. Всех с Новым Годом!
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 20

    +6
    Что касается Drupal:

    1. В hook_menu для title не нужно использовать t()
    2. Проверьте свой модуль на соответствие Drupal coding standards используя модуль coder.
      0
      В hook_menu для title не нужно использовать t()
      Почему?
        +4
        Тут и Тут описано, почему в D6 не нужно использовать t для тайтла меню.
        +2
        +
        В .info файле не рекомендуется писать по-русски.
          0
          учту
        +1
        В строке " Я создал файл yandex_mail_pdd.info и yandex_mail_pdd_module" подправьте имя второго файла.
        За статью спасибо. Ждем статью о выходе семерки
          0
          Что за curl'ы, а как же drupal_http_request
            0
            Я писал, что по неизвестной мне причине, Яндекс отвергал запросы, отправленные с помощью API Drupal. В ответ всегда приходило not_authanticated
            +1
            А чем готовый API яндекса не угодил? Сам я, кстати, писал подобный модуль полгода назад (правда чуть поболе навороченный) не для открытого пользования, но так и не смог осилить свою лень, чтобы сделать версию для свободного доступа. Если хотите совет что можно доработать, то неплохо было бы прикрутить авторизацию на яндекс.почте после авторизации на сайте, правда в этом случае понадобится хранить пароли пользователей в БД сайта в открытом виде, что не есть хорошо.
              +1
              Двустороннее шифрование еще не отменяли.

              Пароли можно хранить зашифрованными.
                0
                Точно, про него не подумал.
                0
                Готовый API не угодил потому, что в готовом API не было процедуры проверки доступности login'а, а выполнение дописанной своей процедуры вызывало исключение. Из этого следовало переписывание исключения. Может там, конечно, всё просто и банально, но так как лень было разбиратся я сделал всё по своему.
                  0
                  Не знаю, конечно, из-за чего там может вызываться исключение, но сама функция проверки пользователя на существование — всего 6 строчек, пишется за несколько секунд. :-)

                  UserApi.php:
                  /**
                   * @param string $login
                   * @return SimpleXMLElement
                   */
                  public function checkUser($login)
                  {
                      return $this->invokeHandler('check_user',
                          array('login' => $login)
                      );
                  }
                  

                  Никаких исключений, все отлично работает.
                    0
                    Хм — попробую, конечно.
                0
                Жду с нетерпением доработок
                Давно хотел нечто подобное
                  0
                  Очень полезный модуль… надеюсь у вас всё получится.
                    0
                    У меня вопрос по теме.
                    Есть ли майлклиент на друпал
                    Webmail Plus пробовал, не получилось завести.
                    Я пытался поставить, установил все зависимости, но работать с почтой оно так и не захотело.
                    По моему мнению там была проблема с модулем AES, не шифровался пароль для передачи на сервер почты.

                    Ну вообщем суть вопроса такова: Есть ли у кого опыт привязки webmail клиента(любого) к друпалу. Интересует именно совместная авторизация, регистрация хотя бы даже на том яндексмыле автоматом.
                    Измучался просто с этими roundcube-ми, бигмайлами, сквиррелл…
                      0
                      Спасибо, полезная статья! =)
                        0
                        О, вот это действительно очень актуально! :)
                        Удачи Вам в разработке модуля! Надеемся увидеть готовый релиз ;)
                          0
                          Не затронута тема единой авторизации на проекте и в почте, входя в проект вы должны авторизовать пользователя и на яндексе. Нам яндекс предложил отправлять скрытую форму, что мы и делаем. Однако существует проблема для пользователей, которые еще не прошли активацию почтового ящика в интерфейсе яндекса. Для них куки не сохраняются и пароль приходиться вводить снова, в их интерфейсе, для пользователя это выглядит по меньшей мере странно.
                          У себя на проекте мы обходим это следующим образом.
                          1) сохраняем пароли.
                          2) делаем авторизацию пользоваетеля со стороны сервера, чтобы получить нужную ссылку, куда нас перенаправляет яндекс
                          3) вход в почту осуществляется не напрямую через mail.n1.by, а через дрюпаловский обработчик n1.by/mail которая определяет, залогинен ли пользователь, прошел ли ацтивацию и в зависимости от этого перенаправляет по нужной ссылке.

                          Так же нужно доделать смену пароля для редактирования пользователя.

                          Исходя из всех этих действий, можно сделать вывод что полноценная интеграция Почты для доменов от яндекса находится в крайне сыром виде, и судя по всему к нормальному виду придет не скоро.

                          Only users with full accounts can post comments. Log in, please.