Drupal
5 January 2011

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

From Sandbox
Вступление

С недавнего времени Яндекс порадовал такой услугой как почта для домена. Довольно таки полезная услуга. А наличие Яндекс.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().
Собственно вот и вся работа. Конечно, на релиз это не тянет, но как скелет вполне подойдёт. Для доработок уйма пространства. Планирую дописать получение списка писем при входе на сайт и ещё кое какой функционал. Всех с Новым Годом!

+29
2.4k 53
Comments 20
Top of the day