Гость stibs

Защита аккаунта игрока - Отправка писем на почту через сервер (mailer.php)

В теме 1 сообщение

Дорогой читатель, я открываю цикл уроков по защите аккаунта игрока. Этот урок первый из 3-ех. В этой уроке я расскажу тебе об отправке писем на почту прямо через сервер, используя mailer.php. В следующем, втором уроке, я расскажу тебе о защите аккаунта с помощью отправки СМС на его телефон, ну а в третьем расскажу о защите с помощью Google Authenticator. 

Начинем первый урок из цикла: Отправка писем на почту игрока. 

В начало мода вставляем (желательно после всех инклудов):
 

#include <a_http> // подключаем инклуд http, с помощью него будем отправлять запросы к нашему php скрипту, находящемуся на хостинге, который, собственно и отправляем емайл
 
#define MAILER_URL                 "yoursite.ru/mailer.php" // путь к файлу-исполнителю mailer.php. Записывать в таком виде, в котором записано 
#define MAILER_MAX_MAIL_SIZE      (1024) // этот параметр не изменяем без надобности
new number[MAX_PLAYERS]; // сгенерированный код для подтверждения (опционально, для урока. см. ниже)

В любое место мода, главное не в сток и не паблик:
 

forward OnMailScriptResponse(iIndex, iResponseCode, const szData[ ]);
public OnMailScriptResponse(iIndex, iResponseCode, const szData[ ])
{
    if(szData[ 0 ]) printf( "Mailer script says: %s", szData );
}
 
stock SendMail(const szReceiver[ ], const szSenderMail[ ], const szSenderName[ ], const szSubject[ ], const szMessage[ ])
{
    new szBuffer[ MAILER_MAX_MAIL_SIZE ] = "t=",
    iPos = strlen( szBuffer ),
    iLength = strlen( szReceiver );
     
    memcpy( szBuffer, szReceiver, iPos * 4, ( iLength + 1 ) * 4 );
     
    StringURLEncode( szBuffer[ iPos ], 1024 - iPos );
     
    strcat( szBuffer, "&f=" );
     
    iPos    = strlen( szBuffer );
    iLength = strlen( szSenderName );
     
    memcpy( szBuffer, szSenderName, iPos * 4, ( iLength + 1 ) * 4 );
     
    StringURLEncode( szBuffer[ iPos ], 1024 - iPos );
     
    strcat( szBuffer, "&n=" );
     
    iPos    = strlen( szBuffer );
    iLength = strlen( szSenderMail );
     
    memcpy( szBuffer, szSenderMail, iPos * 4, ( iLength + 1 ) * 4 );
     
    StringURLEncode( szBuffer[ iPos ], 1024 - iPos );
     
    strcat( szBuffer, "&s=" );
     
    iPos    = strlen( szBuffer );
    iLength = strlen( szSubject );
     
    memcpy( szBuffer, szSubject, iPos * 4, ( iLength + 1 ) * 4 );
     
    StringURLEncode( szBuffer[ iPos ], 1024 - iPos );
     
    strcat( szBuffer, "&m=" );
     
    iPos    = strlen( szBuffer );
    iLength = strlen( szMessage );
     
    memcpy( szBuffer, szMessage, iPos * 4, ( iLength + 1 ) * 4 );
     
    StringURLEncode( szBuffer[ iPos ], 1024 - iPos );
     
    HTTP( 0xD00D, HTTP_POST, MAILER_URL, szBuffer, "OnMailScriptResponse" );
}
 
stock StringURLEncode(szString[ ], iSize = sizeof( szString ))
{
    for ( new i = 0, l = strlen( szString ); i < l; i++ )
    {
        switch ( szString[ i ] )
        {
            case '!', '(', ')', '\'', '*',
                 '0' .. '9',
                 'A' .. 'Z',
                 'a' .. 'z':
            {
                continue;
            }
             
            case ' ':
            {
                szString[ i ] = '+';
                 
                continue;
            }
        }
         
        new
            s_szHex[ 8 ]
        ;
         
        if ( i + 3 >= iSize )
        {
            szString[ i ] = EOS;
             
            break;
        }
         
        if ( l + 3 >= iSize )
            szString[ iSize - 3 ] = EOS;
         
        format( s_szHex, sizeof( s_szHex ), "%02h", szString[ i ] );
         
        szString[ i ] = '%';
         
        strins( szString, s_szHex, i + 1, iSize );
         
        l += 2;
        i += 2;
         
        if ( l > iSize - 1 )
            l = iSize - 1;
    }
} 

Ну и, собственно, сам mailer.php:

Открываем текстовый документ и кидаем в него этот код, затем меняем расширение файла с .txt на .php:
 

<?php
    ini_set( 'html_errors', false );
     
    if ( empty( $_POST[ 't' ] ) || empty( $_POST[ 'f' ] ) || empty( $_POST[ 'n' ] ) || empty( $_POST[ 's' ] ) || empty( $_POST[ 'm' ] ) )
        die( 'Error: Missing parameters.' );
     
    mail(
        $_POST[ 't' ],
        utf8_encode( $_POST[ 's' ] ),
        $_POST[ 'm' ],
        implode(
            "\r\n",
            array
            (
                'From: "' . addslashes( $_POST[ 'f' ] ) . "\" <{$_POST[ 'n' ]}>",
                "Reply-To: {$_POST['f']}",
                "X-Mailer: PHP/" . phpversion( ),
            )
        )
    );
?> 

Далее загружаете этот файл на хостинг. Если нет денег, чтобы купить хостинг, залейте на hostinger, для обработки php скрипта, он возможно еще и годен. 

Ну и приведу пример использования: генерация кода для подтверждения:

forward OnSendEmail(playerid, email[]); // playerid - ид игрока, email - емайл игрока. Вызывайте где хотите
public OnSendEmail(playerid, email[])
{
    static const fmt_str[] = "Добрый день, уважаемый %s!\n\nВаш код подтверждения на какую-то операцию: %d\n\nPAWNO-RUS RolePlay";
    new str[sizeof(fmt_str)+ (-2+MAX_PLAYER_NAME) + (-2+4) +1], // подсчитываем кол-во элементов формулой
    name[MAX_PLAYER_NAME]; // переменная для ника игрока
    GetPlayerName(playerid, name, sizeof(name)); // получаем ник игрока
    number[playerid] = random(9999); // присваиваем переменной number значение рандома для дальнейших проверок. Обязательно объявите глобально: ко всем new: new number[MAX_PLAYERS];
    format(str, sizeof(str), fmt_str, name, number[playerid]); // форматируем строку
    SendMail(email, "support@pawno-rus.ru", "PAWNO-RUS RolePlay", "Код подтверждения", str); // отправляем на email игроку, где email - емайл самого игрока, support@pawno-rus.ru - ваш емайл, PAWNO-RUS RolePlay - ваш ник, КОд подтверждения - тема письма, str - само сообщение
    return true;
}

На этом все. 

Автор: @stibs и интернет!

Не болейте, всем добра! Будут вопросы - пишите!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу