尝试在 Java 中使用 Gmail API 发送电子邮件时出错

Posted

技术标签:

【中文标题】尝试在 Java 中使用 Gmail API 发送电子邮件时出错【英文标题】:Error when trying to send an email using Gmail API in Java 【发布时间】:2016-11-30 15:26:23 【问题描述】:

我想使用 Gmail API(不是 JavaMail)发送电子邮件。我在论坛上阅读了许多类似的主题,但我仍然有一个问题。

首先我读到这个:https://developers.google.com/gmail/api/guides/sending

我实现了方法:MimeMessage createEmail、Message createMessageWithEmail 和 Message sendMessage

然后我注意到我没有对象Gmail服务的定义,所以我需要一个GmailQuickstart类,它在这里:https://developers.google.com/gmail/api/quickstart/java

我实现了:GmailQuickstart 类、Credential authorize() 方法和 Gmail getGmailService() 方法

最后我写了一个主要的:

public static void main(final String[] args) throws MessagingException, IOException 
    String APPLICATION_NAME = "gmailProject";
    HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
    JsonFactory JSON_FACTORY = new JacksonFactory();
    Credential credential = GmailQuickstart.authorize();

    String to = "frommail@gmail.com";
    String from = "tomail@gmail.com";
    String subject = "Subject";
    String bodyText = "Body";
    MimeMessage emailcontent = createEmail(to, from, subject, bodyText);
    createMessageWithEmail(emailcontent);
    Gmail service = new com.google.api.services.gmail.Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME).build();
    sendMessage(service, "me", emailcontent);

在这之后我有一长串错误:

Exception in thread "main"com.google.api.client.googleapis. json.GoogleJsonResponseException: 403 Forbidden

  "code" : 403,
  "errors" : [ 
  "domain" : "global",
  "message" : "Insufficient Permission",
  "reason" : "insufficientPermissions"
 ],
"message" : "Insufficient Permission"

    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJs nResponseException.java:146)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
    at org.actuarlib.outsourcing.mail.Mail.sendMessage(Mail.java:78)
    at org.actuarlib.outsourcing.mail.Mail.main(Mail.java:195)

我知道堆栈上有很多关于类似错误的主题,但我不知道如何纠正它。 任何人都可以告诉我出了什么问题,或者您知道使用 Gmail API 发送电子邮件的另一种方式吗?

【问题讨论】:

您在哪里提供了授权凭据 (client_secret.json)?该错误表明您的凭据丢失或无效。 这个文件在我上课的同一个文件夹中 【参考方案1】:

问题是你授权的权限不够。这行代码就是问题所在:

private static final List<String> SCOPES =
        Arrays.asList(GmailScopes.GMAIL_LABELS);

如果你查看listing labels 的引用,你会看到https://www.googleapis.com/auth/gmail.labels 的权限就足够了。

但这对于sending messages 来说是不够的。您可以在开发时更改您的 SCOPES 以包含 https://mail.google.com/,直到您确切知道您需要什么权限:

private static final List<String> SCOPES =
        Arrays.asList(GmailScopes.MAIL_GOOGLE_COM);

【讨论】:

我改了你写的那行,但我还是有同样的错误。 确保删除存储的凭据,因为这些凭据仍会使用错误的范围。 非常感谢! @Yster 没问题 :) 乐于助人。

以上是关于尝试在 Java 中使用 Gmail API 发送电子邮件时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用Postman测试发送Gmail API端点

电子邮件正文在文件中发送 [Gmail API, Node.js]

使用 Gmail API 发送大附件

使用 Java 的 API 将已删除的消息插入到 gmail

当我尝试使用我的 Google 服务帐户通过 Gmail API 发送电子邮件时,“myemail@mydomain.com”的委派被拒绝

在 Javascript 中使用 GMAIL API 发送带有附件文件(超过 10 MB)的电子邮件