Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 2
    Гостей: 1
    Пользователи: - отсутствуют
    Роботы: crawl Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 8-02-2013, 01:36 Просмотров: 5233

    Урок 23. Работа с сокетами (отправка email)

    Урок 23. Работа с сокетами (отправка email)В прошлом уроке мы с вами разобрали пример как получить web страницу с помощью сокетов.В этом уроке я расскажу о плагине от PomanoB`а. А точнее о функционале который он предоставляет, а именно набор функций:
    • smtp_connect - Коннект к серверу smtp
    • smtp_auth - авторизация
    • smtp_send - отправка письма
    • smtp_quit - закрытие соединения


    На самом деле, этот плагин ни что иное как прошлый урок, по результатам которого можно было бы написать собственный такой плагин, до Дядька Романыч позаботился о нас. По этому я расскажу только как применять эти функции, а тем кому интересно более детально узнать как работает плагин, сам изучит исходник. Который в конце данной статьи приложен.

    И так для работы нам потребуется:
    1. Плагин Amx Mail v 0.1.0
    2. Инклуд amxmail ( в комплекте с плагином)
    3. Нами написанный мини пример


    Будем считать что все файлы находятся в нужных местах. Приступим к написанию примера, который будет отправлять на определенный электронный адрес письмо с определенным содержанием, ну скажем с именем сервера и текущей картой при его старте.

    Давайте подумаем как вы отправляете письмо другу? Скорее всего так:
    1. Заходите на страничку вашей почтовой системы или открываете программу клиент. ( то етсь соединяетесь с сервером)
    2. Далее вводится логин и пароль ( авторизация на сервере)
    3. Написание и отправка письма
    4. Закрытие странички или программы (закрытие соединения)

    Будущий плагин будет делать все тоже самое в той же самой последовательности. Не правда ли все просто?

    Начнем с коннекта к серверу:
    /* 
    * Подключиться к SMTP серверу
    *
    * server - адрес сервера
    * port - порт сервера
    *
    * В случае успеха функция вернёт идентификатор сервера,
    * его надо использовать в первом параметре остальных функций
    *
    * В случае неудачи возвращает -1
    *
    */
    native smtp_connect(server[], port);

    В описании функции и так все предельно понятно, но на всякий случай поясню что данные настройки вы можете посмотреть в справочных материалах ваших почтовых служб, вот пример Хелп mail.ru
    Из которого следует что адрес сервера smtp.mail.ru и нужный нам порт SMTP — 25, 587 или 2525 ( любой на выбор )

    Далее следует авторизация:
    /* 
    * Авторизация на SMTP сервере
    *
    * socket - идентификатор сервера
    * username - имя пользователя (Например username@mail.ru)
    * password - пароль
    *
    */
    native smtp_auth(socket, username[], password[]);

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

    Наконец подошли к самой отправке письма:
    /* 
    * Отправить письмо
    *
    * socket - идентификатор сервера
    * from - от кого письмо (для большинства серверов должно совпадать с именем пользователя)
    * to - кому письмо
    * subject - тема письма
    * mail - содержимое письма
    * addHeaders - дополнительные заголовки (Например Reply-To:)
    *
    */
    native smtp_send(socket, from[], to[], subject[], mail[], addHeaders[]);

    Функция не поддерживает форматирование, по этому передаваемые данные необходимо подготовить заранее, например с помощью функции format

    После успешной отправки ( а может и не отправки) необходимо закрыть открытое соединение с сервером:
    /* 
    * Отключиться от сервера
    *
    * socket - идентификатор сервера
    */
    native smtp_quit(socket);


    Теоретически разобрались, посмотрим как это будет выглядеть в коде:
    #include <amxmodx>
    #include <amxmisc>
    #include <amxmail>

    #define PLUGIN "[http://amxxmodx.ru] Send Mail"
    #define VERSION "1.0"
    #define AUTHOR "Admin"


    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        set_task(5.0,"send",0)
    }
    public send(){

        //Подготавливаем текст для письма
        new text[1024],MapName[32],ServerName[32]
        get_user_name(0,ServerName,31)
        get_mapname(MapName,31)
        format(text,charsmax(text),"Hello Admin! From server:%s , map in server [%s]",ServerName,MapName)
        
        
        new connect // Создаем переменную для хранения идентификатора соединения
        connect = smtp_connect("smtp.mail.ru",587)//Соедиенние и получение идентификатора
        
        if(connect != -1){// Проверяем что соединение установлено
            smtp_auth(connect,"login","pass")// Авторизация
            smtp_send(connect,"TVOI@mail.ru","KOMY@list.ru","TeMa: Server start",text,"To:")//Отправка письма
            smtp_quit(connect)//Закрытие соединения
        }else{
            server_print("ERROR Connect to SMTP")        
        }
        
    }

    Вот тут: "TVOI@mail.ru","KOMY@list.ru"
    Можете ввести свой почтовый адрес в двух местах, и тогда получится что вы пришлете письмо самому себе.
    Надеюсь теперь вы понимаете как использовать данный плагин. Ах да, функция set_task там необходимо для того, что бы плагин amx_mail точно успел загрузиться. ( мало ли он у вас ниже в списке плагинов окажется)

    Теперь исходный код плагина amx_mail:

    Тут я уже раскоментировал строчку что бы в консоль сервера шли логи действий плагина, это даст вам возможность более подробно изучить процесс работы плагина. Но для полного понимания вам конечно же необходимо прочитать материалы о работе email.
    Рекомендую прочитать эту статью: PHP Email
    И содержание инклуда amxmail:
    #if defined AMX_MAIL_INCLUDED
      #endinput
    #endif
    #define AMX_MAIL_INCLUDED

    #if AMXX_VERSION_NUM >= 175
    #pragma reqlib amxmail
    #if !defined AMXMODX_NOAUTOLOAD
      #pragma loadlib amxmail
    #endif
    #else
    #pragma library amxmail
    #endif

    native smtp_connect(server[], port);

    native smtp_auth(socket, username[], password[]);

    native smtp_send(socket, from[], to[], subject[], mail[], addHeaders[]);

    native smtp_quit(socket);

    Источник плагина:amxmodx.su
    Надеюсь теперь вы всегда будите получат необходимые уведомления с вашего сервера.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Урок 23. Работа с сокетами (отправка email)
    HENRI(_)LLOYD

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Ты вообще красавчик) И мне помог и с другими поделился)

    HENRI(_)LLOYD

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Попробовал твой пример, само сообщение приходит, а текст нет.
    То есть приходят пустые сообщения.
    HENRI(_)LLOYD

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Наконец заработало у меня)
    Расскажу почему не работало, короче лоханулся я конкретно: в plugins.ini записал розширение не амхх, а сма.
    Но появилась новая проблема:
    Сервер: 1111111111111111111111 // мой сервер(название) - тут все норм
    IP:port : 192.168.1.101:27018 // - это внутренний ИП, а как получить внешний?
    Текущая карта: de_dust2 // тут все норм
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Честно говоря не задумывался и не могу что либо 100% верное предложить.
    Но можно делать так: из прошлого урока по сокетам брать например и запрашивать сервером вот эту страницу:http://izlapzla.ru/amxbans/ban_list.php
    она для твоего сервера скорее всего внешняя и адрес будет внешний, а затем уже с помощью этого урока отправлять полученные данные себе на почту.
    --------------------
    HENRI(_)LLOYD

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Ладно, буду думать, спастбо)
    Hunter

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    failed to load: Module/Library "amxmail" required for plugin. Check modules.ini.
    плагин требует модуль "amxmail" в modules.ini, а где его взять?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Hunter,
    Внимательно прочитай еще раз статью
    Там под спойлером необходимый плагин
    Теперь исходный код плагина amx_mail:

    Он и является модулем/библиотекой.
    --------------------

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама