【发布时间】:2021-01-17 05:18:42
【问题描述】:
我知道有很多教程、问题等,过去几周我一直在努力,但无法弄清楚。
我正在开发一个 Android 应用程序,我想使用我的 gmail 帐户向某个电子邮件地址发送电子邮件。
我已阅读所有 Google Developers 文档并尝试了所有示例,但仍然无法实现。
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 中使用它来获取凭据的解释。
拜托,我知道这些是个大问题,但我迫切需要帮助。请给我任何答案或正确的链接(我还没有访问过......)。我也将感谢通过聊天/邮件等提供的帮助。
谢谢
编辑 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;
}
}
我也不确定:
-
我应该获得哪些凭据?我认为它是
ServiceAccountCredentials,但documentation 说要使用GoogleCredential,它已被弃用,所以我尝试了GoogleCredentials -
我应该使用哪个电子邮件地址作为发件人 - gmail?服务帐户? “我”?有两个地方我应该使用它
-
我应该如何处理令牌?
-
在 Google Api 控制台顶部显示“您的免费试用正在等待:立即激活...” - 我必须激活帐户才能使用 api?我不这么认为,但不确定
【问题讨论】:
-
对不起@user3505444,我不知道。我放弃了使用 Gmail 发送邮件...我使用了另一个 3rd 方
-
这太疯狂了,过去几年的文档看起来像大 0。谷歌正朝着错误的方向前进。等我弄清楚了,我会发布回复。
-
@user3505444 是的,这太疯狂了。如果我们不能指望谷歌,还剩下什么?...祝你好运!!!
标签: android gmail-api credentials