使用Gmail api通过Android应用发送邮件

使用Gmail api通过Android应用发送邮件,android,gmail-api,credentials,Android,Gmail Api,Credentials,我知道有很多疑问,问题等等,在过去的几周里我一直在研究,但没能弄清楚 我正在开发一个Android应用程序,我想用我的gmail帐户向某个电子邮件地址发送电子邮件 我已经阅读了所有的谷歌开发者文档,并尝试了所有的例子,但仍然无法实现 1。首先-我必须拥有一个G套件帐户吗?它并没有说我喜欢,但它在G套件部分下 如果我不需要G套房- 2.这是通过应用程序发送邮件的最佳方式吗 如果是的话 3.如何获得Gmail服务?我在console.developers.google中打开了一个项目,得到了OAut

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

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

我已经阅读了所有的谷歌开发者文档,并尝试了所有的例子,但仍然无法实现

1。首先-我必须拥有一个G套件帐户吗?它并没有说我喜欢,但它在G套件部分下

如果我不需要G套房-

2.这是通过应用程序发送邮件的最佳方式吗

如果是的话

3.如何获得
Gmail服务
?我在
console.developers.google
中打开了一个项目,得到了
OAuth 2.0客户端ID
json文件,但我找不到如何在Android中使用它来获得证书的解释

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

谢谢

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

主要活动 呼叫异步邮件

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

package com.send.mymailapplication;
导入android.content.Context;
导入android.content.res.AssetManager;
导入android.os.AsyncTask;
导入com.google.api.client.extensions.android.http.AndroidHttp;
导入com.google.api.client.http.HttpRequestInitializer;
导入com.google.api.client.http.HttpTransport;
导入com.google.api.client.json.JsonFactory;
导入com.google.api.client.json.jackson2.JacksonFactory;
导入com.google.api.client.util.Base64;
导入com.google.api.services.gmail.gmail;
导入com.google.api.services.gmail.GmailScopes;
导入com.google.api.services.gmail.model.Message;
导入com.google.auth.http.HttpCredentialsAdapter;
导入com.google.auth.oauth2.AccessToken;
导入com.google.auth.oauth2.GoogleCredentials;
导入com.google.common.collect.list;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.Collections;
导入java.util.Properties;
导入javax.mail.MessaginException;
导入javax.mail.Session;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.mimessage;
公共类AsyncMail扩展了AsyncTask{
语境;
静态HttpTransport HTTP_TRANSPORT=AndroidHttp.newCompatibleTransport();
静态JsonFactory JSON_FACTORY=JacksonFactory.getDefaultInstance();
公共异步邮件(上下文c){
上下文=c;
}
@凌驾
受保护的Void doInBackground(字符串…字符串){
试一试{
AssetManager AssetManager=context.getAssets();
InputStream jsonStream=assetManager.open(“mail.json”);
//这两次尝试同样有效,但给了我同样的错误
/*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_传输,JSON_工厂,凭证).build()*/
GoogleCredentials credential=GoogleCredentials.fromStream(jsonStream)
.createScope(列表.newArrayList(“https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/dialogflow“,GmailScopes.MAIL_GOOGLE_COM));
credential.refreshIfExpired();
AccessToken AccessToken=credential.getAccessToken();
字符串AuthToken=accessToken.getTokenValue();
HttpRequestInitializer requestInitializer=新的HttpCredentialsAdapter(凭证);
Gmail Gmail=new Gmail.Builder(HTTP_传输,JSON_工厂,requestInitializer).build();
MimeMessage MimeMessage=createEmail(“avitalh@gmail.com", "sendmail@mail-291708.iam.gserviceaccount.com、“subbb”、“bodyyyy”);
Message Message=createMessageWithEmail(mimessage);
gmail.users().messages().send(“sendmail@mail-291708.iam.gserviceaccount.com”,message).execute();
}捕获(IOException | MessaginException e){
e、 printStackTrace();
}
返回null;
}
私有消息createMessageWithEmail(MimeMessage emailContent)引发IOException、MessaginException{
ByteArrayOutputStream缓冲区=新建ByteArrayOutputStream();
emailContent.writeTo(缓冲区);
byte[]bytes=buffer.toByteArray();
String encodedEmail=Base64.encodeBase64URLSafeString(字节);
消息消息=新消息();
message.setRaw(encodedmail);
返回消息;
}
publicstaticmimessage createEmail(stringto、stringfrom、stringsubject、stringbodytext)抛出消息异常{
Properties props=新属性();
Session Session=Session.getDefaultInstance(props,null);
MimeMessage email=新MimeMessage(会话);
email.setFrom(新互联网地址(from));
email.addRecipient(javax.mail.Message.RecipientType.TO,
新互联网地址(至);;
email.setSubject(主题);
email.setText(bodyText);
回复邮件;
}
}
我也不确定:

  • 我应该获得哪些证书?我认为这是
    ServiceAccountCredentials
    ,但它说要使用
    GoogleCredential
    ,这是不推荐的,所以我尝试了
    GoogleCredentials

  • 我应该使用哪个电子邮件地址作为发件人-gmail?服务帐户?“我”?有两个地方是我喜欢的