![]() |
![]() |
|||
|
||||
S.Builder 4.0: Система личных сообщений и почтовый ящик: работаем вместе.Упоминаемые CMSНедавно я столкнулся с необходимостью организации работы службы технической помощи пользователям. Наверняка Вы использовали подобные системы – помните, когда вы получали от Вашего провайдера примерно следующее письмо: «Ваше сообщение получено нашими сотрудниками. Ему присвоен номер 123. В ближайшее время мы Вам ответим». Сообщение стоит в очередь и как только освобождается менеджер, оно отправляется ему в работу. Как сделать такую систему? За основу, как и всегда, я беру систему управления сайтом S.Builder Описание API интерфейса можно найти по адресу – http://api.sbuilder.ru/ Мануал по языку PHP – http://www.php.net/ Итак, поехали… Прежде всего, хочу сказать, что для того , чтобы моя реализация задачи работала необходимо, чтобы PHP был скомпилирован с включенным модулем IMAP. Для того, чтобы проверить выводим phpinfo() и проверяем параметр Configure Command. Должны быть следующие строки: '--with-imap-ssl' '--with-imap=/usr/lib/dovecot/imap'. Скрипт будет работать в кроне. Этот скрипт будет являться частью моей CRM – системы. Поэтому положим его в директорию cms/plugins/pl_crm/prog/. Назовем его post.php. Начнем:
Самая первая строка – подключение ядра системы S.Builder. Подключаем для того, чтобы использовать API. $from_user – переменная (в будущем вынесем ее в настройки), которая обозначает ID пользователя, от которого внутри системы будет приходить сообщение, $to_user – аналогично, только пользователь, принимающий сообщения. $server, $email, $email_pass – тут я думаю все ясно. Первая переменная – сервер, к которому происходит подключение и папка с общениями, которую открываем. Вторые две – логин и пароль. Далее:
Первая строка – соединение по IMAP с почтовым ящиком и выбор директории, указанной в настройках. Второе – системная настройка (надо ли отправлять auto-replay на сообщение). Третья строка – получение состояния почтового ящика на сервере (количества почтовых сообщений, дату и другие параметры). Далее создаем цикл:
Что происходит в этом цикле? $inbox->Nmsgs обозначает количество сообщений в почтовом ящике, его мы и получаем. Далее по очереди обрабатываем каждое сообщение – в строках 03-07 мы получаем заголовки сообщения, выделяем из них тему письма, отправителя и дату отправления и кодируем все это в utf-8. Функцией $s = imap_fetchstructure($mbox, $i); мы получаем структуру сообщения (она понадобится далее – сообщение может быть с аттачментом и т.п.). В строке 14 мы проверяем – состоит сообщение из одной части или из нескольких частей. В зависимости от этого, мы по-разному получаем его функцией getMsg(). Про нее я расскажу Вам позже. Забегая вперед , могу сказать, что функция возвращает массив, в котором содержится тип и собственно значение. Типов всего 2 – attach (наименование файла в attach`е сообщения) и text (текст письма). Далее в строках 14-34 мы обрабатываем сообщение и его аттачмент. Если это простое сообщение – просто получаем его текст, если сложное – к тексту внизу дописываем ссылки на файлы в аттаче, которые функция getMsg() сохраняет в указанную нами директорию. Далее у нас есть все составляющие для регистрации почтового запроса – заголовки, от кого пришло сообщение и его текст с аттачами. Остался один небольшой нюанс – выяснить, новое ли это сообщение или ответ на старое (которому уже присвоен номер запроса). Для этого мы используем регулярное выражение в строке 36. Я не буду описывать в подробностях регистрацию отправления, опишу лишь один случай – письмо новое (необходимо присвоить ему номер, записать в базу данных, сохранить аттачменты и отправить пользователю автоматическое сообщение о том, что его запрос в работе). Для этого мы используем строки 43-49. Первым делом мы устанавливаем флаг auto_replay. Он означает, что в конце выполнения обработки сообщения необходимо отправить автоматический ответ пользователю. После этого мы получаем адрес отправившего запрос. К сожалению текущая версия модуля личных сообщений не позволяет записать его в отдельное поле – поэтому пойдем на уловку. Запишем его в конец сообщения. (строка 45). Далее идет запись в базу самого сообщения функцией sql_param_query, После того, как мы записали сообщение, у нас появляется его уникальный id. Надо добавить его в заголовок – что мы и делаем в строке 48. Сообщение обработано, строка 49 удаляет его из почтового ящика (зачем оно нам?). Теперь разберемся с функцией getMsg() и автоматическим ответом пользователю.
Итак, эта функция определяет, что за сообщение пришло и возвращает нам его. Если тип сообщения 0 (сообщение без аттачмента) то функция декодирует его в кодировку utf-8. Определение кодировки сообщения происходит по параметрам сообщения. Если вдруг параметров нет – используется функция mb_detect_encoding() модуля mb_string. Возвращается тип «text» и собственно текст сообщения в utf-8. В другом случае мы считаем, что сообщение пришло с аттачем. В этом случае в зависимости от кодировки мы декодируем аттачмент, создаем уникальный id (на случай если в один момент пришло два письма с одинаковым названием файла) и пишем атачмент в файл. Возвращается тип «attach» и название файла. Остался последний момент – отправка автоответа пользователю. В цикле будет такой код:
А до цикла надо прописать:
Во втором фрагменте мы инициализируем объект SBuilder`а, который отвечает за отправку писем, и устанавливаем параметры. В первом фрагменте задаем оставшиеся фрагменты письма. Второй флаг в методе $mail->send() означает что сообщение нужно собирать каждый раз при отправке (ведь у нас меняется часть его параметров. То, что я здесь описал – это скелет, то с чего можно начать написание серьезной системы обработки сообщений. В качестве перспектив можно сделать настройки, по которым сообщения будут распределяться:
Все настройки данного скрипта надо выносить в настройки системы и т.п. Если у Вас есть необходимость и желание – дорабатывайте! Я подскажу и помогу ;) Если у кого-то есть вопросы по статье – пишите m@iqcompany.ru. Буду рад услышать отзывы и предложения по темам статей. Максим Гасумянц (Компания «IQ - Разработка сайтов») Автор: Максим Гасумянц |
![]() |
![]() |
||
Реклама
© 2006-2018 CMS Magazine Правовая информация Статьи партнеров Реклама
CMS Magazine – электронное СМИ. Эл № ФС 77-32705. Статьи партнеров Рейтинг Рунета: рейтинг веб студий, рейтинг seo компаний, рейтинг CMS. |
![]() |
![]() |