1

Gmail Java API を使用してメールを送信しようとしています。次のエラーが発生しています。

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(GoogleJsonResponseException.java:145)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:111)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:38)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:314)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1060)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)
    at GMailLibrary.SendEmail.sendMessage(SendEmail.java:32)
    at GMailLibrary.GMailAuthentication.main(GMailAuthentication.java:85)
Java Result: 1

認証コードを使用して認証部分を実行しました。以下は、電子メールを送信するための私のコードです。

public class SendEmail 
{
      public static void sendMessage(Gmail service, String userId, MimeMessage email)throws MessagingException, IOException 
      {
            Message message = createMessageWithEmail(email);
            message = service.users().messages().send(userId, message).execute();

            System.out.println("Message id: " + message.getId());
            System.out.println(message.toPrettyString());
      }

      public static Message createMessageWithEmail(MimeMessage email)throws MessagingException, IOException 
      {
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            email.writeTo(bytes);
            String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray());
            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);
            //InternetAddress tAddress = new InternetAddress(to);
            //InternetAddress fAddress = new InternetAddress(from);

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

            return email;
      }

      public static MimeMessage createEmailWithAttachment(String to, String from, String subject,String bodyText, String fileDir, String filename) throws MessagingException, IOException 
      {
            Properties props = new Properties();
            Session session = Session.getDefaultInstance(props, null);

            MimeMessage email = new MimeMessage(session);
            InternetAddress tAddress = new InternetAddress(to);
            InternetAddress fAddress = new InternetAddress(from);

            email.setFrom(fAddress);
            email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress);
            email.setSubject(subject);

            MimeBodyPart mimeBodyPart = new MimeBodyPart();
            mimeBodyPart.setContent(bodyText, "text/plain");
            mimeBodyPart.setHeader("Content-Type", "text/plain; charset=\"UTF-8\"");

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(mimeBodyPart);

            mimeBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(fileDir + filename);

            mimeBodyPart.setDataHandler(new DataHandler(source));
            mimeBodyPart.setFileName(filename);
            String contentType = Files.probeContentType(FileSystems.getDefault()
                .getPath(fileDir, filename));
            mimeBodyPart.setHeader("Content-Type", contentType + "; name=\"" + filename + "\"");
            mimeBodyPart.setHeader("Content-Transfer-Encoding", "base64");

            multipart.addBodyPart(mimeBodyPart);

            email.setContent(multipart);

            return email;
      }
}

必要な情報を渡して、メイン クラスから SendMail メソッドを呼び出しています。

MimeMessage email = SendEmail.createEmail(to, from, subject, bodytext); 
SendEmail.sendMessage(service, USER, email);

私を助けてください。私はすでに最善を尽くしました。さらに情報が必要な場合はお知らせください。

4

4 に答える 4

5

メッセージの一覧表示にも同じ問題がありました。~/.credentials/gmail-api-quickstar の「StoredCredential」を削除しようとしましたが、役に立ちませんでした。必要なのは、「GmailScopes」を完全なアクセス許可に対応する MAIL_GOOGLE_COM に設定することです。

 /** Global instance of the scopes required by this quickstart. */
private static final List<String> SCOPES =
        Arrays.asList(GmailScopes.MAIL_GOOGLE_COM);
于 2015-12-08T17:06:14.577 に答える
4

私の問題は、リスト ラベルで動作する Google のサンプルを取得してから、作成用のスコープを追加したことですが、~/.credentials/gmail-api-quickstart で認証を削除してから再度実行するまで機能しませんでした。ブラウザを開き、今度は作成権限で再認証しました。

于 2015-09-25T11:14:14.207 に答える
2

質問で提供した情報から判断すると、メッセージを送信するためのアクセス許可が必要なため、アクセス許可を正しく設定していないと思いCreateます。次の方法で、権限を正しく設定できます。

    CLIENT_SECRET_FILE = 'your client secret.json'
    OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.compose'
    STORAGE = Storage('gmail.storage')
    flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
    http = httplib2.Http()
    credentials = STORAGE.get()
    if credentials is None or credentials.invalid:
        credentials = run(flow, STORAGE, http=http)
    http = credentials.authorize(http)
    gmail_service = build('gmail', 'v1', http=http)

これは、gmail API をセットアップする方法です (ただし、API 経由でメールを送信しないため、別の権限があります)。セットアップを含めるように質問を更新できる場合は、喜んで回答を更新します。

于 2014-08-07T16:19:42.493 に答える