Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147

SMTP и POP3 протоколы

23.09.2014, 13:05. Показов 3726. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно было задание:
Написать приложение для ОС Windows, реализующие работу протоколов SMTP или POP3.
Вот они:
SMTP

C++ (Qt)
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <fstream>
#define PORT 25
#define SERVER_IP "78.139.197.64" // изменить на нужный
 
using namespace std;
 
class SMTP {
private:
    int OurSocket;
    SOCKADDR_IN anAddr;
    WSADATA WsaData;
 
    string lastMessage;
public:
    SMTP() {
        int err = WSAStartup (0x0101, &WsaData);
        if (err == SOCKET_ERROR)
            throw "WSAStartup() failed: " + GetLastError ();
 
        OurSocket = socket (AF_INET, SOCK_STREAM, 0);
        if (OurSocket < 0) 
            throw "Socket failed";
 
        anAddr.sin_family = AF_INET;
        anAddr.sin_port = htons(PORT);
        anAddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
 
        err = connect(OurSocket, (struct sockaddr*) &anAddr, sizeof(anAddr));
        if (err < 0) 
            throw "Connect failed";
 
        lastMessage = "";
    }
    ~SMTP() {
        closesocket(OurSocket);
    }
    //отправка
    void SendMessage(string str) {
        str += "\n";
        int snd = send(OurSocket, str.data(), str.length(), 0);
        if (snd < 0) 
            throw "Send failed";
        cout << str;
    }
    //чтение
    string RecvMessage(int size=256) {
        char *buf = new char[size];
        for (int i=0; i < size; i++) buf[i] = 0;
 
        int rcv = recv(OurSocket, buf, size, 0);
        if (rcv < 0) 
            throw "Receiv failed";
 
        lastMessage = buf;
        delete [] buf;
        if (size == 256)
            cout << lastMessage;
        return lastMessage;
    }
 
};
 
int main()
{
    try {
        SMTP smtp;
        string message = "from: [email]test94@sibmail.com[/email]\nto: [email]test95@sibmail.com[/email]\nsubject: HULLO\n\n9999 000000 3333 4444444\r\n.\r";
        cout << message;
 
        smtp.RecvMessage();
 
        smtp.SendMessage("EHLO 123bla");//EHLO говорит серверу о том, что нужно вывести список всех доступных расширений
 
        smtp.RecvMessage();
 
        smtp.SendMessage("AUTH LOGIN");//авторизация
        smtp.RecvMessage();
        //формат передачи данных текстовый, а передать необходимо бинарные данные
        smtp.SendMessage("ZXNjb2Jhcl9hbkBzaWJtYWlsLmNvbQ==");//логин base64 Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма 
        smtp.RecvMessage();
 
        smtp.SendMessage("MTMxMjE5OTI=");//пароль
        smtp.RecvMessage();
        
        smtp.SendMessage("MAIL FROM: <test94@sibmail.com>");//устанавливает обратный адрес . Это адрес для возвращённых писем.
        smtp.RecvMessage();
 
        smtp.SendMessage("RCPT TO: <test95@sibmail.com>"); // ввести логин и сервер ,устанавливает получателя данного сообщения.
        smtp.RecvMessage();
 
        smtp.SendMessage("DATA");// текст сообщения
        smtp.RecvMessage();
 
        smtp.SendMessage(message);
        smtp.RecvMessage();
 
        smtp.SendMessage("QUIT");
        smtp.RecvMessage();
    }
    catch(char *msg) {
        cout << "Error: " << msg << endl;
    }
 
    return 0;
}

Выдает странные ошибки, наподобие этой. Как исправить?
Миниатюры
SMTP и POP3 протоколы  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2014, 13:05
Ответы с готовыми решениями:

Работа с POP3 и SMTP
Написал код для отправки запроса POP3 и SMTP серверам SOCKET CEMailClientDlg::Connect(CString server_type) { SOCKET hSocket; ...

POP3, SMTP сокеты
Привет всем! Реализую отправку сообщений на mail.ru через: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

POP3, SMTP: добавить SSL
Доброго времени суток! Погуглил на самый посещаемый форум, зарегился в надежде, что тут помогут... :friends: Есть готовое приложение...

6
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
23.09.2014, 13:09  [ТС]
Тоже самое, если использовать другой протокол:
POP3

C++ (Qt)
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
#include "stdafx.h"
 
 
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <fstream>
#define PORT 110
#define SERVER_IP "78.139.197.64" // ввести ip и port
 
 
using namespace std;
 
class POP3 {
private:
    int OurSocket;
    SOCKADDR_IN anAddr;
    WSADATA WsaData;
 
    string lastMessage;//конец сообщения
    ofstream outFile;
public:
    POP3() {
        
        int err = WSAStartup (0x0101, &WsaData);
        if (err == SOCKET_ERROR)
            throw "WSAStartup() failed: " + GetLastError ();
 
        OurSocket = socket (AF_INET, SOCK_STREAM, 0);
        if (OurSocket < 0) 
            throw "Socket failed";
 
        anAddr.sin_family = AF_INET;
        anAddr.sin_port = htons(PORT);
        anAddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
 
        err = connect(OurSocket, (struct sockaddr*) &anAddr, sizeof(anAddr));
        if (err < 0) 
            throw "Connect failed";
 
        lastMessage = "";
        outFile.open("output.txt", ios::out);
    }
    ~POP3() {
        closesocket(OurSocket);
        outFile.close();
    }
    //отправка
    void SendMessage(string str) {
        str += "\n";
        int snd = send(OurSocket, str.data(), str.length(), 0);
        if (snd < 0) 
            throw "Send failed";
        cout << str;
    }
    //чтение
    string RecvMessage(int size=256) {
        char *buf = new char[size];
        for (int i=0; i < size; i++) buf[i] = 0;
 
        int rcv = recv(OurSocket, buf, size, 0);
        if (rcv < 0) 
            throw "Receiv failed";
 
        lastMessage = buf;// считываем до последнего символа,до .
        delete [] buf;
        if (size == 256)
            cout << lastMessage;
        return lastMessage;
    }
    //Функция GetMessage извлекает сообщение из очереди сообщений вызывающего потока и помещает его в заданную структуру. 
    //Эта функция  регулирует поступление отправленных сообщений до тех пор, пока помещенное в очередь сообщение доступно для извлечения.
    void GetMessageWith(string str)
    {
        SendMessage("STAT");
        string strlist = RecvMessage();
        if (strlist[0] == '+') {
            int n = 0;
            sscanf(strlist.data(), "%*s%d", &n);
            for (int i = 0; i < n; i++) { 
                int size = 0;
                char buf[128] = {};
                sprintf(buf, "%d", i+1);
                SendMessage("LIST "+(string)buf);
                string strlist = RecvMessage();
                sscanf(strlist.data(), "%*s%*d%d", &size);
                SendMessage("RETR "+(string)buf);// Сервер передаёт сообщение с указанным номером
                RecvMessage(17);
                string text = RecvMessage(size+38);
 
                int pos1 = text.find("\nSubject:");// находим подстроку в строке
                int pos2 = text.find("\n", pos1+1);
                string subj = text.substr(pos1+9, pos2-pos1-10);//возвращаем pos2-pos1-10 символов строки ,начиная с позиции pos1+9
                int posStr = subj.find(str);// возвращает индекс элемента, тоесть находим строку
                //if (posStr > 0) {
                    outFile << i+1 << " " << subj;
                    outFile << "\n\n---------------------------------------------------------\n\n";
                //}
            }
        }
    }
};
 
int main()
{
    try {
        POP3 pop;
 
        pop.RecvMessage();
 
        pop.SendMessage("USER [email]test94@sibmail.com[/email]"); // ввести логин
        pop.RecvMessage();
 
        pop.SendMessage("PASS test94"); // ввести пароль
        pop.RecvMessage();
 
        pop.GetMessageWith("HELLO Tester!");//приветствуем сервер
 
        pop.SendMessage("QUIT");//окончание процесса
        pop.RecvMessage();
    }
    catch(char *msg) {
        cout << "Error: " << msg << endl;
    }
 
    return 0;
}

Вроде бы все правильно, но выдает ошибку:
Ошибка 1 error C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Если даже и поставить sscans_s, то ошибка пойдет по "sprintf". И тут уже никак не исправишь ее. Получится, как в протоколе SMTP (по ошибкам).
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
23.09.2014, 16:03
Andrea13, чтобы побороть ошибку неразрешенных внешних символов - добавьте в дополнительные зависимости решения ws2_32.lib.
Миниатюры
SMTP и POP3 протоколы  
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
23.09.2014, 16:11
По поводу C4996, если не заморачиваться, то можно определить символ препроцессора _CRT_SECURE_NO_WARNINGS
http://stackoverflow.com/quest... ed-warning
но лучше использовать защищенные альтернативы функций
http://www.codeguru.com/cpp/se... ctions.htm
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
23.09.2014, 16:38  [ТС]
Помогло добавление ws2_32.lib.
Но при тестировании протокола SMTP, появилось сообщение:
Error: Connect failed
Что-то не хочет он коннектиться.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
23.09.2014, 17:10
Цитата Сообщение от Andrea13 Посмотреть сообщение
Но при тестировании протокола SMTP, появилось сообщение:
Error: Connect failed
Что-то не хочет он коннектиться.
Andrea13, судя по всему ваш код использует sibmail.com в качестве почтового сервера, и SERVER_IP 78.139.197.64 - указан явно. Но nslookup для sibmail.com возвращает:
Bash
1
2
3
4
Name:   sibmail.com
Address: 77.106.108.242
Name:   sibmail.com
Address: 77.106.108.226
Ну и простейший тест:
Bash
1
2
3
4
5
telnet sibmail.com 25
Trying 77.106.108.226...
Connected to sibmail.com.
Escape character is '^]'.
220 sibmail.com ESMTP Postfix
говорит нам, что он видимо переехал на этот IP.

ЗЫ: Ваш код не компилировал и не запускал.
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
23.09.2014, 18:45  [ТС]
Протестировать протокол SMPT удалось.
Возникли сложности с POP:
SQL
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
FROM: [email]test94@sibmail.com[/email]
TO: [email]test95@sibmail.com[/email]
subject: HULLO
 
9999 000000 3333 4444444
+OK Hello there.
EHLO 123bla
-ERR Invalid command.
AUTH LOGIN
+ VXNlcm5hbWU6
ZXNjb2Jhcl9hbkBzaWJtYWlsLmNvbQ==
+ UGFzc3dvcmQ6
MTMxMjE5OTI=
+OK logged IN.
MAIL FROM: <test94@sibmail.com>
-ERR Invalid command.
RCPT TO: <test95@sibmail.com>
-ERR Invalid command.
DATA
-ERR Invalid command.
FROM: [email]test94@sibmail.com[/email]
TO: [email]test95@sibmail.com[/email]
subject: HULLO
 
9999 000000 3333 4444444
.
-ERR Invalid command.
QUIT
-ERR Invalid command.
-ERR Invalid command.
-ERR Invalid command.
-ERR Invalid command.
-ERR Invalid command.
//Почему такие ошибки выдает? Отправить сообщение с одного на другой почтовый адрес - не удалось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2014, 18:45
Помогаю со студенческими работами здесь

Чудеса с подключением SMTP/POP3 mail.ru
Доброго времени суток, уважаемые форумчане! Пытаюсь написать почтовый клиент на основе протоколов SMTP и POP3. С smtp вроде как...

SSL/TLS в FTP, SMTP, POP3, IMAP
Здравствуйте! Помогите, пожалуйста, разобраться в следующем вопросе. Не получается понять логику, как создается шифрованное...

Протоколы,сокеты на с++
Если не сюда то перенаправьте.Ребят все привет,подскажите литературу написанную на понятном языке смертному по сетевым протоколам и...

Протоколы и пакеты
Всем привет! Правильно ли я понимаю следующие понятия: Протокол в IT можно описать как некий &quot;стандарт&quot;? Т.е. когда речь идет о...

Протоколы IMAP и POP3
В чем разница между протоколами IMAP и POP3? Какой лучше использовать в Outlook?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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