6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
1

Отправка электронной почты из приложения (без почтового клиента)

12.12.2019, 05:27. Показов 8230. Ответов 14

Author24 — интернет-сервис помощи студентам
Сразу уточню, что я нуб.

Хочу передать себе данные анкеты из приложения. Кроме email ничего удобного не вижу. Перечитал кучу статей по отправке электронной почты, но они все устарели и много не сходится.

Понял, что нужна библиотека "javax.mail.jar". Её скачал. Как подключается она в Android Studio 3.5? "File - Project structure - New module (плюс) - Import .JAR/.AAR Package" - это верные действия?

Далее как ей воспользоваться? Прошу объяснение для чайника, ибо статьи я читал и пробовал самостоятельно. Ничего не вышло.

PS: неужели для Android нет встроенных средств отправки электронной почты? Это так странно...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2019, 05:27
Ответы с готовыми решениями:

Отправка из приложения сообщений электронной почты с вложением
Здравствуйте. Хотелось бы спросить, как можно реализовать отправку сообщений электронной почты...

Создание почтового клиента и отправка почты и вложений (одного или несколько)
У меня есть небольшой проект по отправке почты из браузера, с вложениями. Вопрос в том, что не...

Отправка писем без почтового клиента (не отправляет)
Имеется форма с 3мя TextBox-ами (1 ввод email-а отправителя; 2 пароль к ящику; 3 тема сообщения), 1...

Отправка электронной почты в VB 6.0
Добрый день! Такой вопрос, как реализовать отправку сообщений пользователям используя список...

14
4 / 3 / 1
Регистрация: 27.10.2010
Сообщений: 67
12.12.2019, 07:37 2
Лучший ответ Сообщение было отмечено moverast как решение

Решение

Добрый день, вот мой работающий проект для отправки на почту mail :

Activity_main.xml

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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"  tools:context=".MainActivity">
 
    <TextView
        android:text="Recipient Email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextEmail" />
    <TextView
        android:text="Subject"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextSubject" />
    <TextView
        android:text="Message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:lines="4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextMessage" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/buttonSend"
        android:text="Send"/>
</LinearLayout>
MainActivity.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
package com.example.myapplication;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
import java.util.Properties;
 
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    //Declaring EditText
    private EditText editTextEmail;
    private EditText editTextSubject;
    private EditText editTextMessage;
 
    //Send button
    private Button buttonSend;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //Initializing the views
        editTextEmail = (EditText) findViewById(R.id.editTextEmail);
        editTextSubject = (EditText) findViewById(R.id.editTextSubject);
        editTextMessage = (EditText) findViewById(R.id.editTextMessage);
 
        buttonSend = (Button) findViewById(R.id.buttonSend);
 
        //Adding click listener
        buttonSend.setOnClickListener(this);
    }
 
 
    private void sendEmail() {
        //Getting content for email
        String email = editTextEmail.getText().toString().trim();
        String subject = editTextSubject.getText().toString().trim();
        String message = editTextMessage.getText().toString().trim();
 
        //Creating SendMail object
        SendMail sm = new SendMail(this, email, subject, message);
 
        //Executing sendmail to send email
        sm.execute();
    }
 
    @Override
    public void onClick(View v) {
        sendEmail();
    }
}
SendMail.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
107
108
package com.example.myapplication;
 
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
 
import java.util.Properties;
 
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
/**
 * Created by Belal on 10/30/2015.
 */
 
//Class is extending AsyncTask because this class is going to perform a networking operation
public class SendMail extends AsyncTask<Void,Void,Void> {
 
    //Declaring Variables
    private Context context;
    private Session session;
 
    //Information to send email
    private String email;
    private String subject;
    private String message;
 
    //Progressdialog to show while sending email
    private ProgressDialog progressDialog;
 
    //Class Constructor
    public SendMail(Context context, String email, String subject, String message){
        //Initializing variables
        this.context = context;
        this.email = email;
        this.subject = subject;
        this.message = message;
    }
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Showing progress dialog while sending email
        progressDialog = ProgressDialog.show(context,"Sending message","Please wait...",false,false);
    }
 
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        //Dismissing the progress dialog
        progressDialog.dismiss();
        //Showing a success message
        Toast.makeText(context,"Message Sent",Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected Void doInBackground(Void... params) {
        //Creating properties
        Properties props = new Properties();
 
 
//Протоколы для mail
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", "smtp.mail.ru");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", 2525);
 
 
 
        //Creating a new session
        session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                    //Authenticating the password
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
                    }
                });
 
        try {
            //Creating MimeMessage object
            MimeMessage mm = new MimeMessage(session);
 
            //Setting sender address
            mm.setFrom(new InternetAddress(Config.EMAIL));
            //Adding receiver
            mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
            //Adding subject
            mm.setSubject(subject);
            //Adding message
            mm.setText(message);
 
            //Sending email
            Transport.send(mm);
 
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
Config.java

Java
1
2
3
4
5
6
7
package com.example.myapplication;
 
public class Config
{
    public static final String EMAIL ="Вписываем почту с которой отправляем сообщение";
    public static final String PASSWORD ="пороль от почты";
}
Ну и конечно вам нужно добавить 3 файла в Depencies : activation, additionnal, mail у всех разрешение jar
Для этого откройте структуру проекта, в каталоге app создайте каталог libs и в него загрузите файлы после этого в gradle пропишите в разделе dependencies следующие строки :
implementation files('libs\\activation.jar')
implementation files('libs\\additionnal.jar')
implementation files('libs\\mail.jar')

Если самостоятельно не найдете файлы то пиши в личку скину
1
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
12.12.2019, 11:00  [ТС] 3
Цитата Сообщение от Makkusiik Посмотреть сообщение
Добрый день, вот мой работающий проект для отправки на почту mail :
проект запустился. Это уже хорошо. Но почта не ходит.

Ошибка:
Кликните здесь для просмотра всего текста
W/System.err: javax.mail.MessagingException: Could not connect to SMTP host: smtp.yandex.ru, port: 465;
nested exception is:
java.net.SocketException: socket failed: EPERM (Operation not permitted)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)
at javax.mail.Service.connect(Service.java:310)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:118)
at javax.mail.Transport.send0(Transport.java:188)
at javax.mail.Transport.send(Transport.java:118)
at ru.moversoft.emailtest.SendMail.doInBackground(SendMail.java:98)
at ru.moversoft.emailtest.SendMail.doInBackground(SendMail.java:23)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.net.SocketException: socket failed: EPERM (Operation not permitted)
at java.net.Socket.createImpl(Socket.java:492)
at java.net.Socket.connect(Socket.java:619)
at java.net.Socket.connect(Socket.java:570)
W/System.err: at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233)
W/System.err: at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359)


Мои Properties:
Java
1
2
3
4
5
6
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", "smtp.yandex.ru");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
Пробовал менять на сервера google
Пробовал убирать mail.debug
Прописал <uses-permission android:name="android.permission.INTERNET" />
Не работает. ЧЯДНТ?
0
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
13.12.2019, 06:28  [ТС] 4
Всё работает! Добавлю пару мелочей:
1. Нужно обязательно <uses-permission android:name="android.permission.INTERNET" />
2. props.put("mail.debug", "true"); можно убрать
3. implementation files('libs\\activation.jar') можно не прописывать. все файлы из libs автоматически подцепляются.
0
0 / 0 / 0
Регистрация: 14.04.2020
Сообщений: 2
11.07.2020, 16:51 5
не работает этот код. Я так понимаю google блокирует.
0
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
25.02.2021, 10:59  [ТС] 6
Начиная с API 30 этот код перестает работать. Что нужно исправить?

Немного информации из студии:
'android.os.AsyncTask' is deprecated

android.os @Deprecated
public abstract class AsyncTask<Params, Progress, Result>
extends Object
AsyncTask was intended to enable proper and easy use of the UI thread. However, the most common use case was for integrating into UI, and that would cause Context leaks, missed callbacks, or crashes on configuration changes. It also has inconsistent behavior on different versions of the platform, swallows exceptions from doInBackground, and does not provide much utility over using Executors directly.
AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps, called onPreExecute, doInBackground, onProgressUpdate and onPostExecute.
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
25.02.2021, 11:08 7
Цитата Сообщение от moverast Посмотреть сообщение
'android.os.AsyncTask' is deprecated
deprecated не значит что код с использованием AsyncTask перестанет работать.
если что то и сломалось, то AsyncTask тут явно не виновен, при условии что раньше все работало.
1
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
25.02.2021, 11:10  [ТС] 8
Цитата Сообщение от androbro Посмотреть сообщение
deprecated не значит что код с использованием AsyncTask перестанет работать.
если что то и сломалось, то AsyncTask тут явно не виновен, при условии что раньше все работало.
Действительно. Хоть студия и перечеркивает код, но он всё равно работает. Ладно. Привыкну)
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
25.02.2021, 11:30 9
Цитата Сообщение от androbro Посмотреть сообщение
код с использованием AsyncTask перестанет работать
Спорное утверждение, учитывая, что там в коде даже не проверяется контекст. AsyncTask изначально нельзя было использовать.
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
25.02.2021, 12:03 10
Цитата Сообщение от ExFau$t Посмотреть сообщение
Спорное утверждение, учитывая, что там в коде даже не проверяется контекст
ну так я код не смотрел, поэтому и сделал акцент на этом:
Цитата Сообщение от androbro Посмотреть сообщение
при условии что раньше все работало.
посыл моего сообщение был в том что deprecated != нерабочий
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
25.02.2021, 14:10 11
Цитата Сообщение от androbro Посмотреть сообщение
посыл моего сообщение был в том что deprecated != нерабочий
Да, но и нельзя утверждать, что deprecated будет работать как и раньше всегда, он может не приводить к ошибке компиляции, а кидать исключение в рантайме или просто не работать. Как, например, getExternalStorageDirectory() на 10м андроиде. Ну а от AsyncTask ещё и до deprecated всё давным давно избавились.
0
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
25.02.2021, 14:53  [ТС] 12
Цитата Сообщение от ExFau$t Посмотреть сообщение
AsyncTask изначально нельзя было использовать.
сложно переделать код без AsyncTask?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
25.02.2021, 15:23 13
Откуда нам знать, что для тебя сложно, а что нет.
0
6 / 8 / 0
Регистрация: 30.04.2011
Сообщений: 188
25.02.2021, 15:30  [ТС] 14
Логично. Надо просто пробовать. Что нужно переделать в классе SendMail.java?
0
androbro
25.02.2021, 16:07     Отправка электронной почты из приложения (без почтового клиента)
  #15

Не по теме:

Цитата Сообщение от ExFau$t Посмотреть сообщение
Как, например, getExternalStorageDirectory()
ну там это было сделано, для "improve user privacy".
проблема AsyncTask же в том что люди его неправильно юзали и он неявно тащил с собой контекст, что приводило к утечке памяти.
ИМХО: выпиливать и ломать backwards compatibility они из за этого не станут.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2021, 16:07

Отправка электронной почты
Добрый день. Пытаюсь отправить электронное письмо. После соединения с smtp.list.ru...

Отправка электронной почты
Есть функция, которая отвечает за отправку сообщений. (Если не отправилась - сохраняет файл)...

Отправка электронной почты с ПК с русскоязычным именем
Здравствуйте! При отправки почты столкнулся с проблемой, что .net framework ниже 4 версии работает...

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

Отправка скрытно сообщения электронной почты
Нашёл код в сети для скрытной отправки сообщения электронной почты, но выскакивает ошибка 10600 (в...

Отправка электронной почты с помощью JavaScript
Помогите, как отправить электронную почту с помощью JavaScript.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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