问题描述
我知道有很多宴会,问题等,过去几周我一直在研究,但无法解决。
我正在开发一个Android应用,我想使用我的gmail帐户将电子邮件发送到某些电子邮件地址。
我已经阅读了所有Google Developers Documentation,并尝试了所有示例,但仍然无法实现。
1。首先-我必须拥有一个G Suite帐户吗?它不是说我愿意,但是Gmail Api overview在G Suite部分下?
如果我不需要G Suite-
2。。这是通过应用程序发送邮件的right guide吗?
如果是
3。。如何获得Gmail service
?我在console.developers.google
中打开了一个项目,并得到了OAuth 2.0 Client IDs
json文件,但找不到如何在Android中使用它来获取证书的说明。
拜托,我知道这是个大问题,但我非常渴望获得帮助。请给我任何答案或正确的链接(我还没有访问...)。我还将感谢您通过聊天/邮件等获得的帮助。
谢谢
主要活动 呼叫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,requestinitializer).build();
MimeMessage mimeMessage = createEmail ("[email protected]","[email protected]","subbb","bodyyyy");
Message message = createMessageWithEmail(mimeMessage);
gmail.users().messages().send ("[email protected]",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;
}
}
我也不确定:
-
我应该获得哪个证书?我认为它是
ServiceAccountCredentials
,但是documentation表示使用已弃用的GoogleCredential
,所以我尝试了GoogleCredentials
-
我应该使用哪个电子邮件地址作为发件人-gmail?服务帐户? “我”?我应该在2个地方使用它
-
我应该如何处理令牌?
-
在Google Api控制台的顶部显示“您的免费试用版正在等待:正在激活...”-我必须激活该帐户才能使用api吗?我不这么认为,但不确定
解决方法
我将尝试回答您的多个问题
-
否,您不需要G Suite帐户即可使用Gmail API,可以使用普通的 gmail 帐户进行操作。
-
您链接的指南很好,只需认为在应用程序或控制台中,API即可通过REST体系结构处理HTTP请求,因此您可以在支持HTTP请求的任何平台中使用该API。
-
最后一点将在很大程度上取决于您使用的架构,并考虑到我不是Android专家。但是“困难”部分将是从用户那里获得授权,但是我相信您可以使用Java正常地完成它。