Android中使用Javamail的自动电子邮件
我正在尝试自动发送电子邮件,在我的Android应用程序中没有用户确认。我正在尝试使用Javamail,但当我在手机上尝试我的应用程序时,它与典型的“应用程序停止,再次打开”Android消息非常接近。 我的代码是: 发送邮件类别:Android中使用Javamail的自动电子邮件,java,android,jakarta-mail,Java,Android,Jakarta Mail,我正在尝试自动发送电子邮件,在我的Android应用程序中没有用户确认。我正在尝试使用Javamail,但当我在手机上尝试我的应用程序时,它与典型的“应用程序停止,再次打开”Android消息非常接近。 我的代码是: 发送邮件类别: package com.android.mdw.demo; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import
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);
}
}
通知邮件类别:
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();
}
我收到的日志如下:
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)
您试图从主线程发送电子邮件,这是不允许的,请尝试创建单独的工作线程来发送电子邮件。尝试以下方法:
new Thread(new Runnable() {
@Override
public void run() {
if(PRUEBA==true && PRUEBA1==true) {
EmailAviso EmailAviso = new EmailAviso();
EmailAviso.EmailAviso();
}
}
}).start();
您试图从主线程发送电子邮件,这是不允许的,请尝试创建单独的工作线程来发送电子邮件。尝试以下方法:
new Thread(new Runnable() {
@Override
public void run() {
if(PRUEBA==true && PRUEBA1==true) {
EmailAviso EmailAviso = new EmailAviso();
EmailAviso.EmailAviso();
}
}
}).start();
从Android直接发送电子邮件被认为是一种不好的做法,因为您必须将电子邮件和密码存储在源代码中,而简单的APK会损害凭据 如果您希望在不与用户交互的情况下发送电子邮件,则必须使用外部
API
来发送邮件,或者必须使用任何服务器堆栈(如PHP
,nodejs
,JSP
等)开发自己的API
我创建了一个名为的简单库来解决这个问题。您所要做的就是从中获取API密钥
,并像这样使用它
抱歉,文档太少了。请随意在评论中提出疑问 直接从Android发送电子邮件被认为是一种不好的做法,因为您必须将电子邮件和密码存储在源代码中,而简单的
APK
decomile可能会破坏凭据
如果您希望在不与用户交互的情况下发送电子邮件,则必须使用外部API
来发送邮件,或者必须使用任何服务器堆栈(如PHP
,nodejs
,JSP
等)开发自己的API
我创建了一个名为的简单库来解决这个问题。您所要做的就是从中获取API密钥
,并像这样使用它
抱歉,文档太少了。请随意在评论中提出疑问 如果您试图从不允许的主线程发送电子邮件,请尝试创建单独的工作线程以发送电子邮件。如果您试图从不允许的主线程发送电子邮件,则没有用户权限,则无法发送邮件,尝试创建单独的工作线程来发送电子邮件。每次我执行我的应用程序时,当到达线程的行时,它将关闭。。。为什么?每次我执行我的应用程序,当到达线程行时,它就关闭了。。。为什么?