Api de Javamail en Android usando XOauth

Necesito enviar un correo electrónico a través de mi aplicación usando decir la javamail API (cualquier otro servicio de correo si está disponible también lo hará). el problema es que no quiero preguntarle al usuario su username y password .

1) ¿Es posible usar OAuth 2.0 con JavaMail API / cualquier otra aplicación de correo

2) ¿cómo obtener Token OAuth?

3) ¿Hay un código de muestra disponible en la red?

Gracias por adelantado.

PD: nunca he trabajado con servicios de correo / solicitudes SMTP.

Investigué esto durante algunos días y encontré una solución que me funciona en este momento. Obtengo el token oauth2 del gestor de cuentas android y luego envío el correo electrónico a través de SMTP usando JavaMail. La idea se basa en el ejemplo de Java aquí http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode y en este ejemplo de java Xoauth aquí http: // google-mail-xoauth-tools .googlecode.com / svn / trunk / java / com / google / code / samples / xoauth / XoauthAuthenticator.java

No hay una implementación de SASL en funcionamiento en JavaMail para Android y el uso de asmack no funcionaba, por lo que no usé SASL y emití el comando directamente como en el ejemplo anterior de Xoauth.

Recibo el token del administrador de cuentas como este

 AccountManager am = AccountManager.get(this); Account me = ...; //You need to get a google account on the device, it changes if you have more than one am.getAuthToken(me, "oauth2:https://mail.google.com/", null, this, new OnTokenAcquired(), null); private class OnTokenAcquired implements AccountManagerCallback{ @Override public void run(AccountManagerFuture result){ try{ Bundle bundle = result.getResult(); token = bundle.getString(AccountManager.KEY_AUTHTOKEN); } catch (Exception e){ Log.d("test", e.getMessage()); } } } 

Si funciona, tienes un token oauth2 en token. Yo uso el token en este código

 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.Provider; import java.security.Security; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.Message; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import android.util.Log; import com.sun.mail.smtp.SMTPTransport; import com.sun.mail.util.BASE64EncoderStream; public class GMailOauthSender { private Session session; public SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) throws Exception { Properties props = new Properties(); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.starttls.required", "true"); props.put("mail.smtp.sasl.enable", "false"); session = Session.getInstance(props); session.setDebug(debug); final URLName unusedUrlName = null; SMTPTransport transport = new SMTPTransport(session, unusedUrlName); // If the password is non-null, SMTP tries to do AUTH LOGIN. final String emptyPassword = null; transport.connect(host, port, userEmail, emptyPassword); byte[] response = String.format("user=%s\1auth=Bearer %s\1\1", userEmail, oauthToken).getBytes(); response = BASE64EncoderStream.encode(response); transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235); return transport; } public synchronized void sendMail(String subject, String body, String user, String oauthToken, String recipients) { try { SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com", 587, user, oauthToken, true); MimeMessage message = new MimeMessage(session); DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); message.setSender(new InternetAddress(user)); message.setSubject(subject); message.setDataHandler(handler); if (recipients.indexOf(',') > 0) message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); else message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); smtpTransport.sendMessage(message, message.getAllRecipients()); } catch (Exception e) { Log.d("test", e.getMessage()); } } 

No soy en absoluto un experto en esto y no utilicé ningún proveedor de seguridad como en los ejemplos anteriores, no estoy seguro de cómo afectará esto, pero está funcionando para mí. Espero que esto ayude y que alguien pueda decirme si hay algo mal con esto también: p Es mi primera respuesta aquí, ¡lo siento si hice algo mal!

Ops, olvidé otra documentación que utilicé: https://developers.google.com/google-apps/gmail/xoauth2_protocol y http://developer.android.com/training/id-auth/authenticate.html

¡Ops otra vez! También necesita estos permisos en el manifiesto