在android中使用XOauth的Javamail API

我需要发送一封电子邮件通过我的应用程序使用说的javamail API (任何其他邮件服务,如果可用也将)。 问题是我不想问用户他的usernamepassword

1)是否有可能使用JavaMail API /任何其他邮件API的OAuth 2.0

2)如何获得OAuth令牌?

3)网上是否有示例代码

提前致谢。

PS:我从来没有使用邮件服务/ SMTP请求。

我研究了几天,我发现了一个解决scheme,目前正在为我工​​作。 我从android AccountManager获取oauth2标记,然后使用JavaMail通过SMTP发送电子邮件。 这个想法是基于这里的Java示例http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode和这个java Xoauth例子在这里http:// google-mail-xoauth-tools .googlecode.com / SVN /中继/爪哇/ COM /谷歌/代码/样品/ XOAUTH / XoauthAuthenticator.java

在JavaMail for Android中没有SASL实现,并且使用asmack没有工作,所以我没有使用SASL,并且像上面的Xoauth例子那样直接发布了命令。

我从这个帐户经理那里得到这个令牌

 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<Bundle>{ @Override public void run(AccountManagerFuture<Bundle> result){ try{ Bundle bundle = result.getResult(); token = bundle.getString(AccountManager.KEY_AUTHTOKEN); } catch (Exception e){ Log.d("test", e.getMessage()); } } } 

如果有效,你在令牌中有一个oauth2令牌。 我在这个代码中使用了这个标记

 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()); } } 

我根本就不是这方面的专家,也没有像上面的例子那样使用任何安全提供者,不确定它会如何影响这个,但是它对我有用。 希望这有帮助,有人可以告诉我这是否也有问题:p这是我的第一个答案,如果我做错了,我很抱歉!

Ops,忘记了我使用的一些其他文档: https : //developers.google.com/google-apps/gmail/xoauth2_protocol和http://developer.android.com/training/id-auth/authenticate.html

再次运行! 清单中还需要这些权限

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />