Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8

Почтовый клиент pop.mail.ru

23.01.2013, 19:22. Показов 3382. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пытаюсь написать небольшой консольный почтовый клиент для mail.ru, но возникла сложность. После успешной авторизации не получается послать команды протокола (STAT, LIST, RETR и т.д.). Никак не могу понять почему
Натолкните пожалуйста на мысль.

Код:
Кликните здесь для просмотра всего текста
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "stdafx.h" 
#include <stdio.h>
#include <WinSock2.h>
#include <string>
#include <fstream>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wsock32.lib")
//Prototypen
int startWinsock(void);
 
int _tmain(int argc, _TCHAR* argv[])
{
    char buf[256];
    long rc;
    SOCKET s;
    SOCKADDR_IN addr;
  rc=startWinsock();
  if(rc!=0)
  {
    printf("ERROR: startWinsock, fehler code: %d\n",rc); // failed
  }
  else
  {
    printf("Winsock gestartet!\n");
  }
  s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
  printf("ERROR: Der Socket konnte nicht erstellt werden, fehler code:%d\n",WSAGetLastError()); // Failed
  return 1;
}
else
{
  printf("Socket erstellt!\n");
}
 
    LPHOSTENT lpHostEntry;
    lpHostEntry = gethostbyname("pop.mail.ru");
    if(!lpHostEntry)
    {
        printf("Finding mail server");
    }
 memset(&addr,0,sizeof(SOCKADDR_IN)); 
addr.sin_family=AF_INET;
addr.sin_port=htons(110); 
addr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
 
if(rc==SOCKET_ERROR)
{
  printf("ERROR: connect gescheitert, fehler code:%d\n",WSAGetLastError()); // failed
}
else
{
  printf("Connect to mail: +OK\n");
}
std::cout<<std::endl;
ZeroMemory(buf,256);
recv(s,buf,sizeof(buf),0);
std::cout << buf<< std::endl;
/*
strcpy(buf, "auth\r\n");
send(s,buf,strlen(buf),0);
std::cout << buf;
ZeroMemory(buf,256);
int Data=recv(s,buf,256,0);
std::cout << buf;*/
 
strcpy(buf, "user ********\r\n");
send(s,buf,strlen(buf),0);
std::cout << buf;
ZeroMemory(buf,256);
recv(s,buf,sizeof(buf),0);
std::cout << buf<< std::endl;
strcpy(buf, "pass ********\r\n");
send(s,buf,sizeof(buf),0);
std::cout << buf;
ZeroMemory(buf,256);
recv(s,buf,sizeof(buf),0);
std::cout << buf<< std::endl;
 
ZeroMemory(buf,256);
strncpy_s(buf,256, "stat\r\n",6);
send(s, buf, 256, 0);
std::cout<<buf;
ZeroMemory(buf,256);
recv(s, buf, 256, 0);
std::cout<<buf<<"\n\n";
 
//if(nData==0 || nData == SOCKET_ERROR) std::cout<<"Recv Error"<<endl;
 
closesocket(s);
WSACleanup();
system("pause");
return 0;
}
 
int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(1,1),&wsa);
}


P.S. Пишу на Microsoft Visual Studio 2010
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2013, 19:22
Ответы с готовыми решениями:

Почтовый клиент отказывается работать с mail.ru
помогите пожалуйста, программа-имейл клиент, но почему она работает только с mail.open.by почтой, а например с mail.ru или другими...

Почтовый клиент
Всем привет. Надо сделать курсач, тема: почтовый клиент. Не знаю с чего начать. Посоветуйте с содержанием. Сам почтовый клиент писать...

Почтовый клиент
Всем доброго дня. Преподаватель дал задание написать свой почтовый клиент, который бы через протоколы POP3 и SMTP принимал и отправлял...

14
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.01.2013, 09:04
Цитата Сообщение от Sollin Посмотреть сообщение
не получается послать
а как не получается? в провод не пролазиют?
1
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8
24.01.2013, 21:15  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
а как не получается? в провод не пролазиют?
Сервер на любую из команд отвечает: -ERR Unknown comand: ""
Может я неправильно их посылаю?
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.01.2013, 22:36
на любую после успешной авторизации? на авторизацию OK?
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8
24.01.2013, 23:08  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
на любую после успешной авторизации? на авторизацию OK?
Да, авторизация проходит успешно. А дальше ни одна команда не работат. Код же выложил
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
24.01.2013, 23:36
POP3 - текстовый протокол, поэтому читать ответы сервера построчно, т.е. до символов <CR><LF> (см recv_line()), основное действие происходит в функции pop3_auth_and_stat()

PS: нужно ввести имя и пароль пользователя в строках 8 и 9 соответственно.

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// ///////////////////////////////////////////////////////////////////////// //
 
static const char * username = "BENUTZERNAMEN_HIER";
static const char * password = "IHR_PASSWORTH_HIER";
 
// ///////////////////////////////////////////////////////////////////////// //
 
int write_line(SOCKET s, char * line) {
    int total = strlen(line);
    int iret = 0;
 
    printf("Sendung: %s", line);
 
    while (total > 0) {
        iret = send(s, line, total, 0);
        if (iret <= 0) {
            // etwas Unangenehmes passiert
            return iret;
        }
        total -= iret;
    }
 
    return total;
}
 
// ///////////////////////////////////////////////////////////////////////// //
 
int recv_line(SOCKET s, char * line, unsigned max) {
    int total = 0;
    int iret = 0;
 
    for (;;) {
        iret = recv(s, line + total, max - total, 0);
        if (iret <= 0) {
            // etwas Unangenehmes passiert
            return iret;
        }
 
        total += iret;
 
        if (total > 2 && line[total - 2] == '\r' && line[total - 1] == '\n') {
            break;
        }
    }
 
    line[total] = '\0';
    
    printf("Akzeptieren: %s", line);
 
    return total;
}
 
// ///////////////////////////////////////////////////////////////////////// //
 
int pop3_auth_and_stat(SOCKET s, const char * uname, const char * pass) {
    char buffer[256];
 
    int iret = 0;
 
    iret = recv_line(s, buffer, sizeof(buffer));
 
    // TODO: check rückgabecodes bei bedarf!!!
 
    wsprintf(buffer, "user %s\r\n", uname);
    iret = write_line(s, buffer);
    iret = recv_line(s, buffer, sizeof(buffer));
 
    wsprintf(buffer, "pass %s\r\n", pass);
    iret = write_line(s, buffer);
    iret = recv_line(s, buffer, sizeof(buffer));
 
    iret = write_line(s, "stat\r\n");
    iret = recv_line(s, buffer, sizeof(buffer));
 
    iret = write_line(s, "quit\r\n");
    iret = recv_line(s, buffer, sizeof(buffer));
 
    return iret;
}
 
// ///////////////////////////////////////////////////////////////////////// //
 
int main() {
    SOCKET s;
    SOCKADDR_IN addr;
    WSADATA wsa;
 
    int iret = WSAStartup(MAKEWORD(1,1),&wsa);
    if (iret != 0) {
        printf("IRRUNG: startWinsock, fehler code: %d\n", iret);
        return 1;
    }
    
    printf("Winsock gestartet!\n");
 
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s == INVALID_SOCKET) {
        printf("IRRUNG: Der Socket konnte nicht erstellt werden, fehler code:%d\n",
            WSAGetLastError()); // Failed
        return 1;
    }
    
    printf("Socket erstellt!\n");
 
    LPHOSTENT lpHostEntry;
    lpHostEntry = gethostbyname("pop.mail.ru");
 
    if (!lpHostEntry) {
        printf("Finding mail server");
        return 1;
    }
    
    memset(&addr, 0, sizeof(SOCKADDR_IN));
    
    addr.sin_family = AF_INET;
    addr.sin_port   = htons(110); 
    addr.sin_addr   = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
 
    iret = connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
    if (iret == SOCKET_ERROR) {
        printf("IRRUNG: verbindung gescheitert, fehler code:%d\n",
            WSAGetLastError()); // failed
        return 1;
    }
 
    printf("verbindung zum Mail-Server!\n");
 
    pop3_auth_and_stat(s, username, password);
    
    closesocket(s);
    WSACleanup();
    system("pause");
 
    return 0;
}
 
// ///////////////////////////////////////////////////////////////////////// //
2
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
25.01.2013, 09:40
крутиться. правда у меня сервер еще хочет APOP судя по всему так как не хочет авторизовать

Добавлено через 28 секунд
Цитата Сообщение от Sollin Посмотреть сообщение
А дальше ни одна команда не работат
а что пишет сервер в ответе?
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8
25.01.2013, 17:02  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
POP3 - текстовый протокол, поэтому читать ответы сервера построчно, т.е. до символов <CR><LF> (см recv_line()), основное действие происходит в функции pop3_auth_and_stat()

PS: нужно ввести имя и пароль пользователя в строках 8 и 9 соответственно.
Пишет ошибку
C++ (Qt)
1
2
error C2664: wsprintfW: невозможно преобразовать параметр 1 из "char [256]" в "LPWSTR"
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Как оно преобразовывается?

Цитата Сообщение от vxg Посмотреть сообщение
а что пишет сервер в ответе?
При попытке послать любую команду сервер отвечает -ERR Unknown command: “”
Будто команды не доходят до него
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
25.01.2013, 17:10
Цитата Сообщение от Sollin Посмотреть сообщение
Как оно преобразовывается?
например так

C++
1
2
3
char buf[256];
 
SomeFunction((LPWSTR)buf);
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8
25.01.2013, 17:19  [ТС]
Цитата Сообщение от Pure Посмотреть сообщение
например так

C++
1
2
3
char buf[256];
 
SomeFunction((LPWSTR)buf);
А функцию где найти?
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
25.01.2013, 17:26
Цитата Сообщение от Sollin Посмотреть сообщение
А функцию где найти?
да ентож просто пример. часто в винапишные функции надо подать требуемые типы их можно привести
так
C++
1
(LPWSTR)buf
А функция любая может быть, какой нить SetWindowText и прочие просящие на вход виндузевые типы вместо C++
1
20 / 20 / 3
Регистрация: 25.05.2011
Сообщений: 62
25.01.2013, 17:28
Кликните здесь для просмотра всего текста
Вас интересует только
C++
1
(LPWSTR)buf)
эта запись и вызовет приведение в стиле C, о котором вас попросил компилятор. функция-то у вас уже есть wsprintf этот ваш..
1
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 8
25.01.2013, 18:16  [ТС]
Спасибо всем большое!
Всё разъяснили, теперь кажется работает.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
25.01.2013, 23:58
Цитата Сообщение от Sollin Посмотреть сообщение
error C2664: wsprintfW: невозможно преобразовать параметр 1 из "char [256]" в "LPWSTR"
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
*Как оно преобразовывается?
Sollin, почитайте внимательно любой документ по строкам в С, например вот этот. У вас видимо в проекте используются UNICODE строки по умолчанию, а у меня в исходнике используются ANSI строки.

Цитата Сообщение от Pure Посмотреть сообщение
например так
C++
1
2
char buf[256];
SomeFunction((LPWSTR)buf);
Pure, имхо не самый удачный пример, т.к. если функция требует wide char (LPWSTR или wchar_t) строку, то "подсовывать" ей вместо этого char строку, усыпляя бдительность компилятора кастом - не самая лучшая практика.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.01.2013, 02:17
Цитата Сообщение от Pure Посмотреть сообщение
(LPWSTR)buf
А функция любая может быть, какой нить SetWindowText и прочие просящие на вход виндузевые типы вместо C++
Не есть хорошо...
Если юзаешь char то используй SetWindowTextA(); если wchar_t то SetWindowTextW()
SetWindowText() зависит от определения макроса UNICODE

Каст типов - стрЁмый момент кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2013, 02:17
Помогаю со студенческими работами здесь

Просто почтовый клиент
Здравствуйте! Я только учусь, поэтому, пожалуйста, говорите как с тупым. В чём суть: необходимо написать простой почтовый клиент, используя...

Простейший почтовый клиент POP3 на С++
Уважаемый форумчане, мне нужна программа, которая выдает количество писем на почтовом ящике с помощью протокола POP3. Другими словами,...

Необходим почтовый клиент для получения и отправки почты
Всем доброго времени суток! Необходим почтовый клиент для получения и отправки почты на различные адреса, я понимаю что эту тему уже...

Клиент-Серверное приложение. Как сделать, чтобы сервер сам отправлял сообщения на клиент
Добрый день всем. Проблема заключается в следующем: Есть клиент-серверное приложение, хочу реализовать своего рода защиту, чтобы при...

Почтовый клиент для mail.ru.Кодировка строк
Здравствуйте! Написание потового клиента.POP3. Получаю с сервера письмо анализирую его кодировку и перекодирую его в соответствии с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru