Автоматическая электронная почта с Javamail в Android - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь отправить электронное письмо автоматически, без подтверждения пользователя в моем приложении для Android. Я пытаюсь работать с Javamail, но когда я пытаюсь установить приложение на своем телефоне, оно закрывается типичным сообщением Android "APP STOPPED, Open again". Мой код:

ОТПРАВИТЬ ПОЧТОВЫЙ КЛАСС:

package com.android.mdw.demo;

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;
import android.util.Log;

public class EnviarEmail {
    public static String emailEnvio = "XXX@gmail.com";
    public static String passwordEmailEnvio = "@XXX";

    public void EnviarEmail(String Mensaje, String Asunto, String email) {
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(emailEnvio, passwordEmailEnvio);
                    }
                });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(emailEnvio));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(email));
            message.setSubject(Asunto);
            message.setText(Mensaje);

            Transport.send(message);

        } catch (MessagingException e) {
            Log.w("ERROR", "No se ha podido enviar el email de confirmación.");
        }
    }
}

УВЕДОМЛЕНИЕ ПОЧТОВЫЙ КЛАСС:

package com.android.mdw.demo;

public class EmailAviso {
    public void EmailAviso ()  {
        String Mensaje = "CUERPO";
        String Asunto = "ASUNTO";
        String email = "AQUIENVA@gmail.com";

        EnviarEmail EnviarEmail = new EnviarEmail();
        EnviarEmail.EnviarEmail(Mensaje, Asunto, email);

    }
}

ВЫДЕРЖКА ИЗ ГЛАВНОГО КЛАССА:

boolean PRUEBA=true;
boolean PRUEBA1=true;

if(PRUEBA==true && PRUEBA1==true) {
EmailAviso EmailAviso = new EmailAviso();
EmailAviso.EmailAviso();
}

И журнал, который я получаю в AS:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.android.mdw.demo, PID: 18001
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
        at java.net.InetAddress.getLocalHost(InetAddress.java:816)
        at javax.mail.internet.InternetAddress.getLocalAddress(InternetAddress.java:517)
        at javax.mail.internet.UniqueValue.getUniqueMessageIDValue(UniqueValue.java:99)
        at javax.mail.internet.MimeMessage.updateMessageID(MimeMessage.java:2054)
        at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2076)
        at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042)
        at javax.mail.Transport.send(Transport.java:117)
        at com.android.mdw.demo.EnviarEmail.EnviarEmail(EnviarEmail.java:41)
        at com.android.mdw.demo.EmailAviso.EmailAviso(EmailAviso.java:10)
        at com.android.mdw.demo.Main.onSensorChanged(Main.java:77)
        at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:699)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:323)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Отправка электронной почты напрямую с Android считается плохой практикой, поскольку вам придется хранить свою электронную почту и пароль в исходном коде, а простое APK дешифрование может поставить под угрозу учетные данные.

Если вы хотите отправлять электронную почту без взаимодействия с пользователем, вам придется использовать внешний API для отправки почты, или вам придется разрабатывать собственный API с использованием любого стека серверов, например PHP, nodejs, JSP и т. Д.

Я создал простую библиотеку с именем SafeMail , чтобы решить эту проблему. Все, что вам нужно сделать, это взять свой API Key из здесь и использовать его, как в этом примере .

Извините за минимальную документацию. Не стесняйтесь стрелять запросы в комментариях.

0 голосов
/ 22 апреля 2019

вы пытаетесь отправить электронное письмо из основного потока, что запрещено, попробуйте создать отдельный рабочий поток для отправки электронного письма.Попробуйте что-то вроде следующего:

    new Thread(new Runnable() {
        @Override
        public void run() {
            if(PRUEBA==true && PRUEBA1==true) {
               EmailAviso EmailAviso = new EmailAviso();
               EmailAviso.EmailAviso();
            }
        }
    }).start();
...