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

Отправка письма текст которого ввести в консоли

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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2012, 20:05
Ответы с готовыми решениями:

Отправка письма php. Письма со скрипта на локальном сервере (Denwer) не приходят на почту.
Доброго Времени Суток!!! Я запускаю Денвером php скрипт со следующим кодом &lt;?php $name=$_GET; $email=$_GET; $tel=$_GET; ...

Отправка письма большому кол-ву адресатов в одном письма(код почему-то не верно работает)
Добрый вечер! Имеется готовый макрос для отправки файла, который перед этим выгружает в определенную папку файл.Подогнал всё под себя....

Ввести текст из файла, имя которого задано в командной строке, и вывести на экран
Ввести текст из файла, имя которого задано в командной строке и вывести на экран. Текст занимает весь экран (25х80) символов. Затем...

2
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,754
Записей в блоге: 9
24.08.2012, 10:36
переименуй ws или убери using namespace std;
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 18
27.08.2012, 23:48  [ТС]
Да! Я уже убрал using namespace std, все заработало?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2012, 23:48
Помогаю со студенческими работами здесь

Отправка письма
Можно ли сделать отправку письма на windows forms? Я пробовал искать,но мне выдает программы сделанные не в том что мне нужно

Отправка письма
2020 год: кофе и Visualbasic =) Проблема такова: Нужно отправить текст из TextBox1 на конкретную почту. В поиске готовых решений...

Отправка письма
Весь гугл перерыл, огромное количество примеров, но все не работает. Помогите пожалуйста разобраться, что не так? Есть у кого нибудь...

Отправка письма
Доброго времени суток. Пытаюсь отправить письмо с помощью idSMTP. Вот такая ошибка после коннекта. Вроде бы, попытка обращения к...

отправка письма
Знатоки, подскажите как можно сделать отправку данных из БД по почте, но не ввиде файла, как это делает sendObject, а ввиде обычного...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru