본문 바로가기
Programming/Java_Spring

Gmail API 메일 본문 내용 가져오기.

by 곰네Zip 2022. 9. 20.

Google API를 사용하여 GMail의 목록을 가져올 수 있다. 그런데.. 목록뿐만 아니라 메시지 본문도 가져올수 있다.

Message는 MessagePart로 구성되어있다. 그리고 각 MessagePart에는 Header가 있고, 그 헤더를 통해 MIME타입을 가져와서 읽으면 된다.

public void MyFunction(...){
	...
    List<String> contents = new ArrayList();
    List<MessagePart> parts = myMessage.getPayload().getParts();
    readMessagePart( parts, contents, "text/html");
    if( contents.isEmpty()){
    	readMessagePart(parts, contents, "text/plain");
    }
}

public void readMessagePart(List<MessagePart> parts, List<String> contents, String mimeType){
	for(MessagePart part : parts){
    	if( part.getMimeType().equals(mimeType)){
        	byte[] decodeByte = Base64.getUrlDecoder().decode(part.getBody().getData());
            content.add(new String(decodeByte));
        }
    	if( part.getParts() != null){
        	readMessagePart(part.getParts(), contents, mimeType);
        }
    }
}

 위와 같이 작성하면.. 원하는 mimetype의 텍스트를 가져올 수 있다. text만 필요하면 mimetype을 text/plain으로.. html형태로 받아오고싶으면 text/html로 가져올 수 있다.

 저기서 보면, part의 하위 part가 있으면 다시 읽어오도록 해 두었는데, 많은 메시지들은 MIME이 multipart/alternative ( text/plain, text/html등이 있음) 이지만, multipart/related로 되어있고, getPart를 하면 multipart/alternative인  MIME을 가진 메시지 파트가 있고, 해당 파트의 child를 탐색해야 원하는 부분을 가져올 수 있는 메시지가 있다. 이런 경우를 대비해서 저렇게 만들었다.

 그리고, new String(Byte)로 했을 때, charset이 안맞으면.. 텍스트가 다 깨진다. (당연히...)

 이 charset은 MessagePartHeader에 포함되어있다. 헤더 중, 이름이 Content-Type인 헤더를 찾아서 그 안에 저장된 charset을 가져오면 된다.

List<MessagePartHeader> headers = part.getHeaders();
for(MessagePartHeader header : headers){
	if( header.getName().equalsIgnoreCase( "content-type")){
    	String[] headerContents = header.getValue().split(";");
        for(String headerContent : headerContents){
        	if( headerContent.contains("charset=")){
            	String charSetVal = headerContent.replace("charset=").replace("\"", "").trim();
            }
        }
    }
}

 뭐.. 대충 저렇게 접근하면 정보를 얻어갈 수 있다.

반응형

댓글