Sign in to follow this  
Followers 0

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

1 post in this topic

Guest stibs
Новичок

Дорогой читатель, я открываю цикл уроков по защите аккаунта игрока. Этот урок первый из 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 и интернет!

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.