Иконка ресурса

AmxxCurl 1.1.1

Нет прав для скачивания
Сообщения
40
Реакции
1
wopox1337, вот тебе описание что бы не задавал глупых вопросов как нуб!:haha:
  1. Улучшение производительности: избавление от потоков, использование библиотеки asio, использование интерфейса curl multi;
  2. Добавление более простых интерфейсов для amxx плагинов;
  3. Улучшение скриптов сборки.
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
GAME-DV, это планы. Если вы не знаете зачем это, значит оно вам не нужно
 
Сообщения
48
Реакции
151
Пример отправки JSON пост запросом и, собственно, получения ответа:

Код:
#include <amxmodx>
#include <curl>

#pragma semicolon 1
#pragma ctrlchar '\'

public plugin_init()
{
    @requestBegin();
}

enum dataStruct { curl_slist: linkedList };

@requestBegin()
{
    new CURL: pCurl, curl_slist: pHeaders, sData[dataStruct];

    pHeaders = curl_slist_append(pHeaders, "Content-Type: application/json");
    pHeaders = curl_slist_append(pHeaders, "User-Agent: curl");

    sData[linkedList] = pHeaders;

    if ((pCurl = curl_easy_init())) {
        curl_easy_setopt(pCurl, CURLOPT_URL, "http://jsonplaceholder.typicode.com/posts");
        curl_easy_setopt(pCurl, CURLOPT_COPYPOSTFIELDS, "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}");
        curl_easy_setopt(pCurl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeaders);
        curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, "@responseWrite");

        curl_easy_perform(pCurl, "@requestComplete", sData, dataStruct);
    }
}

@responseWrite(const data[], const size, const nmemb)
{
    server_print("Response body: \n%s", data);
 
    return size * nmemb; // tell curl how many bytes we handled
}

@requestComplete(CURL: curl, CURLcode: code, const data[dataStruct])
{
    if (code != CURLE_OK) {
        new szError[128];
        curl_easy_strerror(code, szError, charsmax(szError));
        server_print("CURL: %s", szError);
    }

    curl_easy_cleanup(curl);
    curl_slist_free_all(data[linkedList]);
}
UPD: Обновил.
 
Последнее редактирование:
Сообщения
48
Реакции
209
Помог
1 раз(а)
Пример отправки JSON пост запросом и, собственно, получения ответа:

Код:
#include <amxmodx>
#include <curl>

#pragma semicolon 1
#pragma ctrlchar '\'

public plugin_init()
{
    @requestBegin();
}

enum dataStruct { curl_slist: linkedList };

@requestBegin()
{
    new CURL: pCurl, curl_slist: pHeaders, sData[dataStruct];

    pHeaders = curl_slist_append(pHeaders, "Content-Type: application/json");
    pHeaders = curl_slist_append(pHeaders, "User-Agent: curl");

    sData[linkedList] = pHeaders;

    if ((pCurl = curl_easy_init())) {
        curl_easy_setopt(pCurl, CURLOPT_URL, "http://jsonplaceholder.typicode.com/posts");
        curl_easy_setopt(pCurl, CURLOPT_COPYPOSTFIELDS, "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}");
        curl_easy_setopt(pCurl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeaders);
        curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, "@responseWrite");

        curl_easy_perform(pCurl, "@requestComplete", sData, dataStruct);
    }
}

@responseWrite(const data[], const size, const nmemb)
{
    server_print("Response body: \n%s", data);

    return size * nmemb; // tell curl how many bytes we handled
}

@requestComplete(CURL: curl, CURLcode: code, const data[dataStruct])
{
    if (code != CURLE_OK) {
        new szError[128];
        curl_easy_strerror(code, szError, charsmax(szError));
        server_print("CURL: %s", szError);
    }

    curl_easy_cleanup(curl);
    curl_slist_free_all(data[linkedList]);
}
UPD: Обновил.
обращаю внимание на то, что для подготовки post данных используется CURLOPT_COPYPOSTFIELDS вместо CURLOPT_POSTFIELDS, это важно, CURLOPT_POSTFIELDS не работает (пока что)
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Приветствую.

На новых версиях Curl, функция curl_easy_perform в кэлбеке начала подваливать ошибками. Соответственно второй аргумент там уже не CURLE_OK и текст ошибки:

Problem with the SSL CA cert (path? access rights?)

С чем это может быть связано и как это исправить ?
 
Последнее редактирование:
Сообщения
48
Реакции
209
Помог
1 раз(а)
SISA, на винде не нужно указывать CURLOPT_CAINFO, если не винда, то странно, в любом случае напиши на какой ос это
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Сервер на Линуксе, а CURLOPT_CAINFO я вообще ни где не назначал, да и я такого даже в инклудах не вижу.
 
Сообщения
48
Реакции
209
Помог
1 раз(а)
SISA, какой дистрибутив и версия? на каждый запрос выдаётся эта ошибка?
попробуй задать путь к бандлу с сертификатами через опцию:
curl_easy_setopt(curl, CURLOPT_CAINFO, "cstrike/addons/amxmodx/data/cert/cacert.pem");
скачать можно отсюда https://curl.haxx.se/docs/caextract.html
 
  • Нравится
Реакции: SISA
Сообщения
144
Реакции
276
Помог
1 раз(а)
Версия 1.1.1 (последняя). Запрос не логиирую, но выведу разумеется. На счет сертификата спасибо, попробую.
23 Июн 2019
А, всё проще, вызывается на любой запрос. Обращаюсь к API Яндекса: https://yandex.ru/dev/translate/doc/dg/reference/translate-docpage/
23 Июн 2019
cacert.pem подключил. Ошибки пропали.
 
Последнее редактирование:
Сообщения
48
Реакции
209
Помог
1 раз(а)
Возможно я что-то в конфигурации сборки модуля поменял ?, ну ладно
а у тебя плагин, который чат автоматически переводит? У меня была такая идея, ссылку api увидел сразу вспомнил, клевая идея)
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Возможно я что-то в конфигурации сборки модуля поменял ?, ну ладно
а у тебя плагин, который чат автоматически переводит? У меня была такая идея, ссылку api увидел сразу вспомнил, клевая идея)
Да, автопереводчик: спамчик но мне, в своё время, пришлось нарисовать целую схему, чтобы понять, как это будет работать в реальных условиях и переводить одно сообщение на множество языков с учетом исключений и прочей ботвы.

Может как-то перекомпилить новую версию ? Отдельный файл, это, конечно, хорошо, но не очень.
 
Сообщения
48
Реакции
209
Помог
1 раз(а)
  • Нравится
Реакции: SISA
Сообщения
48
Реакции
209
Помог
1 раз(а)
В твоём случае можно не использовать тот файл, а задать опцию так
curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/ssl/certs/ca-certificates.crt");

Либо можешь использовать специальную версию модуля, где дефолтный путь к бандлу совместим с ubuntu (и debian).

И возможно не получится просто пересобрать либы так чтобы работало везде одинаково (например версия во вложении не заработает на centos без определения опции CURLOPT_CAINFO) и нужна доп. поддержка в самом модуле (но в скором времени я этого не сделаю).
 

Вложения

Сообщения
144
Реакции
276
Помог
1 раз(а)
Спасибо. Да у меня gentoo. Путь к "ca-certificates.crt" задал, завтра проверю работу.

Вобщем, поставил последнюю версию модуля (из сообщения выше), в CURLOPT_CAINFO ничего прописывать не стал. Вроде работает без ошибок.
 
Последнее редактирование:
Сообщения
144
Реакции
276
Помог
1 раз(а)
Приветствую.

Вопрос к знатокам. Кто пробовал делать код для отправки сообщений на почту ?

Взял готовый пример и причесал его. Получилось такое:

Код:
#include <amxmodx>
#include <curl>

#define PLUGIN        "Curl Example SMTP"
#define AUTHOR    "Morning Rainbow"
#define VERSION    "0.1"

#define MAX_PLAYERS 32

#define SMTP_USERNAME        ""
#define SMTP_PASSWORD        ""
#define SMTP_URL                "ssl://smtp.yandex.ru"
#define SMTP_PORT            465

smtps://smtp.yandex.ru
ssl://smtp.yandex.ru
smtp.yandex.ru


#define SEND_FROM            SMTP_USERNAME
#define SENDER_NAME            "Stats Bot"

static const c_payload_template[][] =
{
    {"To: <%s>^r^n"},
    {"From: <%s>(%s)^r^n"},
    {"Message-ID: <%s>^r^n"},
    {"Subject: %s^r^n"},
    {"Content-Type: text/html^r^n"},
    {"^r^n"}, /* empty line to divide headers from body, see RFC5322 */

    {"Сервер <strong>%s</strong><br>^r^n"},
    {"Адрес <strong>%s</strong><br>^r^n"},
    {"Статистика для игрока <strong>%s</strong><br>^r^n"},
    {"<br>^r^n"},
    {"<table><tr><th>Убийства</th><th>В голову</th><th>Смерти</th><th>Выстрелов</th><th>Попадания</th><th>Урон</th></tr>^r^n"},
    {"<tr><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr></table>^r^n"}
};

enum _:TUserData
{
    usdat_Email[64]
};

new g_udUserData[MAX_PLAYERS+1][TUserData]
new g_iLinesRead[MAX_PLAYERS+1]
new bool:g_bLock[MAX_PLAYERS+1] // может ли игрок опять запросить статистику
new g_szServerName[64], g_szServerAddr[64]

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    get_cvar_string("hostname", g_szServerName, charsmax(g_szServerName))
    get_user_ip(0, g_szServerAddr, charsmax(g_szServerAddr))
}

public plugin_precache()
{
    register_concmd("say", "say_callback")
    register_concmd("say_team", "say_callback")
}

public say_callback(id)
{
    new buf[128], mail[117];

    read_argv(1, buf, charsmax(buf));

    if(!equal(buf, "/statsmail", 10))
        return PLUGIN_CONTINUE;

    read_argv(2, mail, charsmax(mail));
    trim(mail);

    if(strlen(mail) == 0)
    {
        client_print(id, print_chat, "Ошибка, не указан email, вы должны указать email после команды /statsmail");
        return PLUGIN_CONTINUE;
    }

    send_mail(id, mail);
    return PLUGIN_HANDLED;
}

send_mail(id, mail[])
{
    if(g_bLock[id])
    {
        client_print(id, print_chat, "Вы не можете запросить статистику, пока не обработался предыдущий запрос.");
        return;
    }

    g_bLock[id] = true
    g_iLinesRead[id] = 0

    client_print(id, print_chat, "Отправка статистики на email ^"%s^"", mail);

    new CURL:curl;
    new curl_slist:recipients;

    if((curl = curl_easy_init()))
    {
        curl_easy_setopt(curl, CURLOPT_USERNAME, SMTP_USERNAME)
        curl_easy_setopt(curl, CURLOPT_PASSWORD, SMTP_PASSWORD)

        // отключает проверку сертификата, если включить обратно, то нужно в какой-то другой опции указать путь к папке с сертификатами
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_easy_setopt(curl, CURLOPT_PORT, SMTP_PORT);
        curl_easy_setopt(curl, CURLOPT_URL, SMTP_URL);

        // угловые скобки < > добавятся автоматически
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, SEND_FROM);

        recipients = curl_slist_append(recipients, mail);

        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, "payload_source");
        curl_easy_setopt(curl, CURLOPT_READDATA, id);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // вывод дебаг информации в консоль сервера

        copy(g_udUserData[id][usdat_Email], strlen(mail), mail);

        new data[2];
        data[0] = id;
        data[1] = recipients;
        curl_easy_perform(curl, "payload_complite", data, sizeof(data));
    }
}

public payload_source(buffer[], size, nmemb, player)
{
    if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1))
        return 0;

    if(g_iLinesRead[player] > (sizeof(c_payload_template) - 1))
        return 0;

    if(!is_user_connected(player))
        return 0;

    new text[512], len

    switch(g_iLinesRead[player])
    {
        case 0: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_udUserData[player][usdat_Email])

        case 1: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], SEND_FROM, SENDER_NAME)

        case 2:
        {
            new uid[40];
            generate_uid(uid, SEND_FROM);
            formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], uid);
        }

        case 3:
        {
            new subj[128];
            get_user_name(player, subj, charsmax(subj));
            format(subj, charsmax(subj), "[%s] Stats for %s", g_szServerName, subj);
            formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], subj);
        }

        case 6: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_szServerName)

        case 7: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_szServerAddr)

        case 8:
        {
            new name[32];
            get_user_name(player, name, charsmax(name));
            formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], name);
        }

        case 11:
        {
            new stats[8], hits[8], name[32];

            hits = "awd1"
            name = "awd2"
            stats = "awd3"

            formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], stats[0], stats[2], stats[1], stats[4], stats[5], stats[6]);
        }

        default: copy(text, charsmax(text), c_payload_template[g_iLinesRead[player]]);
    }

    g_iLinesRead[player]++;

    len = strlen(text);

    if(len > nmemb)
    {
        log_amx("[%s] Размер буфера (%d) для записи превышает допустимый максимум (%d)", len, nmemb);
        g_iLinesRead[player] = 0;
        return 0;
    }

    copy(buffer, len, text);

    return len;
}

public payload_complite(CURLcode:code, CURL:curl, data[], data_size)
{
    new id = data[0];
    new curl_slist:recipients = curl_slist:data[1];

    if(is_user_connected(id))
    {
        if(code != CURLE_OK)
        {
            new error[256];
            curl_easy_strerror(code, error, charsmax(error));
            client_print(id, print_chat, "Ошибка отправки: %s", error);
        }
        else
            client_print(id, print_chat, "Письмо успешно отправлено! Проверьте папку ^"Спам^", если не найдёте письмо в папке ^"Принятые^"");
    }

    curl_slist_free_all(recipients);
    curl_easy_cleanup(curl);
    g_bLock[id] = false;
}

stock generate_uid(buf[40], const mail[])
{
    static const chars[] = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'i', 'I', 'k', 'K', 'o', '2', '4', '_', '-'} // ok

    new gen_size = charsmax(buf) - strlen(mail)-1;

    for(new i = 0; i < gen_size; i++)
    {
        buf[i] = chars[random(sizeof chars)];
    }

    add(buf, charsmax(buf), ".");
    add(buf, charsmax(buf), mail, strlen(mail));
}

Пытаюсь подружить его с Яндекс-Почтой, и разумеется, оно не работает... (Win OS и последняя версия Curl модуля: "v1.1.1")

Если указываю рекомендуемый Яндексом URL: ssl://smtp.yandex.ru
Получаю в ответ: "* Protocol "ssl" not supported or disabled in libcurl"

Пытался указывать URL: smtps://smtp.yandex.ru
Вылезло много всякого хлама, вплоть до "[AMXX] Run time error 3: stack error"

В итоге с curl_easy_strerror получил: "Failure when receiving data from the peer | 56"

По "smtp.yandex.ru" вообще не подключается...

В чем может быть проблема ?
 

Garey

ninjaCow
Сообщения
417
Реакции
1,055
Помог
10 раз(а)
#define SMTP_URL "smtps://smtp.yandex.ru"
у меня с этим работает. Правда пишет неверный пароль :hmm:
Код:
< 535 5.7.8 Error: authentication failed: Invalid user or password!
* Closing connection 0
* schannel: shutting down SSL/TLS connection with smtp.yandex.ru port 465
* schannel: clear security context handle
может у вас получится с
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); // вывод дебаг информации в консоль сервера
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Та дебаг я весь выводил. Шлется оно с "smtps://smtp.yandex.ru" куда-то (но не ко мне) и выводит дебаг, после которого сервер благополучно крашится :sorry:

Код:
*   Trying 77.88.21.158...
* TCP_NODELAY set
* Connected to smtp.yandex.ru (77.88.21.158) port 465 (#0)
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 187 bytes...
* schannel: sent initial handshake data: sent 187 bytes
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 2/3)
* schannel: failed to receive handshake, need more data
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 2/3)
* schannel: encrypted data got 4096
* schannel: encrypted data buffer: offset 4096 length 4096
* schannel: encrypted data length: 3998
* schannel: encrypted data buffer: offset 3998 length 4096
* schannel: received incomplete message, need more data
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 2/3)
* schannel: encrypted data got 583
* schannel: encrypted data buffer: offset 4581 length 5022
* schannel: sending next handshake data: sending 166 bytes...
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 2/3)
* schannel: encrypted data got 91
* schannel: encrypted data buffer: offset 91 length 5022
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with smtp.yandex.ru port 465 (step 3/3)
* schannel: stored credential handle in session cache
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 181
* schannel: encrypted data buffer: offset 181 length 5022
* schannel: decrypted data length: 118
* schannel: decrypted data added: 118
* schannel: decrypted data cached: offset 118 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 118 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 118
* schannel: decrypted data buffer: offset 0 length 4096
< 220 awdwadwadwadawd-c.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)
> EHLO qwert2
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 213
* schannel: encrypted data buffer: offset 213 length 5022
* schannel: decrypted data length: 155
* schannel: decrypted data added: 155
* schannel: decrypted data cached: offset 155 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 155 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 155
* schannel: decrypted data buffer: offset 0 length 4096
< 250-sas2-b0ca3cd64eaa.qloud-c.yandex.net
< 250-8BITMIME
< 250-PIPELINING
< 250-SIZE 42991616
< 250-AUTH LOGIN PLAIN XOAUTH2
< 250-DSN
< 250 ENHANCEDSTATUSCODES
> AUTH PLAIN
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 85
* schannel: encrypted data buffer: offset 85 length 5022
* schannel: decrypted data length: 18
* schannel: decrypted data added: 18
* schannel: decrypted data cached: offset 18 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 18 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 18
* schannel: decrypted data buffer: offset 0 length 4096
< 334 awdwadawdawdwad
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 101
* schannel: encrypted data buffer: offset 101 length 5022
* schannel: decrypted data length: 38
* schannel: decrypted data added: 38
* schannel: decrypted data cached: offset 38 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 38 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 38
* schannel: decrypted data buffer: offset 0 length 4096
< 235 2.7.0 Authentication successful.
> MAIL FROM:<[email protected]>
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 101
* schannel: encrypted data buffer: offset 101 length 5022
* schannel: decrypted data length: 36
* schannel: decrypted data added: 36
* schannel: decrypted data cached: offset 36 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 36 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 36
* schannel: decrypted data buffer: offset 0 length 4096
< 250 2.1.0 <[email protected]> ok
> RCPT TO:<почта_назначения@mail.ru>
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 101
* schannel: encrypted data buffer: offset 101 length 5022
* schannel: decrypted data length: 44
* schannel: decrypted data added: 44
* schannel: decrypted data cached: offset 44 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 44 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 44
* schannel: decrypted data buffer: offset 0 length 4096
< 250 2.1.5 <почта_назначения@mail.ru> recipient ok
> DATA
* schannel: client wants to read 1024 bytes
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: encrypted data got 117
* schannel: encrypted data buffer: offset 117 length 5022
* schannel: decrypted data length: 50
* schannel: decrypted data added: 50
* schannel: decrypted data cached: offset 50 length 4096
* schannel: encrypted data buffer: offset 0 length 5022
* schannel: decrypted data buffer: offset 50 length 4096
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 50
* schannel: decrypted data buffer: offset 0 length 4096
< 354 Enter mail, end with "." on a line by itself

Иногда долеатет до "Run time error 3: stack error " и не крашится, но почту всё равно не шлет :smile3:

Код:
< 354 Enter mail, end with "." on a line by itself
L 10/11/2019 - 00:32:25: [AMXX] Displaying debug trace (plugin "mail.amxx", version "0.1")
L 10/11/2019 - 00:32:25: [AMXX] Run time error 3: stack error
* schannel: client wants to read 16384 bytes
* schannel: encrypted data buffer: offset 0 length 17408
* schannel: server closed the connection
* schannel: encrypted data buffer: offset 0 length 17408
* schannel: encrypted data buffer: offset 0 length 17408
* schannel: decrypted data buffer: offset 0 length 16384
* schannel: schannel_recv cleanup
* schannel: server closed abruptly (missing close_notify)
* Connection #1 to host smtp.yandex.ru left intact
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу