android中使用XOauth的Javamail api [英] Javamail api in android using XOauth

查看:19
本文介绍了android中使用XOauth的Javamail api的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to send an email through my app using say the javamail API (any other mailing service if available will also do). the problem is i do not want to ask the user his username and password.

1) 是否可以将 OAuth 2.0JavaMail API/任何其他邮件 API

1) Is it possible to use OAuth 2.0 with JavaMail API/ any other mail api

2) 如何获取 OAuth Token ??

2) how to get OAuth Token ??

3) 网上是否有示例代码

3) Is there a sample code available on the net

提前致谢.

PS:我从未处理过邮件服务/SMTP 请求.

PS: I have never ever worked with mailing services/SMTP requests.

推荐答案

我对此进行了几天的研究,并找到了目前对我有用的解决方案.我从 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/trunk/java/com/google/code/samples/xoauth/XoauthAuthenticator.java

I researched this for some days and I found a solution that is working for me at the moment. I get the oauth2 token from the android AccountManager and then send the email via SMTP using JavaMail. The idea is based on the Java example here http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode and on this java Xoauth example here http://google-mail-xoauth-tools.googlecode.com/svn/trunk/java/com/google/code/samples/xoauth/XoauthAuthenticator.java

JavaMail 中没有适用于 Android 的 SASL 实现,并且使用 asmack 也不起作用,所以我没有使用 SASL,而是像上面的 Xoauth 示例一样直接发出命令.

There's no working SASL implementation in JavaMail for Android and using asmack wasn't working so I didn't use SASL and I issued the command directly like in the Xoauth example above.

我像这样从账户经理那里得到令牌

I get the token from the acount manager like this

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 令牌.我在这段代码中使用了令牌

If it works, you have an oauth2 token in token. I use the token in this code

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=%s1auth=Bearer %s11", 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这是我在这里的第一个回答,如果我做错了什么,很抱歉!

I'm not at all an expert in this and I didn't use any Security provider like in the examples above, not sure how it will affect this but it's working for me. Hope this helps and that someone can tell me if there's something wrong with this too :p It's my first answer here so sorry if I did something wrong!

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

Ops, forgot some other documentation I used: https://developers.google.com/google-apps/gmail/xoauth2_protocol and http://developer.android.com/training/id-auth/authenticate.html

再次行动!您还需要清单中的这些权限

ops again! You also need these permissions in the manifest

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

这篇关于android中使用XOauth的Javamail api的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆