Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
1

GMailSender+JSSEProvider, отправка письма на почту по нажатию кнопки

15.11.2016, 10:07. Показов 1681. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро. Решил спросить в новой теме по данной связке. Есть активити, в ней несколько полей. Хочу по нажатию кнопки отправлять данные с этих полей ко мне на почту Gmail. Вычитал ТУТ, что можно реализовать данный метод. Кто реализовывал данный метод подскажите что я не так сделал и почему по нажатию кнопки данные с полей не уходят на почту?
Файлы библиотек я добавил в свой проект, дальше просто сделал активити, добавил туда поля и кнопки. Содержимое .java и .xml ниже. Визуально можно посмотреть как на миниатюре.

1. Создал активити, в нем следующее содержимое:
XML
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
<?xml version="1.0" encoding="utf-8"?>
 
 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/connect"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ru.lux_tv.screen.ConnectActivity">
 
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:text="@string/formaConn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/textView3" />
 
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:hint="Введите ФИО"
        android:ems="10"
        android:layout_below="@+id/textView3"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="52dp"
        android:id="@+id/poleFio"/>
 
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:hint="Введите номер телефона"
        android:layout_marginTop="22dp"
        android:id="@+id/poleTel"
        android:layout_below="@+id/poleFio"
        android:layout_alignParentStart="true"/>
 
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:hint="Введите сообщение"
        android:id="@+id/poleSoob"
        android:lines="5"
        android:layout_below="@+id/poleTel"
        android:layout_alignParentStart="true"
        android:layout_marginTop="18dp"/>
 
    <Button
        android:text="Отправить заявку"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnConSend"
        android:layout_below="@+id/poleSoob"
        android:layout_alignParentStart="true"
        android:layout_marginTop="18dp" />
 
    <Button
        android:text="Очистить форму"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnConClear"
        android:layout_alignBaseline="@+id/btnConSend"
        android:layout_alignBottom="@+id/btnConSend"
        android:layout_alignParentEnd="true" />
</RelativeLayout>
</ScrollView>
Java
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
package ru.lux_tv.screen;
 
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.content.Intent;
import android.view.MenuItem;
import android.util.Log;
 
 
import com.backendless.Backendless;
 
public class ConnectActivity extends AppCompatActivity implements View.OnClickListener {
 
    public static final String APP_ID = "--------------------------------------------";
    public static final String SECRET_KEY = "----------------------------------------";
    public static final String VERSION = "v1";
 
    private Button btnConSend;
    private Button btnConClear;
 
    private EditText poleFio;
    private EditText poleTel;
    private EditText poleSoob;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connect);
 
        Backendless.initApp(this, APP_ID, SECRET_KEY, VERSION);
 
        ActionBar actionBar = getSupportActionBar();
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
 
        //btnConSend = (Button) findViewById(R.id.btnConSend);
        //btnConSend.setOnClickListener(this);
 
        btnConSend = (Button) this.findViewById(R.id.btnConSend);
        btnConSend.setOnClickListener(new View.OnClickListener() {
 
            public void onClick(View v) {
 
                try {
                    GMailSender sender = new GMailSender("luxtvapps@gmail.com", "blablabla");
                    sender.sendMail("This is Subject",
                            "This is Body",
                            "luxtvapps@gmail.com",
                            "user@yahoo.com");
                } catch (Exception e) {
                    Log.e("SendMail", e.getMessage(), e);
                }
 
            }
        });
 
        btnConClear = (Button) findViewById(R.id.btnConClear);
        btnConClear.setOnClickListener(this);
 
        poleFio = (EditText) findViewById(R.id.poleFio);
        poleTel = (EditText) findViewById(R.id.poleTel);
        poleSoob = (EditText) findViewById(R.id.poleSoob);
 
    }
 
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnConClear:
                poleFio.setText("");
                poleTel.setText("");
                poleSoob.setText("");
                break;
        }
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                startActivity(new Intent(this, MainActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
 
}
2. GMailSender.java
Java
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
package ru.lux_tv.screen;
 
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import java.util.Properties;
 
 
public class GMailSender extends javax.mail.Authenticator {
    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;
 
    static {
        Security.addProvider(new com.provider.JSSEProvider());
    }
 
    public GMailSender(String user, String password) {
        this.user = user;
        this.password = password;
 
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");
 
        session = Session.getDefaultInstance(props, this);
    }
 
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }
 
    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {
        try{
            MimeMessage message = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);
            message.setDataHandler(handler);
            if (recipients.indexOf(',') > 0)
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            else
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            Transport.send(message);
        }catch(Exception e){
 
        }
    }
 
    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;
 
        public ByteArrayDataSource(byte[] data, String type) {
            super();
            this.data = data;
            this.type = type;
        }
 
        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }
 
        public void setType(String type) {
            this.type = type;
        }
 
        public String getContentType() {
            if (type == null)
                return "application/octet-stream";
            else
                return type;
        }
 
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }
 
        public String getName() {
            return "ByteArrayDataSource";
        }
 
        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
}

3. JSSEProvider.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.provider;
 
import java.security.AccessController;
import java.security.Provider;
 
public final class JSSEProvider extends Provider {
 
    public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
            public Void run() {
                put("SSLContext.TLS",
                        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                put("Alg.Alias.SSLContext.TLSv1", "TLS");
                put("KeyManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                put("TrustManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                return null;
            }
        });
    }
}
4. В манифест добавил
XML
1
2
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Миниатюры
GMailSender+JSSEProvider, отправка письма на почту по нажатию кнопки  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2016, 10:07
Ответы с готовыми решениями:

Отправка письма на электронный ящик по нажатию кнопки
Народ, как к кнопке добавить адрес электронной почты? &lt;td&gt;&lt;p align=&quot;center&quot;&gt;&lt;input type=&quot;submit&quot;...

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

Отправка письма на почту
Добрый день коллеги подскажите что может повлиять на не отправку письма на почту сервера ...

Отправка письма на почту
Возможно ли в батнике прописать так чтобы отправлял, допустим на tr-001@mail.ru, письмо, содержание...

15
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:21 2
Цитата Сообщение от FIXx Посмотреть сообщение
почему по нажатию кнопки данные с полей не уходят на почту?
Цитата Сообщение от FIXx Посмотреть сообщение
sender.sendMail("This is Subject",
* * * * * * * * * * * * * * "This is Body",
* * * * * * * * * * * * * * "luxtvapps@gmail.com",
* * * * * * * * * * * * * * "user@yahoo.com");
С какой стати они должны уйти, если ты их не ввёл?

Добавлено через 2 минуты
Пиши в конструкторе GMailSender свои параметры и добавляй их в body.

Добавлено через 34 секунды
Если у тебя вообще не уходит почта, то лог с студию.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
15.11.2016, 10:24  [ТС] 3
Цитата Сообщение от ExFau$t Посмотреть сообщение
Пиши в конструкторе GMailSender свои параметры и добавляй их в body.
Java
1
GMailSender sender = new GMailSender("luxtvapps@gmail.com", "тут я ввел свой пароль от почты");
это разве не данные?
А в sender.sendMail я не пойму что писать нужно.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:29 4
Цитата Сообщение от FIXx Посмотреть сообщение
А в sender.sendMail я не пойму что писать нужно.
Пишешь sender.sendMail, открываешь скобку и ide подскажет, что нужно ввести.

Добавлено через 2 минуты
что-то такое:
Java
1
2
3
4
sender.sendMail(poleFio.getText().toString(),
* * * * * * * * * * * * * * poleSoob.getText().toString(),
* * * * * * * * * * * * * * "luxtvapps@gmail.com",
* * * * * * * * * * * * * * "user@yahoo.com");
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
15.11.2016, 10:32 5
Цитата Сообщение от ExFau$t Посмотреть сообщение
С какой стати они должны уйти, если ты их не ввёл?
По-моему вы написали глупость.
Если вы посмотрите внимательно на функцию sendMail
Java
1
sendMail(String subject, String body, String sender, String recipients)
то увидите что ТС ввел все необходимые данные.
За исключением что user@yahoo.com скорей всего вымышленный email и вместо него надо вставить реальный.
И конечно же при условие что luxtvapps@gmail.com и пароль к нему реальные.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:34 6
fraley, если ты посмотришь вызов этого sendMail, то увидишь то, что я написал, смотри внимательней прежде, чем замечания делать.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
15.11.2016, 10:44  [ТС] 7
Почта luxtvapps@gmail.com - реальная, пароль правильный.
Почта user@yahoo.com - не моя почта, взял ее из примера. Авторизации к ней не имею.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:46 8
FIXx, не имеет значения, в поле from можно любую писать, проверь только, что она стоит именно во from, чтобы как бы с user@yahoo.com на luxtvapps@gmail.com придёт письмо от пользователя, а не наоборот.
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
15.11.2016, 10:47 9
Цитата Сообщение от FIXx Посмотреть сообщение
Почта user@yahoo.com - не моя почта, взял ее из примера. Авторизации к ней не имею.
Ну так нужен же реальный адрес.
И второе, а разрешили ли вы доступ к своему email непроверенным приложениям?
https://www.google.com/setting... secureapps
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:50 10
в sendMail по-моему сначала sender, потом recipients. То бишь местами надо поменять.

Добавлено через 1 минуту
Цитата Сообщение от fraley Посмотреть сообщение
Ну так нужен же реальный адрес.
В поле from не нужен.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
15.11.2016, 10:53  [ТС] 11
Цитата Сообщение от fraley Посмотреть сообщение
И второе, а разрешили ли вы доступ к своему email непроверенным приложениям?
https://www.google.com/setting... secureapps
Да, это сделал. Тоже натыкался на эту фичу уже. Спасибо.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
15.11.2016, 10:55 12
Кстати, имей в виду, что в гугле и яндексе есть ограничения на кол-во входящий и исходящих писем, у яндекса побольше.
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
15.11.2016, 11:52 13
Цитата Сообщение от ExFau$t Посмотреть сообщение
В поле from не нужен.
Во-первых я писал не про адрес от кого, а кому.
Во-вторых, исходя из первого - адрес обязателен.
Поэтому в третьих, вашими же словами - "смотри внимательней прежде, чем замечания делать.".
Ну и в четвертых, вся проблема ТС была в том что он пытался работать с сетью из main thread.

Вот решение проблемы на скорую руку, без введения данных. as is.
Я надеюсь ТС уже подгонит под себя пример.

Java
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
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        final Button send = (Button) this.findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                MyTask task = new MyTask();
                task.execute();
            }
        });
    }
 
    private class MyTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                GMailSender sender = new GMailSender("your_mail@gmail.com", "password");
                sender.sendMail("This is Subject",
                        "This is Body",
                        "user@gmail.com",
                        "real_mail@gmail.com");
                Log.e("SendMail","Mail send");
            } catch (Exception e) {
                Log.e("SendMail", e.getMessage(), e);
            }
            return null;
        }
    }
}
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
15.11.2016, 13:40  [ТС] 14
Теперь другая проблема. Лог прикрепил. Ругается как я понял на пакет com.provider. Хотя до этого все отлично было, приложение открывалось. При создании Create class "JSSEProvider" по новой, при запуске приложения оно удаляется. И опять эта же ошибка. Подскажите что с ней делать?
Миниатюры
GMailSender+JSSEProvider, отправка письма на почту по нажатию кнопки   GMailSender+JSSEProvider, отправка письма на почту по нажатию кнопки  
0
111 / 111 / 43
Регистрация: 24.05.2015
Сообщений: 329
15.11.2016, 13:44 15
Цитата Сообщение от FIXx Посмотреть сообщение
Подскажите что с ней делать?
Так достаточно:
Java
1
2
3
static {
        Security.addProvider(new JSSEProvider());
    }
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 33
16.11.2016, 09:52  [ТС] 16
При проверке на телефоне вылетает с ошибкой :-(
Java
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
package ru.lux_tv.screen;
 
import android.os.AsyncTask;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.content.Intent;
import android.view.MenuItem;
import android.util.Log;
 
 
 
 
public class ConnectActivity extends AppCompatActivity implements View.OnClickListener {
 
 
    private Button btnConSend;
    private Button btnConClear;
 
    private EditText poleFio;
    private EditText poleTel;
    private EditText poleSoob;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connect);
 
        //Backendless.initApp(this, APP_ID, SECRET_KEY, VERSION);
 
        ActionBar actionBar = getSupportActionBar();
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
 
        //btnConSend = (Button) findViewById(R.id.btnConSend);
        //btnConSend.setOnClickListener(this);
 
        final Button send = (Button) this.findViewById(R.id.btnConSend);
        btnConSend.setOnClickListener(new View.OnClickListener() {
 
            public void onClick(View v) {
                MyTask task = new MyTask();
                task.execute();
 
                private class MyTask extends AsyncTask<Void, Void, Void> {
                    @Override
                    protected Void doInBackground(Void... voids) {
                        try {
                            GMailSender sender = new GMailSender("luxtvapps@gmail.com", "123");
                            sender.sendMail("This is Subject",
                                    "This is Body",
                                    "luxtvapps@gmail.com",
                                    "luxtvapps@gmail.com");
                            Log.e("SendMail","Mail send");
                        } catch (Exception e) {
                            Log.e("SendMail", e.getMessage(), e);
                        }
                        return null;
                    }
                }
            }
 
        });
 
        btnConClear = (Button) findViewById(R.id.btnConClear);
        btnConClear.setOnClickListener(this);
 
        poleFio = (EditText) findViewById(R.id.poleFio);
        poleTel = (EditText) findViewById(R.id.poleTel);
        poleSoob = (EditText) findViewById(R.id.poleSoob);
 
    }
 
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnConClear:
                poleFio.setText("");
                poleTel.setText("");
                poleSoob.setText("");
                break;
        }
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                startActivity(new Intent(this, MainActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
 
}
Добавлено через 56 секунд
Цитата Сообщение от fraley Посмотреть сообщение
Так достаточно:
Java
Выделить код
1
2
3
static {
Security.addProvider(new JSSEProvider());
}
Помогло, спасибо!

Добавлено через 19 часов 40 минут
Короче говоря, сделал! Может кому пригодится, кто из начинающих захочет подобное реализовать. Все strings и данные авторизации подгоните под себя.
https://www.simplifiedcoding.n... id-studio/
0
16.11.2016, 09:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2016, 09:52
Помогаю со студенческими работами здесь

Отправка письма на почту
Как можно отправить письмо на почту? Перепробовал кучу вариантов не выходит. Использую программу...

Отправка письма на почту
Ребята,пожалуйста помогите,прошу.Кто знает,или кто делал такую программу,не могли бы вы скинуть...

Отправка на почту письма
ребята нужен скрипт для отправки письма на почту. всего 2 поля для заполнения ваше имя и ваш...

Отправка письма на почту
Возможно ли в VBS прописать так чтобы отправлял, допустим на tr-001@mail.ru, письмо, содержание...


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

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