С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Aleator
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330

Авторизация на SMTP-сервере

15.07.2012, 22:21. Показов 2724. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть простенькое задание для лабы (SMTP-клиент на сокетах). Тестирую на mail.ru.
Что отправить аргументом с HELO?

Добавлено через 7 минут
Ещё вопрос:
 Комментарий модератора 
Правила,
п.5.15. Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
Относительно обхода авторизации:
п.5.6. Запрещено создание и распространение вредоносного ПО (вирусов), обсуждение вареза, кряков и взлома лицензионного софта, а также публикация ссылок для их скачивания.


Добавлено через 44 минуты
Учётная запись давно создана. Как войти?

Добавлено через 1 час 25 минут
Дело в том, что пароль надо передавать закодированным BASE64. Поделитесь кодом?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.07.2012, 22:21
Ответы с готовыми решениями:

Не работает авторизация на SMTP сервере
Всем привет! Возникла такая проблема. Мне нужно написать простейшую авторизацию на smtp-сервере. Я погуглил, нашёл, вот эту статью, и...

Smtp авторизация Lotus Domino 7
Здравствуйте! Подскажите пожалуйста как можно в Lotus Domino 7, сделать авторизацию на 25 порт. Проблема в том, что сейчас на...

Авторизация на сервере
Здравствуйте! <html> <head> <title>Авторизация</title> </head> <?php $mylogin = 'admin'; $mypass = '123'; $mylogin2 =...

11
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
16.07.2012, 00:21
Картинка и base64
1
 Аватар для Aleator
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
18.07.2012, 10:58  [ТС]
При отправке пароля (закодированного) получаю ошибку: "535 Incorrect authentication data: password contains non-printable characters for <хххххххххх@mail.ru>". Пароль верен. Кодирование происходит правильно (ответ на кодированный логин не отрицательный)

Текст переписки с сервером:
Server: 220 smtp21.mail.ru ESMTP ready
Client: HELO smtp.mail.ru
Server: 250 smtp21.mail.ru
Client: AUTH LOGIN
Server: 334 VXNlcm5hbWU6
Server: Я~4Username:чP (декодирование ответа)
Client: ххххххххх
Server: 334 UGFzc3dvcmQ6
Server: Я~4Password:чP (декодирование ответа)
Client: ххххххх
Server: 535 Incorrect authentication data: password contains non-printable characters for <ххххххххх@mail.ru>
1
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
18.07.2012, 13:50
логин может и правильный, а пароль нет. оно так и пишет - в пароле хлам

Добавлено через 1 минуту
...может вы прихватываете символ переноса строки? (если судить по тому как прямолинейно декодированы ответы)
2
 Аватар для Aleator
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
19.07.2012, 01:03  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
может вы прихватываете символ переноса строки? (если судить по тому как прямолинейно декодированы ответы)
Добавляю потом:
C++
1
2
3
4
5
6
7
8
9
10
 AnsiString command;
        command=Form1->Edit3->Text;
        Form1->Memo1->Lines->Append("Client: "+command);
        // кодирую пароль
        unsigned char s[]="";
        encode_b64(command.c_str(),command.Length(),s);
        command=AnsiString((char*)(s))+"\r\n";
        MySocket->Write(command.c_str(),command.Length());
        answer=ReadLine();
        Form1->Memo1->Lines->Append("Server: "+answer);
В чём же дело?

Добавлено через 33 минуты
Всё одно к одному (за исключением Form1->Edit3->Text), как и при отправке логина.

Добавлено через 31 минуту
По-моему, функция кодирования не правильно кодирует во второй раз (дописывает символы из логина). Проверял на онлайн-кодере.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int __stdcall encode_b64(const unsigned char *buftoenc, int bufsize, unsigned char *encbuf) {
    // выделяем память под временный буфер
    unsigned char *buftemp = new unsigned char[bufsize + 3];
    memset(buftemp, '\0', bufsize+3);
    memcpy(buftemp, buftoenc, bufsize);
 
    int i = 0;
    int b64byte[5];
 
    while (i < bufsize) {
        b64byte[0] = buftemp[i] >> 2;
        b64byte[1] = ((buftemp[i] & 3) << 4)|(buftemp[i + 1] >> 4);
        b64byte[2] = ((buftemp[i + 1] & 0x0F) << 2)|(buftemp[i + 2] >> 6);
        b64byte[3] = buftemp[i + 2] & 0x3F;
        if(b64byte[0] == 0)
            encbuf[i + (i / 3)] = '=';
        else
            encbuf[i + (i / 3)] = Base64Table[b64byte[0]];
 
        if(b64byte[1] == 0)
            encbuf[i + (i / 3) + 1] = '=';
        else
            encbuf[i + (i / 3) + 1] = Base64Table[b64byte[1]];
 
        if(b64byte[2] == 0)
            encbuf[i + (i / 3) + 2] = '=';
        else
            encbuf[i + (i / 3) + 2] = Base64Table[b64byte[2]];
 
        if(b64byte[3] == 0)
            encbuf[i + (i / 3) + 3] = '=';
        else
            encbuf[i + (i / 3) + 3] = Base64Table[b64byte[3]];
        i += 3;
    }
    delete buftemp;
    return strlen(encbuf);
}
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
19.07.2012, 07:45
Цитата Сообщение от Aleator Посмотреть сообщение
По-моему, функция кодирования не правильно кодирует во второй раз
Попробуй так:
C++
1
int b64byte[5] = {0};
1
 Аватар для Aleator
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
19.07.2012, 08:56  [ТС]
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Попробуй так:Код C++
1 int b64byte[5] = {0};
Не помогло.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.07.2012, 09:11
Цитата Сообщение от Aleator Посмотреть сообщение
По-моему, функция кодирования не правильно кодирует во второй раз (дописывает символы из логина). Проверял на онлайн-кодере.
так она действительно неверно кодирует или по-моему неверно??
вот верная функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//------------------------------------------------------------------------------
static const std::string base64_chars =
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";
 
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  std::string ret;
  int i = 0;
  int j = 0;
  unsigned char char_array_3[3];
  unsigned char char_array_4[4];
 
  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;
 
      for(i = 0; (i <4) ; i++)
        ret += base64_chars[char_array_4[i]];
      i = 0;
    }
  }
 
  if (i)
  {
    for(j = i; j < 3; j++)
      char_array_3[j] = '\0';
 
    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;
 
    for (j = 0; (j < i + 1); j++)
      ret += base64_chars[char_array_4[j]];
 
    while((i++ < 3))
      ret += '=';
 
  }
 
  return ret;
 
}
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
19.07.2012, 09:19
заметил ошибку: память не выделена для выходного буфера:
Цитата Сообщение от Aleator Посмотреть сообщение
unsigned char s[]="";
попробуй так:
C++
1
char *s = new char[command.Length()*4/3+1];
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
19.07.2012, 09:39
А не пробовали воспользоваться готовым велосипедом, например компонентом IdBase64Encoder ?
1
 Аватар для Aleator
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
19.07.2012, 10:52  [ТС]
Цитата Сообщение от kzru_hunter Посмотреть сообщение
попробуй так: Код C++
1 char *s = new char[command.Length()*4/3+1];
Попробывал, и добавил:
C++
1
2
for (int d=0;d<(command.Length()*4/3+1);d++)
                                        s[d]='\0';
.
Заработало!

Цитата Сообщение от mimicria Посмотреть сообщение
А не пробовали воспользоваться готовым велосипедом, например компонентом IdBase64Encoder ?
Спасибо за совет. Подскажите чайнику, возможно ли использование этого Indy-компонента, если IDSMTP-компонент я не использую?
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
19.07.2012, 11:13
Цитата Сообщение от Aleator Посмотреть сообщение
Подскажите чайнику, возможно ли использование этого Indy-компонента, если IDSMTP-компонент я не использую?
Как вариант:
C++
1
AnsiString Login="ЛОГИН"; AnsiString b64login=Base64Encode(Login);
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2012, 11:13
Помогаю со студенческими работами здесь

Авторизация на сервере
привет всем. никак не могу авторизироваться на сервере уже второй день. перепробовал кучу вариантов. вот код метода: public String...

Авторизация на сервере
Гуру, посоветуйте... Есть МОЙ сайт. На нем МОЯ система авторизации написанная с нуля (куки+сессии). Через браузеры работает. ...

Авторизация на сервере
Клиент-серверное приложение. Решили сделать на сервере авторизацию по логину-паролю. Мне не понятен сам механизм как это работает. Каков...

Авторизация на сервере
Здравствуйте. Возникла проблема с авторизацией на сервере. И так проблема. Есть сетевой адресс: \\10.87.10.10\\MyServer\\FolderWithFiles...

Авторизация на удалённом сервере
Я вот тут уже много нашел по своей проблеме, однако не всё... &lt;?php @ $file_http=fopen('http://www.docsearch.ru/index__php.html', 'r');...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru