в моем приложении я нуждаюсь в том, чтобы смочь посылать электронную почту. Пользователь пишет Ваше имя, электронную почту и описание в серии editText
и посредством одного Button
я хочу, чтобы были посланы эти данные в мою электронную почту. Я смотрел книжный магазин JavaMail и вероятно моя проблема была плохим использованием той же самой.
Здесь будь setOnClickListener
Button
, в котором я написал код, чтобы посылать электронную почту. Ошибка дает это мне в линии javax.mail.Transport.send(msg);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.starttls.enable", "true");
props.put("mail.transport.protocol","smtp");
props.put("mail.smtp.port",25);
props.setProperty("mail.smtp.user", "ejemplo@gmail.com");
props.setProperty("mail.smtp.auth", "true");
Session mailSession = Session.getInstance(props,null);
Message msg = new MimeMessage(mailSession);
//Establecemos el asunto, el remitente y el destinatario
try{
msg.setSubject(etNombre.getText().toString());
msg.setFrom(new InternetAddress(etEmail.getText().toString(),etNombre.getText().toString()));
msg.addRecipients(Message.RecipientType.TO, new InternetAddress[] { new InternetAddress("ejemplo@gmail.com") });
}catch (javax.mail.MessagingException ex){
ex.getMessage();
}
catch (java.io.UnsupportedEncodingException e){
e.getMessage();
}
//Mensaje que se quiere enviar (cuerpo del mensaje)
DataHandler dh = new DataHandler(etMensaje.getText().toString(),"text/plain");
try {
msg.setDataHandler(dh);
} catch (MessagingException e) {
e.printStackTrace();
}
//Línea para envíar el mensaje
try {
javax.mail.Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
}
});
Ошибка, которая дает мне, - следующая:
08-24 18:42:42.037 23504-23504/es.uclm.mylittlepets E/AndroidRuntime: FATAL EXCEPTION: main
Process: es.uclm.mylittlepets, PID: 23504
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getLocalHost(InetAddress.java:409)
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 es.uclm.mylittlepets.Layout.Contacto$1.onClick(Contacto.java:78)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ВТОРАЯ ОШИБКА. Делая то, что говорит пользователь / потребительница Эленасис, ошибка, которую он дает: 08-25 08:53:33.061 7556-7556/es.uclm.mylittlepets E/Error: Exception: null
. В try-catch
бери catch и printeando ошибка.
Мой код этот:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try{
procesoEnviarMail();
}catch (Exception ex){
Log.e("Error", "Exception: " + ex.getMessage()); }
}
});
}
});
Метод procesoEnviarMail()
просто у него есть весь код, написанный ранее в месте, в котором сейчас находят этот try-catch
.
Новая ошибка в: javax.mail.Transport.send(msg);
08-25 11:58:13.676 7782-7782/es.uclm.mylittlepets E/AndroidRuntime: FATAL EXCEPTION: main
Process: es.uclm.mylittlepets, PID: 7782
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getLocalHost(InetAddress.java:409)
at javax.mail.internet.InternetAddress.getLocalHostName(InternetAddress.java:568)
at javax.mail.internet.InternetAddress._getLocalAddress(InternetAddress.java:547)
at javax.mail.internet.InternetAddress.getLocalAddress(InternetAddress.java:518)
at javax.mail.internet.UniqueValue.getUniqueMessageIDValue(UniqueValue.java:100)
at javax.mail.internet.MimeMessage.updateMessageID(MimeMessage.java:2172)
at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2200)
at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2159)
at javax.mail.Transport.send(Transport.java:123)
at es.uclm.mylittlepets.Layout.Contacto.procesoEnviarMail(Contacto.java:110)
at es.uclm.mylittlepets.Layout.Contacto$1$1.run(Contacto.java:49)
at android.app.Activity.runOnUiThread(Activity.java:5511)
at es.uclm.mylittlepets.Layout.Contacto$1.onClick(Contacto.java:42)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Проблема состоит в том, что ты реализуешь это задание в главной нити, можешь использовать runOnUIThread, чтобы выполнять ты mГ©todo.
NetworkOnMainThreadException : он вызывается, когда ты стараешься реализовывать операции в главной нити (Main thread), что неправильный.
Использует runOnUiThread ()
@Override
public void onClick(View view) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
procesoEnviaEmail(); //Realizar aquí tu proceso!
} catch (Exception e) {
Log.e("Error", "Exception: " + e.getMessage());
}
}
});
}
Других выборов он состоял бы в том, чтобы использовать Asyncask или Handler.post ()
Ты можешь делать следующее, используя Intent, и seteas стоимость, что ты хотел, чтобы был e-mail (obtenes edittext)> у
String recepientEmail = "etEmail.getText().toString()"; // aca va donde quieres enviar el email Intent intentt = new Intent(Intent.ACTION_SENDTO); // esto lo dejas como esta intentt.setData(Uri.parse("mailto:" + recepientEmail)); // aca seteas a que direccion va el email con la variable recipientEmail) intentt.putExtra(Intent.EXTRA_SUBJECT, "Sugerencia");// este es el asunto de email intentt.putExtra(Intent.EXTRA_TEXT, "Escribe tu sugerencia aqui"); // este es el contenido del email startActivity(intentt);
, единственное, что ты должен делать, он состоит в том, чтобы получать текст каждого edittext и setearlos в коде. intent ты это помещаешь внутри действия Onclick твоей пуговицы посылать.
Тогда ты был бы должен меняться, где он говорит "Подсказку" и "Он пишет твой e-mail здесь" из-за текста твоих edittext. Например:
intentt.putExtra(Intent.EXTRA_SUBJECT, "TU_EDITTEXT.gettext().toString()"); // asunto del email intentt.putExtra(Intent.EXTRA_TEXT, "TU_EDITTEXT.gettext().toString()"); // cuerpo del email
Надеялся, что он подает тебя. Привет!