web-dev-qa-db-ja.com

Gmailで完全なメッセージ本文を取得するにはどうすればよいですか?

メッセージ本文をすべて取得したい。だから私は試してみます:

Message gmailMessage = service.users().messages().get("me", messageId).setFormat("full").execute();

体を得るために、私は試してみます:

gmailMessage.getPayload().getBody().getData()

ただし、常にnullになります。完全なメッセージ本文を取得するにはどうすればよいですか?

15
somebody

(本文だけでなく)完全な本文メッセージを解決する方法をもっと興味深い方法で見つけました:

System.out.println(StringUtils.newStringUtf8(   Base64.decodeBase64 (message.getRaw())));
6

Message.getPayload()。getBody()。getParts()は常にnullだったので、この方法を試しました

import com.google.api.client.repackaged.org.Apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.Apache.commons.codec.binary.StringUtils;

(...)

Message message = service.users().messages().get(user, m.getId()).execute();
MessagePart part = message.getPayload();
System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(part.getBody().getData())));

そして結果は純粋なHTML文字列です

6
Hinotori

GmailMessageからデータを取得するには、gmailMessage.payload.parts [0] .body.dataを使用できます。読み取り可能なテキストにデコードする場合は、次の操作を実行できます。

import org.Apache.commons.codec.binary.Base64;
import org.Apache.commons.codec.binary.StringUtils;

System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(gmailMessage.payload.parts[0].body.data)));
5
Tholle

メール本文のコンテンツを読み取るためのc#コードgmail API v1のソリューションは次のとおりです。

  var request = _gmailService.Users.Messages.Get("me", mail.Id);
                request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Full;

データエラーを解決する

 var res = message.Payload.Body.Data.Replace("-", "+").Replace("_", "/");
 byte[] bodyBytes = Convert.FromBase64String(res);


 string val = Encoding.UTF8.GetString(bodyBytes);
2
Tal Avissar

メッセージ(com.google.api.services.gmail.model.Message)がある場合は、次のメソッドを使用できます。

public String getContent(Message message) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
        getPlainTextFromMessageParts(message.getPayload().getParts(), stringBuilder);
        byte[] bodyBytes = Base64.decodeBase64(stringBuilder.toString());
        String text = new String(bodyBytes, StandardCharsets.UTF_8);
        return text;
    } catch (UnsupportedEncodingException e) {
        logger.error("UnsupportedEncoding: " + e.toString());
        return message.getSnippet();
    }
}

private void getPlainTextFromMessageParts(List<MessagePart> messageParts, StringBuilder stringBuilder) {
    for (MessagePart messagePart : messageParts) {
        if (messagePart.getMimeType().equals("text/plain")) {
            stringBuilder.append(messagePart.getBody().getData());
        }

        if (messagePart.getParts() != null) {
            getPlainTextFromMessageParts(messagePart.getParts(), stringBuilder);
        }
    }
}

すべてのメッセージ部分をmimeType "text/plain"と組み合わせて、1つの文字列として返します。

2
Gerard Verbeek

@Tholleコメントに基づいて、私はそのようなものを作りました

Message message = service.users().messages()
        .get(user, messageHolder.getId()).execute();

System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(
        message.getPayload().getParts().get(0).getBody().getData())));
0
Tomasz TJ

完全なメッセージを受け取ったとき。メッセージの本文はパーツの中にあります。

これは、メッセージヘッダー(日付、差出人、宛先、件名)が表示され、プレーンテキストのメッセージ本文が表示される例です。ペイロードのパーツは、両方のタイプのメッセージ(プレーンテキストとフォーマットされたテキスト)を返します。平文に興味がありました。

Message msg = service.users().messages().get(user, message.getId()).setFormat("full").execute();
// Displaying Message Header Information
for (MessagePartHeader header : msg.getPayload().getHeaders()) {
  if (header.getName().contains("Date") || header.getName().contains("From") || header.getName().contains("To")
      || header.getName().contains("Subject"))
    System.out.println(header.getName() + ":" + header.getValue());
}
// Displaying Message Body as a Plain Text
for (MessagePart msgPart : msg.getPayload().getParts()) {
  if (msgPart.getMimeType().contains("text/plain"))
    System.out.println(new String(Base64.decodeBase64(msgPart.getBody().getData())));
}
0
Zaheer