使用Gmail API通过Android应用程序发送邮件 [英] Use Gmail api for send mail via Android app

查看:24
本文介绍了使用Gmail API通过Android应用程序发送邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道有很多问题和问题,我在过去的几周里一直在研究,但没有弄清楚。

我正在开发一个Android应用程序,我想使用我的Gmail帐户向某个电子邮件地址发送电子邮件。

我已经阅读了所有Google开发人员文档,并尝试了所有示例,但仍然无法实现。

1.首先-我必须拥有G Suite帐户吗?它没有说我有,但Gmail Api overview在G Suite部分下??

如果我不需要G套件-

2.这是通过应用程序发送邮件的right guide吗?

如果是

3.如何获取Gmail service?我在console.developers.google中打开了一个项目,获得了OAuth 2.0 Client IDsjson文件,但我找不到如何在Android中使用它来获取凭据的说明。

拜托,我知道这是个大问题,但我迫切需要帮助。请给我任何答案或正确的链接(我还没有访问...)。我也会通过聊天/邮件等方式感谢帮助。

谢谢

编辑8/10 我现在的代码:

主要活动 调用AsyncMail

AsyncMail.java

package com.send.mymailapplication;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.AsyncTask;

import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.Base64;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.Message;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.collect.Lists;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;



public class AsyncMail extends AsyncTask<String, Void, Void> {

    Context context;

    static HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
    static JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    public AsyncMail (Context c) {
        context = c;
    }


    @Override
    protected Void doInBackground (String... strings) {


        try {

            AssetManager assetManager = context.getAssets();
            InputStream jsonStream = assetManager.open("mail.json");

            // those 2 tryings also works but gave me the same error
            /*ServiceAccountCredentials sourceCredentials = ServiceAccountCredentials.fromStream(jsonStream);
            sourceCredentials = (ServiceAccountCredentials) sourceCredentials.createScoped(Arrays.asList("https://mail.google.com/", "https://www.googleapis.com/auth/iam"));

            GoogleCredential credential = GoogleCredential.fromStream(jsonStream).createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform", GmailScopes.MAIL_GOOGLE_COM));
            Gmail gmail = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();*/


            GoogleCredentials credential = GoogleCredentials.fromStream(jsonStream)
                           .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/dialogflow", GmailScopes.MAIL_GOOGLE_COM));
            credential.refreshIfExpired();
            AccessToken accessToken = credential.getAccessToken ();
            String AuthToken = accessToken.getTokenValue ();


            HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter (credential);


            Gmail gmail = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer).build();

            MimeMessage mimeMessage = createEmail ("avitalh@gmail.com", "sendmail@mail-291708.iam.gserviceaccount.com", "subbb", "bodyyyy");

            Message message = createMessageWithEmail(mimeMessage);

            gmail.users().messages().send ("sendmail@mail-291708.iam.gserviceaccount.com", message).execute();


        } catch (IOException | MessagingException e) {
            e.printStackTrace ();
        }
        
        return null;
    }

    private Message createMessageWithEmail (MimeMessage emailContent) throws IOException, MessagingException {

        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        emailContent.writeTo(buffer);
        byte[] bytes = buffer.toByteArray();
        String encodedEmail = Base64.encodeBase64URLSafeString(bytes);
        Message message = new Message ();
        message.setRaw(encodedEmail);
        return message;
    }

    public static MimeMessage createEmail(String to, String from, String subject, String bodyText) throws MessagingException {

        Properties props = new Properties ();
        Session session = Session.getDefaultInstance(props, null);

        MimeMessage email = new MimeMessage(session);

        email.setFrom(new InternetAddress (from));
        email.addRecipient(javax.mail.Message.RecipientType.TO,
                new InternetAddress(to));
        email.setSubject(subject);
        email.setText(bodyText);
        return email;
    }
}

我也不确定:

  1. 我应该获得哪些凭据?我会认为它是ServiceAccountCredentials,但documentation说要使用GoogleCredential,这是不推荐使用的,所以我尝试了GoogleCredentials

  2. 我应该使用哪个电子邮件地址作为发件人-Gmail?服务账户?我和我?有两个地方我应该用它

  3. 我应该如何处理令牌?

  4. Google Api控制台顶部显示:您的免费试用正在等待:立即激活...&p>-我必须激活帐户才能使用API?我不这么认为,但也不确定

推荐答案

我会尝试回答您的多个问题

  1. ,您不需要G Suite帐户即可使用Gmail API,您可以使用普通Gmail帐户进行操作。

  2. 您链接的指南很好,只是考虑到在应用程序内部或在控制台中,API使用REST架构处理HTTPS请求,因此您可以在任何支持HTTP请求的平台上使用API。

  3. 最后一点将在很大程度上取决于您正在使用的体系结构,并考虑到我不是Android专家。但困难的部分将是获得用户的授权,但我相信您可以使用Java正常完成此操作。

有用链接

这篇关于使用Gmail API通过Android应用程序发送邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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