Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 20
1

Отправка письма с вложением: что в коде подкорректировать и чем скомпилировать

21.01.2014, 04:50. Показов 2138. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Assembler
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
      ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
      ; Sending mail with attach in FASM
      ;         Created by Ct757
      ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
      ;
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; Здесь я хочу показать, как можно отправить письмо с вложением
      ; напрямую через SMTP-сервер (в данном случае smtp.mail.ru)
      ; В принципе, команды те же, что и при посылке обычного письма,
      ; разница только в том, что аттач нужно закодировать по алгоритму
      ; base64, а так же указать некоторые дополнительные пункты в заголовке письма
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
      format PE GUI 4.0
      entry start
       
    include 'include\win32a.inc'
       
      section '.code' code readable writeable executable
       
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; Я не буду в подробностях объяснять SMTP-команды, если вы их не знаете смотрите RFC
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
    smtp_server  db '194.67.23.111',0         ; IP-адрес smtp.mail.ru
       
    helo_0       db 'HELO 0',13,10            ; Команда helo
    helo_0_sz    = $ - helo_0             ;
       
    mail_fr      db 'MAIL FROM: [email]mail@mail.ru[/email]',13,10        ; От кого письмо
    mail_fr_sz   = $ - mail_fr            ;
       
    rcpt_to      db 'RCPT TO: [email]mail@mail.ru[/email]',13,10     ; Кому отправлять
    rcpt_to_sz   = $ - rcpt_to            ;
       
    data_        db 'DATA',13,10              ; Команда data
    data_sz      = $ - data_              ;
       
       
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; Заголовок и текст письма
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
    message      db 'From: Bill Gates <mail@mail.ru>',13,10,\         ; От кого
        'Subject: Test MESSAGE',13,10,\           ; Тема
        'To: TEST <mail@mail.ru>',13,10,\            ; Кому
        'MIME-Version: 1.0',13,10,\           ; Версия MIME
        'Content-Type: multipart/mixed;',13,10,\          ; Тип содержимого
        ' boundary="--ct757"',13,10,13,10,\           ; Разделитель
        '----ct757',13,10,\
        'Content-Type: text/plain; charset=Windows-1251',13,10,\      ; Содержимое: текст,
        'Content-Transfer-Encoding: 8bit',13,10,13,10,\       ; кодировка Win-1251
        'pass',13,10,13,10,\  ; Текст письма
        '----ct757',13,10,\
        'Content-Type: application/octet-stream; name="txt.txt"',13,10,\ ; Содержимое: вложение
        'Content-Disposition: attachment; filename="txt.txt"',13,10,\    ; имя файла - test.rar
        'Content-Transfer-Encoding: base64',13,10,13,10       ; Поясняем, что закодировано
                          ; с помощью base64
       
    message_sz   = $ - message                ; Размер письма вместе с
                          ; заголовком (без вложения!)
       
       
    file_name    db 'txt.txt',0            ; Файл, который нужно отправить
       
    sock         dd 0                 ; Дескриптор сокета
    file_h       dd 0                 ; Дескриптор файла
    map_h        dd 0                 ; Дескриптор мэппинга
    map_addr     dd 0                     ; Адрес мэппинга
    al_mem       dd 0                 ; Адрес памяти в куче
       
    buf_sz       = 100h                   ; Размер буффера
    buf      rb buf_sz                    ; Буффер для recv
       
    WSA      WSADATA                      ; Необходимые
    sin      sockaddr_in                  ; структуры
       
       
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; base64 encoder without dictionary by RT Fishel
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ;
      ; ebp = length, esi -> src buffer, edi -> dst buffer
       
    b64:
      .newline:
        call     b64.store_crlf
       
      .encode:
        push     (76 shr 2)+1
        pop      edx
       
      .outer:
        dec      edx
        je       b64.newline
        lodsd
        dec      esi
        inc      ebp
        bswap    eax
        mov      ecx,4
       
      .inner:
        rol      eax,6
        and      al,3Fh
        cmp      al,3Eh
        jb       b64.testchar
        shl      al,2
        sub      al,((3Eh shl 2)+'A'-'+') and 0FFh
       
      .testchar:
        sub      al,4
        cmp      al,'0'
        jnl      b64.store
        add      al,'A'+4
        cmp      al,'Z'
        jbe      b64.store
        add      al,'a'-'Z'-1
       
      .store:
        stosb
        dec      ebp
        loopne   b64.inner
        jne      b64.outer
        mov      al,'='
        rep      stosb
        ret
       
      .store_crlf:
        mov      ax,0A0Dh
        stosw
        ret
       
       
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; Процедура чтения в буффер из сокета
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
    read_buf:
        invoke   recv,[sock],buf,buf_sz,esi
        ret
       
       
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ; Начало основной программы
      ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
    start:
        xor      esi,esi
       
        invoke   CreateFile,file_name,GENERIC_WRITE or GENERIC_READ,\     ; Откроем нужный
           esi,esi,OPEN_EXISTING,esi,esi              ; нам файл
        inc      eax                  ; Выходим в
        je       exit                 ; случае ошибки
        dec      eax                  ; Если всё ок,
        mov      [file_h],eax             ; сохраним его хэндл
       
        invoke   GetFileSize,eax,esi              ; Узнаем размер файла
        mov      ebx,eax                  ; Сохраним его в ebx
        rol      eax,1                ; Умножим размер на два
                          ; (на всякий случай, т.к.
                          ; размер закодированного
                          ; в base64 файла всегда больше)
        add      eax,message_sz               ; Прибавим к получившемуся
                          ; результату размер уже
                          ; имеющегося письма
       
        invoke   LocalAlloc,LMEM_FIXED,eax            ; Выделим место в куче
        test     eax,eax                  ; Если ошибка -
        je       exit                 ; выходим, иначе
        mov      [al_mem],eax             ; сохраним адрес
       
        mov      edi,eax                  ; Переместим в кучу
        mov      esi,message              ; подготовленный
        mov      ecx,message_sz               ; заголовок и текст
        rep      movsb                ; письма
       
        xor      esi,esi
       
        invoke   CreateFileMapping,[file_h],esi,PAGE_READWRITE,esi,ebx,esi    ; Создадим file mapping
        test     eax,eax                  ; Выходим в
        je       clean_exit3              ; случае ошибки
        mov      [map_h],eax              ; Если всё ok, сохраним хэндл
       
        invoke   MapViewOfFile,eax,2,esi,esi,esi              ; Спроецируем файл в память
        test     eax,eax                  ; Выходим в
        je       clean_exit2              ; случае ошибки
        mov      [map_addr],eax               ; Если всё ok,
                          ; сохраним адрес мэппинга
       
        mov      esi,eax                  ; Укажем, откуда
                          ; брать данные
        mov      ebp,ebx                  ; Укажем размер данных
        call     b64.encode               ; Кодируем в base64
       
        mov      ax,0A0Dh                 ; Добавим к
        stosw                 ; получившемуся
        mov      ax,0A0Dh                 ; письму
        stosw                 ; CRLF
        mov      al,'.'               ; .
        stosb                 ; CRLF
        mov      ax,0A0Dh                 ;
        stosw                 ;
       
        mov      eax,edi                  ; Вычислим размер
        sub      eax,[al_mem]             ; получившегося письма,
        mov      ebx,eax                  ; и сохраним его в ebx
       
        xor      esi,esi
       
        invoke   WSAStartup,101h,WSA              ; Инициализируем winsock
        test     eax,eax                  ; Выходим в
        jne      clean_exit1              ; случае ошибки
       
        invoke   socket,AF_INET,SOCK_STREAM,0         ; Создаем сокет
        inc      eax                  ; Выходим
        je       clean_exit               ; если
        dec      eax                  ; ошибка
        mov      [sock],eax               ; Если ok - сохраним
                          ; его дескриптор
       
        push     smtp_server              ; Преобразуем адрес
        call     [inet_addr]              ; сервера
       
        mov      [sin.sin_family],AF_INET             ; Заполним структуру
        mov      [sin.sin_port],1900h             ; sockaddr_in
        mov      [sin.sin_addr],eax               ;
       
        invoke   connect,[sock],sin,10h           ; Коннектимся к серверу
        inc      eax                  ; Если ошибка
        je       shtdown                  ; выходим
       
        call     read_buf                 ; Получим и
        inc      eax                  ; проверим
        je       shtdown                  ; ответ сервера
        cmp      dword [buf],'220 '               ;
        jne      shtdown                  ;
       
        invoke   send,[sock],helo_0,helo_0_sz,esi             ; Пошлем приветствие
        inc      eax                  ; Выход,
        je       shtdown                  ; если ошибка
       
        call     read_buf                 ; Проверим ответ сервера
        inc      eax
        je       shtdown
        cmp      dword [buf],'250 '
        jne      shtdown
       
        invoke   send,[sock],mail_fr,mail_fr_sz,esi           ; MAIL FROM
        inc      eax
        je       shtdown
       
        call     read_buf
        inc      eax
        je       shtdown
        cmp      dword [buf],'250 '
        jne      shtdown
       
        invoke   send,[sock],rcpt_to,rcpt_to_sz,esi           ; RCPT TO
        inc      eax
        je       shtdown
       
        call     read_buf
        inc      eax
        je       shtdown
        cmp      dword [buf],'250 '
        jne      shtdown
       
        invoke   send,[sock],data_,data_sz,esi            ; DATA
        inc      eax
        je       shtdown
       
        call     read_buf
        inc      eax
        je       shtdown
        cmp      dword [buf],'354 '
        jne      shtdown
       
        invoke   send,[sock],[al_mem],ebx,esi         ; Посылаем письмо
        inc      eax
        je       shtdown
       
        call     read_buf
       
    shtdown:
        invoke   shutdown,[sock],esi              ; Разрываем соединение
        invoke   closesocket,[sock]               ; и закрываем сокет
       
    clean_exit:
        invoke   WSACleanup
       
    clean_exit1:
        invoke   UnmapViewOfFile,[map_addr]           ; Выгрузим файл из памяти
       
    clean_exit2:
        invoke   CloseHandle,[map_h]              ; Закроем хэндл мэппинга
       
    clean_exit3:
        invoke   LocalFree,[al_mem]               ; Освободим память в куче
        invoke   CloseHandle,[file_h]             ; Закроем файл
       
    exit:
        invoke   ExitProcess,esi                  ; Выходим из программы
       
       
      data import                 ; Import table
       
    library kernel32,'KERNEL32.DLL',\
        wsock32,'WSOCK32.DLL'
       
    include 'INCLUDE\API\kernel32.inc'
    include 'INCLUDE\API\wsock32.inc'
       
      end data
Вот такой код нашел в интернете, подскажите чем компилировать и куда пароль от почты воткнуть? Я так понимаю он тут где-то нужен, но не вижу... (качал fasm 1.7, компилировал код с заполненными полями, не работает но компилирует)
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2014, 04:50
Ответы с готовыми решениями:

Отправка письма с вложением
Всем привет! Собрал из кусков код для отправки письма через mail с вложением файла. Текст письма...

Отправка письма с вложением
Всем добрый день. Не могу прикрепить файл к письму ...

Отправка письма с вложением
Я знаю, что ума тем есть, но не 1 пример не работает... При коде: MailMessage message; ...

Отправка письма с вложением
Здравтсвуйте! У меня такая функция: Function sentMail($from, $to, $subject, $body) { global...

16
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
21.01.2014, 04:55 2
Цитата Сообщение от Googie Посмотреть сообщение
подскажите чем компилировать
внимательно смотрим текст программы и видим
Assembler
1
; Sending mail with attach in FASM
синтаксис, заголовок, секция импорта говорят о том, что это компилятор FASM
0
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 20
21.01.2014, 07:34  [ТС] 3
Благодарю за очевидную подсказку, но не могли бы вы прошвырнуться по дебрям кода и обозначить в чем ошибка/недоработка исходника сего?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
21.01.2014, 08:20 4
Цитата Сообщение от Googie Посмотреть сообщение
не могли бы вы прошвырнуться по дебрям кода и обозначить в чем ошибка/недоработка исходника
а почему ты решил, что исходник с ошибкой/недоработкой? И в чем ошибка/недоработка заключается?
0
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 20
21.01.2014, 08:32  [ТС] 5
в том что после компиляции файл не приходит
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
21.01.2014, 08:39 6
Googie,
а что приходит вместо файла? Компилятор выдает тип ошибки и номер строки на которой эта ошибка обнаружена, исправляешь ошибку и снова запускаешь компиляцию до тех пор пока "файл не придёт". И почему перешел с Дельфи на ассемблер? Создать почтовый сервис на дельфине на много проще и быстрее
0
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 20
21.01.2014, 08:42  [ТС] 7
ошибок никаких, приходит ничего, то есть ничего не отправляет. ни письма, ни тем более вложения к нему
0
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
21.01.2014, 12:36 8
Googie,
Цитата Сообщение от Googie Посмотреть сообщение
ошибок никаких, приходит ничего, то есть ничего не отправляет. ни письма, ни тем более вложения к нему
У меня затык на
Assembler
1
invoke   connect,[sock],sin,10h           ; Коннектимся к серверу
приходит ошибка SOCKET_ERROR и прога ломится на выход.
Теперь по интернету знакомлюсь с темой. Если найдёшь решение не пропадай, дай знать, мне тоже актуально.
1
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
21.01.2014, 13:08 9
Цитата Сообщение от Googie Посмотреть сообщение
куда пароль от почты воткнуть? Я так понимаю он тут где-то нужен, но не вижу...
Никуда не воткнуть. Пароль тут не нужен и его нет. Твоя программа отдает письмо SMTP-серверу для ретрансляции. По протоколу SMTP отдает. К чему тут пароль ? От чего пароль ?

Добавлено через 19 минут
Цитата Сообщение от Googie Посмотреть сообщение
ошибок никаких, приходит ничего, то есть ничего не отправляет. ни письма, ни тем более вложения к нему
Набери в командной строке
telnet 194.67.23.111 25
если нет соединения, то ничего твоя программа не отправит.

Если есть соединение, то для проверки вручную из TELNET-а отправь письмо. Там всего 4 команды нужно :
MAIL FROM: адрес_отправителя
RCPT TO: адрес_получателя
DATA
текст письма
. <- одинокая точка в начале строки как признак конца текста
QUIT
А потом посмотри пришло ли письмо куда отправлял или нет.
2
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
21.01.2014, 13:11 10
Ethereal,говорит что знать не знает и ведать не ведает. Весь в меня. Windows 7 64 bit
Миниатюры
Отправка письма с вложением: что в коде подкорректировать и чем скомпилировать  
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
21.01.2014, 13:48 11
Еще тебе подсказка :

aivanov@lab127:~$ nslookup smtp.mail.ru
Server: 192.168.30.249
Address: 192.168.30.249#53

Non-authoritative answer:
Name: smtp.mail.ru
Address: 94.100.177.1

aivanov@lab127:~$

Добавлено через 5 минут
Цитата Сообщение от Полный 30h Посмотреть сообщение
Ethereal,говорит что знать не знает и ведать не ведает. Весь в меня. Windows 7 64 bit
Так и засунь эту Windows 7 64 бит куда фантазия подскажет. Если в операционке нет telnet-а что в ней вообще есть ?
Хотя он там есть :
Пуск - Панель управления - Программы и компоненты - Включение или отключение компонентов windows - Клиент Telnet (ставим галочку)

Добавлено через 30 минут
И продолжать в том-же духе, пока не увидите
550 not local sender over smtp
и не поймете, что быть спамером не хорошо.
2
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
21.01.2014, 13:57 12
Галку поставил, повторил. Результат: не удалось открыть подключение к этому узлу на порт 25. сбой подключения.

В общем праздник закончился не успев начаться.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
21.01.2014, 14:22 13
Ну значит без переделки ничего эта программа не отправит.

Но я же подсказку дал. В программе стоит 194.67.23.111 и в комментариях мол это smtp.mail.ru. А я подсказал, что на самом деле у smtp.mail.ru IP-адрес другой : 94.100.177.1. А что такое 194.67.23.111 ? А хрен его знает ! И это "хрен знает" не отвечает ! Возможно и не существует.

Потренироваться можете, набрав
telnet smtp.mail.ru 25
далее надо набирать без ошибок, ибо забоя протокол SMTP скорей всего не поймет
HELO 0
MAIL FROM: a@b <- отправителя можно указать любым, никто его существавание проверять не будет
RCPT TO: polnyj_30h@pochtovyj.jaschik.ru <- свой почтовый адрес, на который будем ловить письмо
и тут вы получите сообщение
550 not local sender over smtp
что означает "Ах ты-ж, <deleted> ты спамер !"
2
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
21.01.2014, 14:27 14
Цитата Сообщение от Ethereal Посмотреть сообщение
и тут вы получите сообщение
550 not local sender over smtp
что означает "Ах ты-ж спамер !"
И тут я получаю:250 Асс ептед

З.Ы. что до айпишника, то прогу ТС писали в 2005, вполне допускаю что с тех пор айпи вполне мог поменяться.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
21.01.2014, 14:31 15
Цитата Сообщение от Полный 30h Посмотреть сообщение
И тут я получаю:250 Асс ептед
Ну тогда
DATA
тескст_письма
точка
Письмо улетело
QUIT
до свидания

Теперь тоже самое проделать в программе.
2
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
23.01.2014, 08:44 16
Ethereal, Улетает и уже даже долетает. Правда не без косяков. Вложенный файл не доходит и название темы в квадратах. Но всё равно доволен как слон. Спасибо большое за помощь.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.01.2014, 13:21 17
Цитата Сообщение от Ethereal Посмотреть сообщение
А что такое 194.67.23.111 ? А хрен его знает !
Вымпелком/Совкам Телепорт.
0
23.01.2014, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2014, 13:21
Помогаю со студенческими работами здесь

Отправка письма с вложением
Здравствуйте! встречал ф-ю отправки письма, где массив с файлами - это параметр. А как получить...

отправка письма с вложением
Я посмотрел несколько примеров. Там обычная загрузка- сначала в временную папку сервера, оттуда...

Отправка письма с вложением на почту
помогите с кодом для отправка письма с вложением на почту версия делфи 10.1 berlin

Отправка письма с вложением. Не получается
Доброго времени суток . Для начала хочу просто отправить письмо(текстовое) , в последующем с...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru