Отправка письма текст которого ввести в консоли
23.08.2012, 20:05. Показов 2485. Ответов 2
Пишу на C++. Версия компилятора 2.95.2 19991024.
Пытаюсь написать программу для отправки сообщений на yandex.ru
Вопрос в том, чтобы ввести строку в консоли - занести её в char* - затем занести её в текст письма strcpy. Для упрощения задачи программа разделена на основную для отправки и конвертация.
Программа переводящая введенную строку в консоли в char* дальше она я так понимаю находится в буфере. Эта часть работает.
| Code | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| #include <conio.h> //библиотека, необходимая для работы оператора getch() и printf()
#include <string> //библиотека, необходимая для работы объекта string и cin
using namespace std;
int main ()
{
char * cstr;
string str;
cin >> str;
cstr = new char [str.size()+1];
strcpy (cstr, str.c_str());
printf("strcpy - %s", cstr);
delete[] cstr;
printf("\n");
printf("Press any key\n");
getch(); //команда задержки экрана
return 0;
} |
|
Далее основная программа, для отправки писем. Эта часть тоже работает.
| Code | 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
144
145
146
147
148
149
| #include <conio.h> //библиотека, необходимая для работы оператора getch()
#include <stdio.h>
#include <windows.h>
#include <winsock.h> //подключение готовых библиотек типа winsock, с ф-ми для отправления и приема сообщений по сети
WSADATA ws; //интерфейс между приложением и транспортным протоколом
SOCKET s; //объявляем дескриптор, который может получать или отправлять данные
struct sockaddr_in addr; //объявим переменную для хранения адреса
hostent *d_addr; //структура, в которую будет помещен IP адрес, при возврате
char text[1024];
int main()
{
//инициализируем сокеты
if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) //инициализируем сокеты
{
printf("Error in WSAStartup(...)\n");
return 1;
}
//создаем сокет
s = socket (AF_INET, //протокол (TCP/IP, IPX...)
SOCK_STREAM, //тип сокета (SOCK_STREAM/SOCK_DGRAM)
0 //для Windows приложений может быть 0
);
if (s == INVALID_SOCKET)
{
//сообщение с номером ошибки
printf("Error in socket(...)\n");
return 1;
}
//получаем адрес сервера
d_addr = gethostbyname ("smtp.yandex.ru"); //d_addr = gethostbyname ("smtp.mail.ru");++++++++
if (d_addr==NULL)
{
printf("Error in gethostbyname(...)\n");
return 1;
};
//заполняем параметры адреса
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
addr.sin_port = htons (25);
//устанавливаем соединение
if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr,
sizeof (addr))))
{
printf("Error in connect(...)\n");
return 1;
}
//ждем ответ от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//приветствуем сервер
strcpy(text,"EHLO smtp.yandex.ru\r\n"); //strcpy(text,"HELO smtp.mail.ru\r\n");++++++++++++++
send(s,text,strlen(text),0); //int send(_in SOCKET s,_in const char *buf,_in int len,_in int flags);
printf("send - %s", text);
strcpy(text,"AUTH LOGIN\r\n"); //const char* - это константная строка, то есть та, которую изменить нельзя в принципе, например если в функции в ка-ве параметра стоит const char*, то можно ей передать не переменную, а её значение, например:strcpy(str,"test");strcpy - функция для копирования строки. в строку char* str копируется константная строка "test"
send(s,text,strlen(text),0);
strcpy(text,"вставляю свой логин в base64\r\n");//здесь логин в base64 кодировке
send(s,text,strlen(text),0);
strcpy(text,"вставляю свой пароль в base64\r\n");//здесь пароль в base64 кодировке
send(s,text,strlen(text),0);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//начинаем отправлять конверт состоящий из полей
//MAIL FROM: и RCPT TO: После каждого поля ждем
//подтверждение
//сообщаем отправителя
strcpy(text,"MAIL FROM: указываю адрес отправителя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//сообщаем получателя
strcpy(text, "RCPT TO: указываю адрес получателя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//подаем команду, что готовы начать передачу письма
strcpy(text,"DATA\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//передаем заголовок
//от кого письмо
strcpy(text,"FROM: указываю адрес отправителя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//кому письмо
strcpy(text,"TO: указываю адрес получателя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//тема письма
strcpy(text,"SUBJECT: test\r\n\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//текст письма
strcpy(text,"text, текст\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//говорим, что закончили
strcpy(text,"\r\n.\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//прощаемся с сервером
strcpy(text,"QUIT");
send(s,text,strlen(text),0);
printf("send - %s", text);
//закрываем сокет
closesocket(s);
printf("\n");
printf("Press any key\n");
getch(); //команда задержки экрана
return 0;
} |
|
Это их объединение, где возникает ошибка
| Code | 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
| #include <conio.h> //библиотека, необходимая для работы оператора getch() и printf()
#include <stdio.h>
#include <windows.h>
#include <winsock.h> //подключение готовых библиотек типа winsock, с ф-ми для отправления и приема сообщений по сети
#include <string> //библиотека, необходимая для работы объекта string и cin
WSADATA ws; //интерфейс между приложением и транспортным протоколом
SOCKET s; //объявляем дескриптор, который может получать или отправлять данные
struct sockaddr_in addr; //объявим переменную для хранения адреса
hostent *d_addr; //структура, в которую будет помещен IP адрес, при возврате
char text[1024];
using namespace std;
int main()
{
char * cstr;
string str;
//инициализируем сокеты
if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) //инициализируем сокеты
{
printf("Error in WSAStartup(...)\n");
return 1;
}
//создаем сокет
s = socket (AF_INET, //протокол (TCP/IP, IPX...)
SOCK_STREAM, //тип сокета (SOCK_STREAM/SOCK_DGRAM)
0 //для Windows приложений может быть 0
);
if (s == INVALID_SOCKET)
{
//сообщение с номером ошибки
printf("Error in socket(...)\n");
return 1;
}
//получаем адрес сервера
d_addr = gethostbyname ("smtp.yandex.ru");
if (d_addr==NULL)
{
printf("Error in gethostbyname(...)\n");
return 1;
};
//заполняем параметры адреса
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
addr.sin_port = htons (25);
//устанавливаем соединение
if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr,
sizeof (addr))))
{
printf("Error in connect(...)\n");
return 1;
}
//ждем ответ от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//приветствуем сервер
strcpy(text,"EHLO smtp.yandex.ru\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
strcpy(text,"AUTH LOGIN\r\n");
send(s,text,strlen(text),0);
strcpy(text,"вставляю свой логин в base64\r\n");//здесь логин в base64 кодировке
send(s,text,strlen(text),0);
strcpy(text,"вставляю свой пароль в base64\r\n");//здесь пароль в base64 кодировке
send(s,text,strlen(text),0);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//начинаем отправлять конверт состоящий из полей
//MAIL FROM: и RCPT TO: После каждого поля ждем
//подтверждение
//сообщаем отправителя
strcpy(text,"MAIL FROM: указываю адрес отправителя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//сообщаем получателя
strcpy(text, "RCPT TO: указываю адрес получателя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//подаем команду, что готовы начать передачу письма
strcpy(text,"DATA\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//передаем заголовок
//от кого письмо
strcpy(text,"FROM: указываю адрес отправителя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//кому письмо
strcpy(text,"TO: указываю адрес получателя\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
//тема письма
strcpy(text,"SUBJECT: test\r\n\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
cin >> str; //ввожу текст письма
cstr = new char [str.size()+1]; //заполняю буфер текстом письма
//текст письма
strcpy(cstr, str.c_str()); //отправляю текст письма, здесь нужно подставить значение со строковой переменной!!!
strcat(cstr,"\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
delete[] cstr;
//говорим, что закончили
strcpy(text,"\r\n.\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
//прощаемся с сервером
strcpy(text,"QUIT");
send(s,text,strlen(text),0);
printf("send - %s", text);
//закрываем сокет
closesocket(s);
printf("\n");
printf("Press any key\n");
getch(); //команда задержки экрана
return 0;
} |
|
Ошибка выглядит следующим образом:
g++.exe -x c++ -c D:\CREATE~1\C__~1\MAIL~1.CPP -o D:\CREATE~1\C__~1\MAIL~1.o -Wall -fpermissive
D:\CREATE~1\C__~1\MAIL~1.CPP:7: `struct WSADATA ws' redeclared as different kind of symbol
..\lib\gcc-lib\i386-mingw32\2.95.2\..\..\..\..\include\iostr eam.h:39: previous declaration of `class istream & ws(istream &)'
Failure
Как я понял ошибка связана с пространством имен, пересекаются имена?
0
|