La API de correo de Java no funciona en Android
Pregunta
Agregué los tres archivos jar a la ruta de compilación de Java, agregué el permiso de uso de Internet, ¡todo listo para funcionar!Puse un botón en mi página principal, cada vez que hago clic en este botón tengo la intención de que esta clase de correo de Java funcione, y el correo electrónico debe enviarse a los usuarios correspondientes.Pero cuando hago clic en el botón, ¡de repente aparece que la aplicación dejó de funcionar...!Una cosa es que no utilicé ningún diseño para esta clase de correo de Java.que comprenderá cuando vea el siguiente código.¡¡Es porque quiero enviar el mensaje automáticamente!!qué hacer.??ayudenme chicos.??Gracias.!!
package;
import java.util.Date;
import android.content.Intent;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class Mail extends javax.mail.Authenticator {
private String _user;
private String _pass;
private String to1,to2,to3,to4,to5; // here i putted my recepients name
private String[] _to = {to1,to2,to3,to4,to5};
private String _from;
private String _port;
private String _sport;
private String _host;
private String _subject = "HELLO";
private String _body;
private boolean _auth;
private boolean _debuggable;
private Multipart _multipart;
public Mail() {
_host = "smtp.gmail.com"; // default smtp server
_port = "465"; // default smtp port
_sport = "465"; // default socketfactory port
_debuggable = false; // debug mode on or off - default off
_auth = true; // smtp authentication - default on
_multipart = new MimeMultipart();
// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
}
public Mail(String user, String pass) {
this();
_user = user;
_pass = pass;
}
public boolean send() throws Exception {
Properties props = _setProperties();
if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
Session session = Session.getInstance(props, this);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(_from));
InternetAddress[] addressTo = new InternetAddress[_to.length];
for (int i = 0; i < _to.length; i++) {
addressTo[i] = new InternetAddress(_to[i]);
}
msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSubject(_subject);
msg.setSentDate(new Date());
// setup message body
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(_body);
_multipart.addBodyPart(messageBodyPart);
// Put parts in message
msg.setContent(_multipart);
// send email
Transport.send(msg);
return true;
} else {
return false;
}
}
public void addAttachment(String filename) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
_multipart.addBodyPart(messageBodyPart);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(_user, _pass);
}
private Properties _setProperties() {
Properties props = new Properties();
props.put("mail.smtp.host", _host);
if(_debuggable) {
props.put("mail.debug", "true");
}
if(_auth) {
props.put("mail.smtp.auth", "true");
}
props.put("mail.smtp.port", _port);
props.put("mail.smtp.socketFactory.port", _sport);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
return props;
}
// the getters and setters
public String getBody() {
return _body;
}
public void setBody(String _body) {
this._body = _body;
}
// more of the getters and setters …..
}
Solución
Deberías publicar el código que llama a esta clase (probablemente tu Activity
).Hay algunos problemas comunes que podrían causar esto, como el NetworkOnMainThreadException.
Escribí un código de correo de Android funcional basado en el mismo javax.mail
código y funciona correctamente.Aquí está el código:
submitButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
/*
* Send email in a background thread
*/
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// retrieve the configuration values from preferences
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(theActivity);
String destinationAddress = preferences.getString("email_destination_address", theActivity.getString(R.string.default_email_destination_address));
String senderAddress = preferences.getString("email_from", theActivity.getString(R.string.default_email_sender_address));
String senderPassword = preferences.getString("email_password", theActivity.getString(R.string.default_email_sender_password));
String smtpServer = preferences.getString("email_server", theActivity.getString(R.string.default_smtp_server));
Mail m = new Mail(senderAddress, senderPassword);
String[] toArr = { destinationAddress };
m.setHost(smtpServer);
m.setTo(toArr);
m.setFrom(EMAIL_USERNAME);
m.setSubject(getString(R.string.email_subject, barcode));
m.setBody(getString(R.string.email_body));
try {
ArrayList<String> filesToSend = theAdapter.getFilenames();
for (String file : filesToSend)
{
m.addAttachment(file);
}
if (m.send()) {
Log.d(TAG, "EMAIL SENT SUCCESSFULLY");
} else {
Log.w(TAG, "EMAIL NOT SENT");
}
} catch (Exception e) {
Log.e(TAG, "Could not send email", e);
}
}
});
t.start();
Toast.makeText(getApplicationContext(), getString(R.string.email_sending), Toast.LENGTH_LONG).show();
theActivity.onBackPressed();
}
});
Nota:Si estuviera escribiendo este código hoy, podría usar un AsyncTask
en lugar de un Thread, pero cualquiera de los dos se considera válido.
Otros consejos
Te estás perdiendo el resto del código para obtener getters y los colonos. Vea el comentario en la parte inferior de su código:
// more of the getters and setters …..
Necesitas agregar lo siguiente en lugar de ese comentario:
/**
* METHOD TO SET THE "TO" STRING ARRAY
* @param toArr
*/
public void setTo(String[] toArr) {
this._to = toArr;
}
/**
* METHOD TO GET THE "TO" STRING ARRAY
* @return
*/
public String[] getTo() {
return _to;
}
/**
* METHOD TO SET THE "FROM" FIELD FOR THE MESSAGE
* @param string
*/
public void setFrom(String string) {
this._from = string;
}
/**
* METHOD TO GET THE "FROM" FIELD FOR THE MESSAGE
* @return
*/
public String getFrom() {
return _from;
}
/**
* METHOD TO SET THE MESSAGE SUBJECT
* @param string
*/
public void setSubject(String string) {
this._subject = string;
}
/**
* METHOD TO GET THE MESSAGE SUBJECT
* @return
*/
public String getSubject() {
return _subject;
}
Esto debería funcionar. El siguiente obstáculo que enfrentará será lo que Dshaw menciona a continuación sobre el NetworkonMainthReadException , que se puede solucionar utilizando este POST para no Compruebe el código estricto, pero la mejor opción es usarla asintsk como se discute en este post.
[editar] ¡También tuve un problema con ProGuard! Si ninguno de los anteriores funciona, intente deshabilitar ProGlard para ver si funciona,
Espero que esto ayude.