【问题标题】:Why is Gmaill API returning null when I try to get the raw mail?为什么当我尝试获取原始邮件时 Gmaill API 返回 null?
【发布时间】:2021-10-10 21:26:51
【问题描述】:

我已经编写了这段代码来将 Message(Gmail API) 转换为 MimeMessage(Javax.internet)

public static MimeMessage createMimeFromMessage(Session mailSession, Message message)throws Exception{
        String raw=message.getRaw();
        byte[] decodedEmail=Base64.decodeBase64(raw);
        InputStream emailInputStream=new ByteArrayInputStream(decodedEmail);
        MimeMessage mimeMessage=new MimeMessage(mailSession,emailInputStream);
        return mimeMessage;
    }

这里 getRaw() 返回 null。我正在使用以下方式收到消息-

public static List<Message> listMessagesMatchingQuery(Gmail service, String userId,
      String query) throws IOException {
    ListMessagesResponse response = service.users().messages().list(userId).setQ(query).execute();

    List<Message> messages = new ArrayList<Message>();
    while (response.getMessages() != null) {
      messages.addAll(response.getMessages());
      if (response.getNextPageToken() != null) {
        String pageToken = response.getNextPageToken();
        response = service.users().messages().list(userId).setQ(query)
            .setPageToken(pageToken).execute();
      } else {
        break;
      }
    }

    return messages;
  }

这是基于谷歌网站上的逆向工程代码(https://developers.google.com/gmail/api/guides/sending)-

public static Message createMessageWithEmail(MimeMessage emailContent)
            throws MessagingException, IOException {
        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;
    }

最终目标是将 Message 转换为 MimeMessage。我可以将 eml 文件转换为 MimeMessage 类型而不会出错,但我不确定为什么会出错。 谢谢!

【问题讨论】:

  • 您是否实施了任何日志以查看您的代码在什么时候的行为与预期不同?
  • 就像我说的......它根据查询检索消息。每条消息的大小为 2,带有 id 和线程 id,并带有用于扩展字段的选项,该字段显示更多我无法理解的数字。我可以打印 id,获取附件名称。在 listMessageMatchingQuery 调用之后,它立即转到 createMimeforMessage ,它为 getraw 返回 null

标签: java email gmail-api mime-message


【解决方案1】:

messages().list 只返回带有 id 和 threadId 的消息列表。然后您需要使用service.users().messages().get(userId, messageId) 来恢复消息。如果你去他们的 API explorer,有一个设置格式的选项。您需要选择“原始”,从而做出声明-

service.users().messages().get(userId, messageId).setFormat("raw").execute()

获取原始消息。

此外,要获取内容和附件,您需要执行以下操作-

try{
            mimeParser = new MimeMessageParser(GmailApiUtils.createMimeFromMessage(mailSession,message));
            mimeParser.parse();
            System.out.println("From: "+mimeParser.getFrom());
            System.out.println("Content: "+mimeParser.getHtmlContent());
        } catch (Exception e){
            return null;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多